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

MMRESULT timeSetEvent( UINT uDelay, UINT uResolution, LPTIMECALLBACK lpTimeProc, DWORD dwUser, UINT fuEvent );

参数说明:
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函数。

调用方法:
例子:
SetTimer(hwnd, // handle to main window IDT_TIMER1, // timer identifier 10000, // 10-second interval (TIMERPROC) NULL); // no timer callback <SetTimer(hwnd, // handle to main window IDT_TIMER2, // timer identifier 300000, // five-minute interval (TIMERPROC) NULL); // no timer callback
举个实例说明一下:
该实例的运行效果:

代码单元:

unit TestUnt; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, MMSystem; //引用MMSystem单元 type TTestFrm = class(TForm) btn_Start: TButton; btn_Stop: TButton; lbl_Hint: TLabel; lbl_Count: TLabel; procedure btn_StartClick(Sender: TObject); procedure btn_StopClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var TestFrm : TTestFrm; implementation {$R *.dfm} var timeid: Cardinal; iCount: Integer = 0; procedure MyCallBack(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD) stdcall; //要回调的过程,由于是引用MMsystem中声明timeSetEvent函数,过程按这样定义 begin //数字每秒加一,与可视控件(如窗体的Caption,因为它还要通知Windows任务栏之类的) //之间会有同步的问题,最好用日志存放中变化 //TestFrm.Caption:= IntToStr(iCount); TestFrm.lbl_Count.Caption := IntToStr(iCount); //SaveLog(iCount); //自已定义的一个日志存储过程 Inc(iCount); end; procedure TTestFrm.btn_StartClick(Sender: TObject); //按开始按钮,开始计数 begin timeid := timeSetEvent(1000,1,@MyCallBack,0,TIME_PERIODIC); //延时1000ms,循环模式,返回计数器的句柄 end; procedure TTestFrm.btn_StopClick(Sender: TObject); begin timeKillEvent(timeid); //销毁计时器线程,停止计数 iCount := 0; end; end.

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

待续……

转载于:https://www.cnblogs.com/xieyunc/archive/2009/04/29/2793700.html

timeSetEvent的用法(一)相关推荐

  1. c语言中external,static关键字用法

    static用法: 在C中,static主要定义全局静态变量.定义局部静态变量.定义静态函数. 1.定义全局静态变量:在全局变量前面加上关键字static,该全局变量变成了全局静态变量.全局静态变量有 ...

  2. Pandas_transform的用法

    先来看一个实例问题. 如下销售数据中展现了三笔订单,每笔订单买了多种商品,求每种商品销售额占该笔订单总金额的比例.例如第一条数据的最终结果为:235.83 / (235.83+232.32+107.9 ...

  3. Python中yield和yield from的用法

    yield 后面接的是 future 对象 调用方 委托生成器 yield from 直接给出循环后的结果 yield from 委托者和子生成器直接通信 yield from 直接处理stopIte ...

  4. pytorch学习 中 torch.squeeze() 和torch.unsqueeze()的用法

    squeeze的用法主要就是对数据的维度进行压缩或者解压. 先看torch.squeeze() 这个函数主要对数据的维度进行压缩,去掉维数为1的的维度,比如是一行或者一列这种,一个一行三列(1,3)的 ...

  5. python yield 和 yield from用法总结

    #例1. 简单输出斐波那契數列前 N 个数 #缺点:该函数可复用性较差,因为 fab 函数返回 None,其他函数无法获得该函数生成的数列 #要提高 fab 函数的可复用性,最好不要直接打印出数列,而 ...

  6. tf.nn.embedding_lookup()的用法

    函数: tf.nn.embedding_lookup( params, ids, partition_strategy='mod', name=None, validate_indices=True, ...

  7. OpenMP用法大全

    OpenMP基本概念 OpenMP是一种用于共享内存并行系统的多线程程序设计方案,支持的编程语言包括C.C++和Fortran.OpenMP提供了对并行算法的高层抽象描述,特别适合在多核CPU机器上的 ...

  8. Dorado用法与示例

    Dorado用法与示例 dorado用后总结 一.dorado概念 dorado的产品全名是"dorado展现中间件".从产品形态上dorado由两部分组成,第一部分是一个具有AJ ...

  9. TensorFlow用法

    TensorFlow用法 什么是TensorFlow TensorFlow是一个开源软件库,用于使用数据流图进行数值计算.图中的节点表示数学运算,而图的边缘表示流动的多维数据数组(张量).这种灵活的体 ...

最新文章

  1. 95后博士生曹原连发两篇Nature,均为一作,网友:这才是真正的后浪
  2. MIT Molecular Biology 笔记5 转录机制
  3. 将query存进数组 php,thinkphp下通过QueryList获取网站指定数据并封装成数组,存入数据库...
  4. 图解算法学习笔记(一): 算法简介
  5. c语言休眠函数useconds类型,带你了解C语言中的Sleep函数(附代码)
  6. 直白介绍卷积神经网络(CNN)
  7. 【微型计算机原理与接口技术】80X86微处理器发展与内部结构
  8. 阶段5 3.微服务项目【学成在线】_day01 搭建环境 CMS服务端开发_08-CMS需求分析-CMS页面管理需求...
  9. 黑客X档案 2008~2012 NPM、PYPI、DockerHub 备份
  10. Web服务器性能/压力测试工具http_load、webbench、ab、Siege
  11. 几个网络捕获工具的评价
  12. 360路由器外网映射
  13. 效率工具 Snipaste、坚果云、印象笔记
  14. 关于引用的介绍和使用
  15. android 动画 最顶层_【尼康影像学院】使用SnapBridge连接照相机与智能手机(Android安卓系统)...
  16. c语言输出一些好看的图形,[转]好看的图形
  17. ue4 项目模板_Unreal 学习和使用UE4的第二步——创建项目和模板试玩 - 游戏编程 ️...
  18. [每日一氵]求解一阶线性常系数微分方程组
  19. FPGA能做什么?比单片机厉害吗?
  20. 德语的人称代词、物主代词变格宝典

热门文章

  1. Linux中的/ dev / null
  2. python调用c语言函数_从Python调用C函数
  3. android自定义进度条_Android中的自定义进度栏
  4. scala代码示例_Scala异常处理示例
  5. java java se_Java SE 9:不可变列表的工厂方法
  6. 初学者必学教程——JQuery的简介
  7. List数据转Map数据并进行分组排序
  8. 针对不同手机终端扫码安装对应环境APP
  9. (花生壳)向日葵 相关虚拟硬件(驱动)造成 xp 系统无法正常 待机、休眠
  10. 没有躲过的坑--vector使用erase后迭代器变成野指针