禁用键盘但让我的程序仍然知道何时按下键

Posted

技术标签:

【中文标题】禁用键盘但让我的程序仍然知道何时按下键【英文标题】:Disable keyboard but make my program still know when a key pressed 【发布时间】:2020-07-14 11:14:36 【问题描述】:

我想用 C 编写一个程序来禁用整个键盘但继续在我的程序中接收输入。

我尝试使用BlockInput(),但它也阻止了鼠标,我的程序无法获取键盘输入。

换句话说,我想在其他程序处理之前捕获键盘事件并禁用它们。

例如:

当我运行我的程序并尝试在我的浏览器/记事本中写入时,不会显示任何内容(例如键盘不工作),但我仍然可以将用户写入的内容写入文件。

这可能吗?

【问题讨论】:

可能,也许。拦截安全注意序列并非易事。很不清楚,您要解决什么问题。 这能回答你的问题吗? Capture All Keyboard Input 首先感谢您的快速回放。 @IInspectable 我正在尝试在记事本、浏览器等其他应用程序中为用户禁用键盘。例如,用户在记事本中键入“Hello World!” nothing 将显示并在我的程序控制台中打印“Hello World” @stark 不,我想禁用键盘,而不仅仅是捕获键。 你只是重复了你的问题。如果这个问题足够完整,我不会要求澄清。 【参考方案1】:

除了需要在cmets中使用hook外,还需要根据虚拟键码模拟字符串输出到控制台。并且需要检测鼠标的焦点是在记事本还是浏览器上。

这是一个代码示例:

#include <Windows.h>
#include <iostream>

using namespace std;

HHOOK keyboardHook;

LRESULT __stdcall KEYHookCallback(int nCode, WPARAM wParam, LPARAM lParam)

    int num[] =  0x41,0x42,0x43,0x44 ,0x45 ,0x46 ,0x47 ,0x48 ,0x49 ,0x4A ,0x4B ,0x4C ,0x4D ,0x4E ,0x4F,
                    0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57,0x58,0x59,0x5A,0x20;
    const char *ch[] =  "A","B", "C", "D", "E", "F", "G", "H","I", "J", "K", "L", "M", "N",
                     "O","P", "Q", "R", "S", "T", "U" ,"V","W", "X", "Y", "Z"," ";
    if (nCode >= 0)
    
        switch (wParam)
        
        case WM_KEYDOWN:
        
            HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
            DWORD written = 0;
            KBDLLHOOKSTRUCT* kbdStruct = (KBDLLHOOKSTRUCT*)lParam;

            if (stdOut == NULL || stdOut == INVALID_HANDLE_VALUE)
            
                cout << "error handle" << endl;
                return 0;
            
            POINT pntCurrentCursor;
            GetCursorPos(&pntCurrentCursor);
            HWND h = FindWindow("Notepad", NULL);
            HWND h2 = FindWindowEx(h, 0, "Edit", NULL);
            HWND h1 = WindowFromPoint(pntCurrentCursor);            
            if(h1 == h2)
                                                                             
                for (int i = 0; i < sizeof(num) / sizeof(int); i++)
                
                    if (kbdStruct->vkCode == num[i])
                    
                        WriteConsole(stdOut, ch[i], 1, &written, NULL);
                    
                
                                
            return 1;
                    
        
    
    return CallNextHookEx(keyboardHook, nCode, wParam, lParam);


void SetHook()

    if (!(keyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, KEYHookCallback, NULL, 0)))
    
        cout << "Failed to install keyboardHook hook!" << endl;
    


void ReleaseHook()

    UnhookWindowsHookEx(keyboardHook);


int main()

    SetHook();
    MSG msg;

    while (GetMessage(&msg, NULL, 0, 0))
    
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    
    ReleaseHook();
    return msg.wParam;

记事本是测试对象。 示例包含 26 个字符(A~Z)和空格键。

调试:

【讨论】:

谢谢!这就是我需要的

以上是关于禁用键盘但让我的程序仍然知道何时按下键的主要内容,如果未能解决你的问题,请参考以下文章

在Android中使用虚拟键盘按下键?

以编程方式为我的应用禁用键盘

LuaU 脚本(Roblox),我怎样才能用脚本按下键

非活动应用程序的键盘快捷键

我可以为我的应用禁用自定义键盘 (iOS8) 吗?

win10 禁用自带键盘