禁用键盘但让我的程序仍然知道何时按下了一个键
Disable keyboard but make my program still know when a key pressed
我想用 C 编写一个程序来禁用整个键盘,但继续在我的程序中接收输入。
我尝试使用BlockInput()
,但它也阻塞了鼠标,我的程序无法获取键盘输入。
换句话说,我想捕获键盘事件并在它们被其他程序处理之前禁用它们。
例如:
当我 运行 我的程序并尝试在我的 browser/notepad 中写入时,什么也不会显示(就像键盘不工作),但我仍然可以写入用户写的文件。
这可能吗?
除了需要在注释中使用hooks,还需要根据虚拟键码模拟字符串输出到控制台。并且需要检测鼠标的焦点是在记事本上还是在浏览器上。
这是一个代码示例:
#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)和space条。
调试:
我想用 C 编写一个程序来禁用整个键盘,但继续在我的程序中接收输入。
我尝试使用BlockInput()
,但它也阻塞了鼠标,我的程序无法获取键盘输入。
换句话说,我想捕获键盘事件并在它们被其他程序处理之前禁用它们。
例如:
当我 运行 我的程序并尝试在我的 browser/notepad 中写入时,什么也不会显示(就像键盘不工作),但我仍然可以写入用户写的文件。
这可能吗?
除了需要在注释中使用hooks,还需要根据虚拟键码模拟字符串输出到控制台。并且需要检测鼠标的焦点是在记事本上还是在浏览器上。
这是一个代码示例:
#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)和space条。
调试: