不用HOOK实现倒计时对话框

来源:互联网 发布:淘宝1号店 编辑:程序博客网 时间:2024/05/17 02:47

    这里所说的倒计时对话框不是自定义对话框,自定义对话框很简单;也不是MessageBoxTimeout定时对话框,定时对话框是时间一到自动关闭。所谓倒计时对话框是由系统弹出的MsgBox对话框,是要在对话框上面动态地显示倒计时间,比如:10,9,8,7,6,5,4,3,2,1秒,然后自动关闭。实现的方法是用多媒体计时器API函数timeSetEvent,当模式对话框一弹出,像Timer这样的计时器都将被挂起,所以不能用Timer来实现,但timeSetEvent却可以,该API函数内部实现多线程,当用鼠标按住模式对话框的标题栏拖动对话框窗口时,不会影响回调的执行,不会影响倒计时间运行,也就是不会挂起timeSetEvent使用的回调函数TimeSetProc。从这一点来看,timeSetEvent比高精度频率计数器QueryPerformanceCounter、QueryPerformanceFrequency优越,前者会自动刷新界面,但后者不会(这里有一个例子可以对比:http://blog.csdn.net/chenjl1031/archive/2008/01/09/2032579.aspx)。
    程序首先在TimeSetProc回调中枚举所有顶级窗口和子窗口,找到模式对话框的句柄和对话框提示文本的句柄,然后发送消息WM_SETTEXT动态地更新时间,时间一到发送消息WM_CLOSE关闭该模式对话框,并关闭多媒体计时器对象;如果响应了鼠标按钮,则直接关闭多媒体计时器对象。
    非常遗憾的是,该程序只能编译成P代码才能正常运行。原因是TimeSetProc回调中调用了枚举顶级窗口和子窗口的回调,把这几行删除则可以编译成本地代码运行,但就不能实现该程序的功能了。


标准模块:

 

测试窗体代码:

原创粉丝点击