Winapi 在MFC寄存器中,快捷键函数don';不回答

Winapi 在MFC寄存器中,快捷键函数don';不回答,winapi,mfc,Winapi,Mfc,在MFC中,RegisterHotKey函数不会从Dll中响应,但若我在exe中放入相同的代码,它就可以正常工作。 我使用的代码与exe中的代码相同,并将其放入Dll中。 还要确保Dll得到加载,并且在我运行exe时反映出其他更改。在Dll中注册热键的代码与在exe中注册热键的代码相同。这是你的问题。有关以下信息,请参阅文档: 应用程序必须指定范围为0x0000到0xBFFF的id值共享DLL必须指定0xC000到0xFFFF范围内的值(函数返回的范围)。为避免与其他共享DLL定义的热键标识符冲

在MFC中,RegisterHotKey函数不会从Dll中响应,但若我在exe中放入相同的代码,它就可以正常工作。 我使用的代码与exe中的代码相同,并将其放入Dll中。
还要确保Dll得到加载,并且在我运行exe时反映出其他更改。

在Dll中注册热键的代码与在exe中注册热键的代码相同。这是你的问题。有关以下信息,请参阅文档:

应用程序必须指定范围为0x0000到0xBFFF的id值共享DLL必须指定0xC000到0xFFFF范围内的值(函数返回的范围)。为避免与其他共享DLL定义的热键标识符冲突,DLL应使用GlobalAddAtom函数获取热键标识符


要从共享DLL中使用注册表项,您需要生成一个id值。要获得正确范围内的值,请使用字符串参数调用
GlobalAddAtom
(请参阅)。若要创建唯一id,请传递GUID的字符串表示形式。

您可以演示如何使用dll中的函数吗?一个窗口句柄,用于接收热键生成的WM_热键消息-您正在传递到itRegisterHotKey(GetSafeHwnd()、GlobalAddAtom(“CTRL+D”)、MOD_控件“D”)的内容;谢谢你的回复。同样的代码意味着,我在exe中注释代码,并在Dll中使用该代码。所以它不是重复的代码。整个注册表中只有一个注册表项application@raje1987:问题不在于存在相同的代码。问题在于将代码复制到DLL时使用了错误的id范围(请参阅引用的参考文档中的粗体文本)。我也尝试在DLL中使用GlobalAddAtom。但还是不行
// Putting in message map 
ON_MESSAGE(WM_HOTKEY, OnHotKey)

//Demographic Bar HotKey (putting in create or init)
RegisterHotKey(GetSafeHwnd(), GlobalAddAtom("SHIFT+CTRL+ALT+D"), MOD_SHIFT | MOD_CONTROL | MOD_ALT, 'D');

//source file 
LRESULT CMainFrame::OnHotKey(WPARAM wParam, LPARAM lParam)
{
    int hotKeyId = (int)wParam;
    CString atomName;
    GlobalGetAtomName(hotKeyId, atomName.GetBuffer(20), 20);
    atomName.ReleaseBuffer();

    if (atomName.Compare("SHIFT+CTRL+ALT+D") == 0)
    {
        SetPaneFocused(1);  //Hard-coding 1 & 2 as place holders.  Actual pane id should be here
    }
    else if (atomName.Compare("SHIFT+CTRL+ALT+M") == 0)
    {
        SetPaneFocused(2);
    }

    return S_OK;
}