一个winapi函数

hcman 2000-01-22 01:51:00

请问高手如何用下列函数
FindFirstChangeNotification
FindNextChangeNotification
WaitForSingleObject
触发事件(例如:button1.click)
...全文
237 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
光明山人 2000-01-24
  • 打赏
  • 举报
回复
我要拿分了。hcman请看下面的例子,我运行过的:

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;

type
// 用线程实现,否则你的主程序会一直等
TChangeNotifyThread = class(TThread)
private
FButton: TButton;

protected
procedure Execute; override;
procedure TriggerButton;

public
property Button: TButton read FButton write FButton;

end;


TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
FThread: TChangeNotifyThread;
FShowingMsg: Boolean;

public
{ Public declarations }
end;

var
Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
if not FShowingMsg then
try
FShowingMsg := TRUE; // 这是为了防止重入
MessageBeep( MB_ICONINFORMATION );
Application.BringToFront;
ShowMessage( '文件更新!' );
finally
FShowingMsg := FALSE;
end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
FThread := TChangeNotifyThread.Create( TRUE );
// 参数CreateSuspended为真是为了设置Button属性
FThread.Button := Button1;
FThread.Resume; // 起动
end;

function IsThreadTerminated( Handle: THandle ): Boolean;
var
lwExitCode: LongWord;
begin
GetExitCodeThread( Handle, lwExitCode );
Result := STILL_ACTIVE<>lwExitCode;
end;

procedure WaitForThread( AThread: TThread ); // 这个与上面的函数可以公用出去
begin
if not IsThreadTerminated( AThread.Handle ) then
Application.ProcessMessages; // 如果没有结束,则让应用程序处理消息,如WM_PAINT
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
FThread.Terminate;
WaitForThread( FThread ); // 等待线程结束
FThread.Free;
end;


{ TChangeNotifyThread }

procedure TChangeNotifyThread.Execute;
var
hand: THandle;
begin
// 我们的例子是要监视C盘根目录下文件名是否改变、是否有文件复制和删除
hand := FindFirstChangeNotification( 'c:\', FALSE, // 第一次创建句柄
FILE_NOTIFY_CHANGE_FILE_NAME );
while not Terminated do // 别忘了检测这个属性
begin
if WaitForSingleObject( hand, 2000 )=WAIT_OBJECT_0 then // 等待变化
begin
Synchronize( TriggerButton ); // 调用Button.Click
FindNextChangeNotification( hand ); // 等待下次的变化
end;
end;
FindCloseChangeNotification( hand ); // 关闭句柄
end;


procedure TChangeNotifyThread.TriggerButton;
begin
Button.Click;
end;

end.

// 一个简单例子,你可能还需要加一些修改才能实际用到你的程序中

btw: kxy,关于线程结束的示范我也做在这里了。
barton 2000-01-23
  • 打赏
  • 举报
回复
文件改动与按钮有什么关系?
光明山人 2000-01-22
  • 打赏
  • 举报
回复
触发一个按钮的OnClick最好用Button1.Click
kxy 2000-01-22
  • 打赏
  • 举报
回复
3)例如你的button1的click事件是
procedure TForm1.Button1OnClick(Sender : TObject);
begin
// your code here.
end;
直接调用就可以
procedure DoButtonClick;// your function
begin
Button1OnClick(self);
end;
end;
kxy 2000-01-22
  • 打赏
  • 举报
回复
3)直接调用就可以.
kxy 2000-01-22
  • 打赏
  • 举报
回复
1,2) 我有一个使用FindFirstChangeNotification
FindNextChangeNotification监测文件改变的source
其中也有waitForSIngerObject的使用 e-mail发出
3)
触发事件(例如:button1.click)是何意思?
hcman 2000-01-22
  • 打赏
  • 举报
回复
最好能给一个例子,例如:当c:\下增加文件后触发button1.click事件.
我会给分的,谢谢各位了.

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧