如何从使用 C++ 的软件内部禁用特定的 Windows 热键?

Mom*_*gil 3 c++ windows hotkeys

我想在软件中放入必要的代码以禁用 Windows(Xp、Vista,特别是 7 和后续版本)热键,这些热键可能允许用户远离软件。

细节:

  • 命令必须仅在软件运行时有效;当它不运行时,必须启用 Windows 热键(因此:如果用户启动软件,热键被禁用;如果他关闭它,必须重新启用)。
  • 我不想禁用所有 Windows 热键(某些关键热键,例如 ctrl+alt+del 必须仍可操作),因此诸如禁用所有热键的某种 Windows 配置之类的解决方案对我来说毫无用处。我必须能够专门选择哪些热键我想继续工作,哪些我不想。
  • “热键”昵称包括 Windows 按钮。
  • 代码必须使用 C++ 或 Windows 函数。
  • 最好不需要终止 explorer.exe。

我确实看过 stackoverflow 中的一篇帖子,它的案例与我的非常相似(防止用户通过系统热键退出 Windows 应用程序),但据我所知,所提供的解决方案均适用于我的特定情况,而且我在网上也没有找到任何东西。

Mom*_*gil 5

好的,我知道该怎么做了。该代码能够使用低级键盘钩子在没有 DLL 的情况下创建系统范围的钩子。这是代码(更好地解释)(使用Qt):

//Installing the hook
SWH_return = SetWindowsHookEx(WH_KEYBOARD_LL,LowLevelKeyboardProc,GetModuleHandle(NULL),0);

if (SWH_return != NULL)
    qDebug() << "Hook true";
else
    qDebug() << "Hook false";

//Uninstalling the hook
bool teste = false;

teste = UnhookWindowsHookEx(SWH_return);

if (teste)
    qDebug() << "Unhook: true";
else
    qDebug() << "Unhook: false";

//The function responsible for detecting the keystrokes
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
if (nCode < 0)
    return CallNextHookEx(NULL, nCode, wParam, lParam);

tagKBDLLHOOKSTRUCT *str = (tagKBDLLHOOKSTRUCT *)lParam;

switch(str->flags)
{
    case (LLKHF_ALTDOWN):
        qDebug() << "ALT";
        delete str;
    return 1;
}

if (wParam == WM_KEYDOWN)
{
    switch (str->vkCode)
    {
        case VK_RWIN:
        case VK_LWIN:
        case VK_LCONTROL:
        case VK_RCONTROL:
        case VK_APPS:
        case VK_SLEEP:
        case VK_MENU:
            qDebug() << "SPECIAL PRESS";
            delete str;
        return 1;
    }
}

return CallNextHookEx(NULL, nCode, wParam, lParam);
}
Run Code Online (Sandbox Code Playgroud)

最后一个函数不需要在 .h 或 .cpp 文件中进行任何声明。它阻止 Ctrl、Windows 键和 Alt 的输入。另外两个必须分别放置在用户想要开始按键禁用的功能和他想要停止的功能中。

谢谢,

莫默吉尔。