不用HOOK实现倒计时对话框

本文介绍了一种利用多媒体计时器API函数timeSetEvent实现倒计时对话框的方法,此方法能够在模式对话框上动态显示倒计时,且在窗口被拖动时仍能正常运行。程序通过枚举窗口找到对话框和提示文本,然后使用WM_SETTEXT更新时间,时间到则发送WM_CLOSE关闭对话框。由于枚举窗口的操作,该程序只能以P代码形式运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    这里所说的倒计时对话框不是自定义对话框,自定义对话框很简单;也不是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.youkuaiyun.com/chenjl1031/archive/2008/01/09/2032579.aspx)。
    程序首先在TimeSetProc回调中枚举所有顶级窗口和子窗口,找到模式对话框的句柄和对话框提示文本的句柄,然后发送消息WM_SETTEXT动态地更新时间,时间一到发送消息WM_CLOSE关闭该模式对话框,并关闭多媒体计时器对象;如果响应了鼠标按钮,则直接关闭多媒体计时器对象。
    非常遗憾的是,该程序只能编译成P代码才能正常运行。原因是TimeSetProc回调中调用了枚举顶级窗口和子窗口的回调,把这几行删除则可以编译成本地代码运行,但就不能实现该程序的功能了。


标准模块:

 

测试窗体代码:

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值