定义如下全局热键
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,就加几个函数到消息列队中,然后顺着给我执行,晕了。
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,就加几个函数到消息列队中,然后顺着给我执行,晕了。
PostMessage只把消息放入队列,不管其他程序是否处理都返回,然后继续执行,这是个异步消息投放函数。而SendMessage必须等待其他程序处理消息完了之后才返回,继续执行,这是个同步消息投放函数。而且,PostMessage的返回值表示PostMessage函数执行是否正确;而SendMessage的返回值表示其他程序处理消息后的返回值。
2.用m_bRun是不能实现你期望的目的的。
3.用户按一次热键,消息队列中就增加一个WM_HOTKEY;按两次就有两个消息;按三次就有三个消息....然后处理函数就取一个消息,执行;执行完了再取下一个....
4.在消息产生的源头处理是对的。发现是WM_HOTKEY的时候就把队列中的WM_HOTKEY都清除掉