使用C ++禁用任务切换键 [英] Disable task switching keys with c++

查看:144
本文介绍了使用C ++禁用任务切换键的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经进行了很多搜索,没有找到真正的解决方案(针对我自己的问题),所以我想在这里问.

我正在设计一个类似信息亭的程序,该程序可以防止用户在程序运行时使用任务键(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键):解决方案

您的代码很好,钩子不适用于控制台应用程序,因为Windows无法回调到控制台应用程序,这需要消息循环.

请阅读汉斯·帕桑特(Hans Passant)的答案,

I've done a lot of searching around with no real solution (to my own problem) so I thought I'd ask here.

I'm designing a kiosk-like program that prevents the user from using task keys (alt+tab, alt+esc, ctrl+esc, etc) while the program is running. Note I'm a novice programmer thus I'd want to stay away from separate dll handling if I can. Particularly, I have went to this site http://support.microsoft.com/kb/226359/en-us for the code. A simplified part of my code looks like this at the top:

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

The my main is

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

I realize this code is for really old windows OS, but I've looked around and the other solutions resemble this code so I thought it should work.

But for some reason it doesn't seem to be working. Whenever my program gets to that line of code, the program stalls for like 5 seconds and continues to run, but the task keys are still working.

I've heard that I should be implementing that function as a dll instead of putting everything in one file, but I'm not sure if they're absolutely right (also I know nothing of dlls)

In addition, I've also tried code (to disable windows key) here: http://msdn.microsoft.com/en-us/library/windows/desktop/ee416808(v=vs.85).aspx and it does the same thing my own program (stalls and does nothing)

Can anyone spot where I did something wrong? I'm using VC++ 2010 on windows 7 64bit.

解决方案

Your code is fine, hooks just doesn't work with console application because windows can't callback into a console application, it requires a message loop.

Read this answer by Hans Passant which applies here too.

这篇关于使用C ++禁用任务切换键的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆