读书人

关于全局原子注册热键成功而无法调用的

发布时间: 2012-02-16 21:30:36 作者: rapoo

关于全局原子注册热键成功而无法调用的问题
各位高手,本人很久没在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"换个别的字符串试试?也许被别人注册掉了

读书人网 >VC/MFC

热点推荐