使用c ++禁用任务切换键

时间:2014-06-10 07:14:08

标签: c++ windows hook setwindowshookex

我已经做了很多搜索而没有真正的解决方案(针对我自己的问题),所以我想我会在这里问。

我正在设计一个类似于信息亭的程序,可以防止用户在程序运行时使用任务键(alt + tab,alt + esc,ctrl + esc等)。注意我是新手程序员,因此如果可以的话,我想远离单独的dll处理。特别是,我已经访问了此网站http://support.microsoft.com/kb/226359/en-us以获取代码。我的代码的简化部分在顶部看起来像这样:

HHOOK mule;
HHOOK g_hKeyboardHook;
BOOL g_bFullscreen;
LRESULT CALLBACK LowLevelKeyboardProc (INT nCode, WPARAM wParam, LPARAM lParam)
{
    // By returning a non-zero value from the hook procedure, the
    // message does not get passed to the target window
    KBDLLHOOKSTRUCT *pkbhs = (KBDLLHOOKSTRUCT *) lParam;
    BOOL bControlKeyDown = 0;

    switch (nCode)
    {
        case HC_ACTION:
        {
            // Check to see if the CTRL key is pressed
            bControlKeyDown = GetAsyncKeyState (VK_CONTROL) >> ((sizeof(SHORT) * 8) - 1);

            // Disable CTRL+ESC
            if (pkbhs->vkCode == VK_ESCAPE && bControlKeyDown)
                return 1;

            // Disable ALT+TAB
            if (pkbhs->vkCode == VK_TAB && pkbhs->flags & LLKHF_ALTDOWN)
                return 1;

            // Disable ALT+ESC
            if (pkbhs->vkCode == VK_ESCAPE && pkbhs->flags & LLKHF_ALTDOWN)
                return 1;

            break;
        }

        default:
            break;
    }
    return CallNextHookEx (mule, nCode, wParam, lParam);
}

我的主要是

int main(int argc, char **argv)
{
    _getch();
    g_hKeyboardHook = SetWindowsHookEx( WH_KEYBOARD_LL,  LowLevelKeyboardProc, GetModuleHandle(NULL), 0 );
    cout << "Testing task keys disabling (alt tab, ctrl esc, alt esc) and taskbar..." << endl;
    _getch();
     UnhookWindowsHookEx( g_hKeyboardHook );
    cout << "Re enabled" << endl;
    _getch();
return 0;
}

我意识到这段代码适用于非常旧的Windows操作系统,但我已经环顾四周,其他解决方案与此代码相似,所以我认为它应该可行。

但由于某种原因,它似乎并没有起作用。每当我的程序进入该行代码时,程序就会停顿5秒并继续运行,但任务键仍在运行。

我听说我应该将该功能作为dll实现,而不是将所有内容都放在一个文件中,但我不确定它们是否完全正确(我也不知道dll )

此外,我还尝试过代码(禁用Windows密钥):http://msdn.microsoft.com/en-us/library/windows/desktop/ee416808(v=vs.85).aspx它和我自己的程序做同样的事情(停顿并什么都不做)

有人能发现我做错了什么吗?我在Windows 7 64bit上使用VC ++ 2010。

1 个答案:

答案 0 :(得分:0)

您的代码很好,钩子仅在控制台应用程序中不起作用,因为Windows无法回调到控制台应用程序,这需要消息循环。

请阅读汉斯·帕桑特(Hans Passant)的this答案,也适用于此。