Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 禁用键盘,但使我的程序仍然知道何时按下某个键_C_Windows_Winapi_Keyboard_Event Handling - Fatal编程技术网

C 禁用键盘,但使我的程序仍然知道何时按下某个键

C 禁用键盘,但使我的程序仍然知道何时按下某个键,c,windows,winapi,keyboard,event-handling,C,Windows,Winapi,Keyboard,Event Handling,我想用C语言编写一个程序,禁用整个键盘,但继续在程序中接收输入 我尝试使用BlockInput(),但它也会阻止鼠标,并且我的程序无法获得键盘输入 换句话说,我想捕获键盘事件并在其他程序处理它们之前禁用它们 例如: 当我运行程序并尝试在浏览器/记事本中写入时,不会显示任何内容(如键盘不工作),但我仍然可以将用户编写的内容写入文件 这可能吗?除了需要在注释中使用钩子之外,还需要根据虚拟键代码模拟到控制台的字符串输出。您需要检测鼠标的焦点是在记事本上还是在浏览器上 下面是一个代码示例: #inclu

我想用C语言编写一个程序,禁用整个键盘,但继续在程序中接收输入

我尝试使用
BlockInput()
,但它也会阻止鼠标,并且我的程序无法获得键盘输入

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

例如:

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


这可能吗?

除了需要在注释中使用钩子之外,还需要根据虚拟键代码模拟到控制台的字符串输出。您需要检测鼠标的焦点是在记事本上还是在浏览器上

下面是一个代码示例:

#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;
}
#包括
#包括
使用名称空间std;
HHOOK键盘钩;
LRESULT uu 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”、“Z”;”;
如果(nCode>=0)
{
交换机(wParam)
{
案例WM_键控:
{
句柄stdOut=GetStdHandle(标准输出句柄);
DWORD WRITED=0;
KBDLLHOOKSTRUCT*kbdStruct=(KBDLLHOOKSTRUCT*)LPRAM;
if(stdOut==NULL | | stdOut==INVALID_HANDLE_值)
{

可能是不可能的。截取安全注意序列完全不是一件小事。很不清楚,你想解决什么问题。这能回答你的问题吗?首先感谢你的快速重播。@IInspectable我正在尝试在其他应用程序(如记事本、浏览器等)中为用户禁用键盘。例如,用户记事本“Hello World!”中的键入将不会显示任何内容,并且在我的程序控制台中打印“Hello World”@stark不,我想禁用键盘,而不仅仅是捕获按键。你只是重复了你的问题。如果问题足够完整,我将不会要求澄清。谢谢!这是我需要的