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

时间:2012-07-05 20:48:51

标签: c++ windows hotkeys

我想在软件中加入必要的代码来禁用Windows(Xp,Vista,特别是7和sucessors)热键,这些热键可以让用户远离软件。

详细说明:

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

我确实在stackoverflow中查看了一个帖子,其中有一个非常类似于我的帖子(Prevent users from quitting a windows application via system hotkeys),但据我所知,所提出的解决方案更适用于我的具体情况,而且我没有也可以在网上找到任何东西。

2 个答案:

答案 0 :(得分:2)

好的,我知道怎么做了。该代码能够使用低级键盘钩创建一个没有DLL的sistem范围的钩子。这是代码(更好解释)(使用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);
}

最后一个函数不需要.h或.cpp文件中的任何声明。它会阻止Ctrl,Windows Key和Alt的输入。其他两个必须分别放在用户想要开始关键禁用的功能和他希望停止的时候。

谢谢,

Momergil。

答案 1 :(得分:0)

RegisterHotKey也是所有应用程序的全局禁用热键,除非进行RegisterHotKey函数调用。

RegisterHotKey(GetSafeHwnd(), 100, 0,VK_F5); //F5 works only in our application