3

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

细节:

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

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

4

2 回答 2

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);
}

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

谢谢,

莫尔吉尔。

于 2012-08-16T20:08:11.900 回答
0

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

RegisterHotKey(GetSafeHwnd(), 100, 0,VK_F5); //F5 works only in our application
于 2017-10-16T10:22:38.230 回答