关于全局原子注册热键成功而无法调用的问题
各位高手,本人很久没在CSDN上发帖子了,在这里,首先向大家问个好!
大家都知道,注册全局原子热键的一般过程如下:
// 获取当前窗口句柄
HWND handle = GetSafeHwnd();
// 寻找HotKey对应的原子是否存在于原子列表
1. 注册
- C/C++ code
if(GlobalFindAtom("Hotkey") == 0) { // 如果没有存在于原子列表,则创建一个原子 m_nHotKeyID_S = GlobalAddAtom("Hotkey"); // 注册全局热键Ctrl + Alt + R RegisterHotKey(handle, m_nHotKeyID_S, CONTROL + ALT, R); } else // 如果HotKey已经存在于原子列表,则终止程序运行 PostQuitMessage(0); 2.响应自定义消息
- C/C++ code
LRESULT CTDlg::OnHotKey(WPARAM wp, LPARAM lp)//respond to the hotkey{if(wp == m_nHotKeyID_S ) { CenterWindow(); ShowWindow(SW_SHOW); } return 0;}本人为了简化代码,特别封装了一下:
- C/C++ code
BOOL CTDlg::MyRegisterHotKey(LPCTSTR lpString, int id, UINT fsModifiers, UINT vk){ // 寻找HotKey对应的原子是否存在于原子列表 if(GlobalFindAtom(lpString) == 0) // 返回0说明未注册此键 { id = GlobalAddAtom(lpString); // 把strHotKeyShow加入原子列表 BOOL bIsKeyRegistered = RegisterHotKey(this->m_hWnd, id, fsModifiers, vk); ASSERT(bIsKeyRegistered); return TRUE; }else{ MessageBox(_T("热键已经存在!")); PostQuitMessage(0); } return FALSE;}BOOL CTDlg::MyUnregisterHotKey(int id){ BOOL bIskeyUnregistered = UnregisterHotKey(this->m_hWnd, id); ASSERT(bIskeyUnregistered); GlobalDeleteAtom(id); return 0;}在程序内,把全局原子定义为CTDlg的成员:
- C/C++ code
protected: HICON m_hIcon ; //the Notify Icon ATOM m_nHotKeyID_S; // 创建全局原子列表
之前都可以实现的,可是在一次XP出问题后,全局原子就失效了……
还请有经验者指出问题所在,谢谢!
[解决办法]
友情帮顶,友情帮顶
[解决办法]
xp出问题? 失败的原因是什么? 看是否系统引起等
[解决办法]
友情帮顶,友情帮顶
[解决办法]
是否被某些特别的进程占用或注册掉其中部分?
[解决办法]
不懂,帮顶
[解决办法]
up~~~~~~~~~~~~~~~~~~~~~~~~
[解决办法]
在OnHotKey函数入口设置断点调试看是否会执行到。如果只有窗口在前台时才收到消息,应该是系统有问题(有可能问题与某个软件有关)。
[解决办法]
是所有热键全部失效还是部分失效?部分失效好解决,全部失效就不清楚了,只能试试看逐个关闭其他进程,看是不是有程序在抢热键。
XP出问题后出现这个情况,前后XP的SP版本有区别吗?我之前碰到过一个令人崩溃的问题,程序在SP3运行正常,在SP2就非法操作。
[解决办法]
把"Hotkey"换个别的字符串试试?也许被别人注册掉了