定义如下全局热键
RegisterHotKey(GetSafeHwnd(),1001,MOD_CONTROL,'W');   //注册全局热键Ctrl+F7映射
ON_MESSAGE(WM_HOTKEY,OnHotKey)静态变量
static BOOL m_bRun=FALSE;消息处理函数
LRESULT Cxx::OnHotKey(WPARAM wParam,LPARAM lParam)
{  if(!m_bRun)
m_bRun=TRUE;//函数正在执行中
else
{
MessageBox("已经运行");
return 1;
}
///////////
//函数主体 
///////////m_bRun=FALSE;//函数执行完毕
return 1;
}目的:我想通过m_bRun的值来判断此函数是否在执行中,或者已经执行完成。从而避免在此函数没有执行完之前,又通过Ctrl+F7再次调用此函数。
但是我这个方法好像行不通。不知为什么,按几次Ctrl+F7,就加几个函数到消息列队中,然后顺着给我执行,晕了。

解决方案 »

  1.   

    消息怎么发送的,可能跟下面有关:
    PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。
      

  2.   

    1.你想实现的类似于系统对WM_PAINT的处理效果:消息合并。
    2.用m_bRun是不能实现你期望的目的的。
    3.用户按一次热键,消息队列中就增加一个WM_HOTKEY;按两次就有两个消息;按三次就有三个消息....然后处理函数就取一个消息,执行;执行完了再取下一个....
    4.在消息产生的源头处理是对的。发现是WM_HOTKEY的时候就把队列中的WM_HOTKEY都清除掉
      

  3.   

    楼上的解释是对的,并不是所有的消息WINDOWS都会给用户产生消息合并的,经常的几个消息合并的消息比如说:WM_PAINT,WM_MOUSEMOVE等,其它的消息,WINDOWS只是简单的把它加入到程序的消息队列中,因此这种方法显然不能完成的要求,如果想要实现,可以在pretranslateMessage中判断并处理,发现消息相同,并已经有消息在处理时只是简单的返回即可。