timeSetEvent的用法

 

由于想在一个DLL中使用TTimer,想把它做成一个监控程序,然后采用DLL远程注入的方式,把它注入到Explorer.exe或 DLLHOST进程中,妈的,怎么像木马啊#¥#%¥%,其实它就是一个木马,只不过我是用来监控机房管理系统的客户端,如果监控到学生退出了客户端的话,用这个小木马又启动它,而这个监控程序是不能结束的话,可能有人会问那你干吗不直接把客户端注入Explorer.exe中呀?呵呵,问得好!因为 Exe文件Windows是不允许远程注入的(也可能是我不知道做不到……^@^),但是要在DLL中使用TTimer比较烦琐,而且要以Class方式输出(当然不用类也是可以的),不太方便。有没有一种更简单可行的方法达到我的要求呢?于是timeSetEvent出现了。
这是timeSetEvent的原型声明,这一函数包含在MMSystem单元中:

[c++:nogutter] view plain copy print ?
  1. MMRESULT timeSetEvent(
  2. UINT uDelay,
  3. UINT uResolution,
  4. LPTIMECALLBACK lpTimeProc,
  5. DWORD dwUser,
  6. UINT fuEvent
  7. );


参数说明:
uDelay:事件的延时,微妙计,假如该值超出定时器支持的最大最小的延时范围,程序返回一个错误。
uResolution:计时器事件的分辨率,微秒计。分辨率随值的减小而增加。为零时意味着周期事件以最大的精确度发生。为了降低系统的开销,应用程序应选择能满足要求的最大值。
LpTimeProc:回调函数的地址,当单一事件期满或周期事件到达一个周期。假如fuEvent指定了TIME_CALLBACK_SET或 TIME_CALLBACK_EVENT_PULSE标记,lpTimeProc被当作一个事件对象的指针,the event will be set or pulsed upon completion of a single enent or periodically upon completion of periodic events.
dwUser:用户提供的回调数据。
fuEvent:定时器类型,参数可能包含下列值之一。
Value Meaning
TIME_ONESHOT ----One shot 时间发生,一旦经过uDelay毫秒时间.
TIME_PERIODIC ----periodic 每过uDelay 毫秒事件发生一次
也可能是下面的值:
Value Meaning
TIME_CALLBACK_FUNCTION
Call back function 当计时期满,窗口调用lpTimeProc参数指定的函数,为默认值。
TIME_CALLBACK_EVENT_SET
Call back event set 当计时器到期,窗口调用SetEvent函数,通过lpTimeProc参数设置事件指向,( to set the event pointed to by the lpTimeProc parameter),dwUser参数被忽略。
TIME_CALLBACK_EVENT_PULSE
Callback event pulse

返回值:假如调用成功或是其他错误时,为计时器事件返回一个标识符,假如失败或计时器事件为创建,返回值为零,该值也发送给回调函数。
注意:为周期事件调用timeSetEvent函数时要求相应的调用timeKillEvent函数。

调用方法:
例子:
[delphi:nogutter] view plain copy print ?
  1. SetTimer(hwnd, // handle to main window
  2. IDT_TIMER1, // timer identifier
  3. 10000, // 10-second interval
  4. (TIMERPROC) NULL); // no timer callback
  5. <SetTimer(hwnd, // handle to main window
  6. IDT_TIMER2, // timer identifier
  7. 300000, // five-minute interval
  8. (TIMERPROC) NULL); // no timer callback

举个实例说明一下:
该实例的运行效果:
点击在新窗口中浏览此图片

代码单元:

  1. unit TestUnt;
  2. interface
  3. uses
  4. Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  5. Dialogs, StdCtrls, MMSystem; //引用MMSystem单元
  6. type
  7. TTestFrm = class(TForm)
  8. btn_Start: TButton;
  9. btn_Stop: TButton;
  10. lbl_Hint: TLabel;
  11. lbl_Count: TLabel;
  12. procedure btn_StartClick(Sender: TObject);
  13. procedure btn_StopClick(Sender: TObject);
  14. private
  15. { Private declarations }
  16. public
  17. { Public declarations }
  18. end;
  19. var
  20. TestFrm : TTestFrm;
  21. implementation
  22. {$R *.dfm}
  23. var
  24. timeid: Cardinal;
  25. iCount: Integer = 0;
  26. procedure MyCallBack(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall; //要回调的过程,由于是引用MMsystem中声明timeSetEvent函数,过程按这样定义
  27. begin
  28. //数字每秒加一,与可视控件(如窗体的Caption,因为它还要通知Windows任务栏之类的)
  29. //之间会有同步的问题,最好用日志存放中变化
  30. //TestFrm.Caption:= IntToStr(iCount);
  31. TestFrm.lbl_Count.Caption := IntToStr(iCount);
  32. //SaveLog(iCount); //自已定义的一个日志存储过程
  33. Inc(iCount);
  34. end;
  35. procedure TTestFrm.btn_StartClick(Sender: TObject); //按开始按钮,开始计数
  36. begin
  37. timeid := timeSetEvent(1000,1,@MyCallBack,0,TIME_PERIODIC); //延时1000ms,循环模式,返回计数器的句柄
  38. end;
  39. procedure TTestFrm.btn_StopClick(Sender: TObject);
  40. begin
  41. timeKillEvent(timeid); //销毁计时器线程,停止计数
  42. iCount := 0;
  43. end;
  44. end.

那么我们又如何把它应用于DLL中呢?

待续……

 

原文转至http://blog.csdn.net/xieyunc/article/details/4136125

`timeSetEvent` 是一个Windows API函数,用于设置定时器事件。它的原型如下: ```c++ MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD_PTR dwUser, UINT fuEvent ); ``` 其中,`lpTimeProc` 参数是一个指向回调函数的指针,用于处理定时器事件。回调函数的原型如下: ```c++ void CALLBACK TimeProc( UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2 ); ``` 在回调函数中,`uTimerID` 参数是定时器的标识符,`uMsg` 参数是一个预留参数,通常为 `TIME_TICK`,`dwUser` 参数是 `timeSetEvent` 函数调用时传入的 `dwUser` 参数,`dw1` 和 `dw2` 参数是一些保留参数,通常为0。 下面是一个简单的例子,演示如何使用 `timeSetEvent` 函数和回调函数处理定时器事件: ```c++ #include <Windows.h> #include <iostream> void CALLBACK TimeProc(UINT uTimerID, UINT uMsg, DWORD_PTR dwUser, DWORD_PTR dw1, DWORD_PTR dw2) { std::cout << "Timer triggered! Timer ID: " << uTimerID << std::endl; } int main() { /* 设置定时器事件,每隔 1 秒触发一次 */ MMRESULT res = timeSetEvent(1000, 0, TimeProc, 0, TIME_PERIODIC); if (res == 0) { std::cerr << "Failed to set timer event" << std::endl; return 1; } /* 等待定时器触发 */ std::cout << "Waiting for timer..." << std::endl; system("pause"); /* 取消定时器事件 */ res = timeKillEvent(res); if (res == 0) { std::cerr << "Failed to kill timer event" << std::endl; return 1; } std::cout << "Timer event cancelled" << std::endl; return 0; } ``` 这个例子中,我们设置了一个每隔1秒触发一次的定时器事件,并在回调函数 `TimeProc` 中输出一条消息。程序运行后,会输出 "Waiting for timer...",等待定时器事件的触发。当定时器事件被触发时,会输出 "Timer triggered! Timer ID: xxx",其中 xxx 是定时器的标识符。 当我们按下任意键后,程序会取消定时器事件,并输出 "Timer event cancelled"。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值