none
RegisterHotKey id问题 RRS feed

  • 问题

  • BOOL WINAPI RegisterHotKey( HWND hWnd, int id, UINT fsModifiers, UINT vk)
    关于id参数,MSDN说:An application must specify an id value in the range 0x0000 through 0xBFFF. A shared DLL must specify a value in the range 0xC000 through 0xFFFF (the range returned by the GlobalAddAtom function).

    我的理解是:应用程序必须使用 0x0000 到 0xBFFF范围的值,而共享DLL库必须使用0xC000 到 0xFFFF范围的值,很多资料也是这么解释的。
    可是,实际测试结果无法理解:

    在一个最简单的MFC窗口应用程序中,我使用以下代码
    BOOL CAtomDlg::OnInitDialog()
    {
       ATOM KeyAtom = GlobalAddAtom(_T("Hotkey"));
       BOOL b = RegisterHotKey(handle, KeyAtom, MOD_CONTROL, VK_F3);
    }
    成功注册了热键,但是GlobalAddAtom返回值范围在0xC000 到 0xFFFF范围,而不是0x0000 到 0xBFFF范围。
    在一些教程中说,对于应用程序,GlobalAddAtom返回值应该减去0xC000 作为RegisterHotKey的id参数,但是如果我按此法修改代码为:
       BOOL b = RegisterHotKey(handle, KeyAtom-0xC000, MOD_CONTROL, VK_F3);
    热键注册失败。

    谁能帮忙解释一下我的测试结果为什么和MSDN之间不一致?

    测试平台:VC2005,32位 windows XP或64位Windows 7

    2012年11月23日 9:59

答案

  • // VS2008SP1+WindowsXP,在对话框类的OnInitDialog中测试没有问题
    ATOM KeyAtom = GlobalAddAtom(_T("Hotkey"));
     BOOL b = RegisterHotKey(GetSafeHwnd(), KeyAtom - 0xC000, MOD_CONTROL, VK_F3);
     if(b)
     {
      AfxMessageBox(_T("OK!!"));
     }


    BOOL RegisterHotKey(      

        HWND hWnd,     int id,     UINT fsModifiers,     UINT vk );
    id:
      定义热键的标识符。调用线程中的其他热键,不能使用同样的标识符。应用程序必须定义一个0X0000-0xBFFF范围的值。一个共享的动态链接库(DLL)必须定义一个范围为0xC000-0xFFFF的值(GlobalAddAtom函数返回该范围)。为了避免与其他动态链接库定义的热键冲突,一个DLL必须使用GlobalAddAtom函数获得热键的标识符。

    Visual C++ enthusiast, like network programming and driver development. At present is being engaged in the WinCE/Windows Mobile platform embedded development.

    2012年11月26日 1:38
    版主