SetTimer()API函数的问题?

AngusLiu 2004-12-17 05:44:29
const int IDC_TIMER = 1024;

VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, /*UINT_PTR*/UINT idEvent, DWORD dwTime)
{
int kk = 0;

/* if(idEvent == IDC_TIMER) {
KillTimer(NULL, IDC_TIMER);
}
*/
}


::SetTimer(NULL, 0, 1000, TimerProc);

我把上面的代码放在DLL里运行,在启动定时器后,超时无法进入定时器处理函数,这是为什么?
我在基于对话框的程序里测试, 也存在同样的问题!
请指点!
...全文
188 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
AngusLiu 2004-12-17
  • 打赏
  • 举报
回复
结贴,
一样的代码,在家里的电脑上能正常运行!
为什么?
Kudeet 2004-12-17
  • 打赏
  • 举报
回复
函数返回的值才是你真正的定时器ID
Kudeet 2004-12-17
  • 打赏
  • 举报
回复
对,我说过的,你判断的KILLTIMER要用SetTimer函数的返回值才行。
Mr-Chen 2004-12-17
  • 打赏
  • 举报
回复
不可能,你应该这样使用

UINT_PTR iTimerID ;

VOID CALLBACK TimerProc ( HWND hwnd, UINT message, UINT iTimerID, DWORD dwTime)
{
 //处理WM_TIMER讯息
}

...

iTimerID = SetTimer(NULL,0,1000,TimerProc) ;
KillTimer(NULL,iTimerID) ;
AngusLiu 2004-12-17
  • 打赏
  • 举报
回复
有时间的兄弟可以测试一下很简单的
AngusLiu 2004-12-17
  • 打赏
  • 举报
回复
返回值也正常
Kudeet 2004-12-17
  • 打赏
  • 举报
回复
timerid = ::SetTimer(NULL, 0, 1000, TimerProc);//看看返回的定时器ID是不是为NULL

你的IDC_TIMER应该要用SetTimer函数的返回值才行
AngusLiu 2004-12-17
  • 打赏
  • 举报
回复
To DentistryDoctor:
就是过了1秒也不会进入那个处理函数

To sky:
hWnd
[in] Handle to the window to be associated with the timer. This window must be owned by the calling thread. If this parameter is NULL, no window is associated with the timer and the nIDEvent parameter is ignored.
nIDEvent
[in] Specifies a nonzero timer identifier. If the hWnd parameter is NULL, this parameter is ignored.
If the hWnd parameter is not NULL and the window specified by hWnd already has a timer with the value nIDEvent, then the existing timer is replaced by the new timer. When SetTimer replaces a timer, the timer is reset. Therefore, a message will be sent after the current time-out value elapses, but the previously set time-out value is ignored.

sky 2004-12-17
  • 打赏
  • 举报
回复
::SetTimer(NULL, IDC_TIMER, 1000, TimerProc);??
DentistryDoctor 2004-12-17
  • 打赏
  • 举报
回复
超时?
Excel下实现贪吃蛇小游戏 上次我们在Excel下实现了一个华容道式的小游戏,使用了Excel中的小部分属性和功能,不到100行语句就完成了。这次我们要把贪吃蛇搬到Excel中,就不那么容易了。 首先要解决游戏显示的问题。对我们来说,小游戏最好的平台是Excel的工作区,由于大小可调、颜色可填的单元格操作方便,我们完全可以把它们当像素来使用。于是我们的贪吃蛇游戏就有了以单元格为基础的像素形式的显示方式了。 其次是游戏的控制方法。在这里我摸索了好久,其中走了弯路不说,我最后的结论是在Excel中要实现按键事件的方法是引入窗体,然后在窗体中响应Keydown与Keypress事件。这样的话,既可以快速响应还可以根据情况修改对应按键。 最后是游戏的定时问题。所有的游戏事实上都是在一个时间大循环里面定时接收输入信息更新状态的程序,我们的小游戏都不例外。老实说,我写这个游戏大部分的思考时间就浪费在如何实现游戏定时这里。Excel的VBA中与定时有关的只有onTime函数,没有其他相关函数提供了,onTime函数可以实现某一事件在指定时间发生,但只能以秒为最小单位,对我们要在一秒内更新数十次信息的小游戏不适合,我们只能另找方法。用过VB的人都知道VB控件中有个定时控件,用它来实现游戏定时是最好的,但在Excel中却没有,难道我要把VB中的定时控件移植到VBA中?这也是个很值得研究的课题,但是我想到了另外的方法。VB的程序员都知道要想VB程序发挥大作用一定离不开调用系统的API,于是我查看了系统相关API的帮助,发现系统API中实现相应功能的有settimer与killtimer函数,具体定义和用法大家可以参考相关帮助,但从字面大家都已经可以知道它们就是我们要找的东西了。那么现在的问题就是如何在vba环境下调用系统API。心想微软称vba就是office中的vb,那么在vba中调用系统API应该也与在VB中的一样。一试,呵呵,果然非虚,这微软真不是盖的(后在msdn中发现ms office vba从2000版本开始支持调用系统API,大家可以拓展office应用了)。

16,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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