[C++] 纯文本查看 复制代码 HHOOK g_hHook;
LRESULT CALLBACK MyKeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
if (code < 0) {
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
// 获取键盘状态
BYTE keyboardState[256];
GetKeyboardState(keyboardState);
// 转换虚拟键码到实际字符
WCHAR charBuffer[5]; // 大小足以处理一般字符和Dead keys
int numChars = ToUnicode(
wParam,
((lParam >> 16) & 0xFF), // 提取扫描码
keyboardState,
charBuffer,
4,
0
);
// 确保有字符被正确转换
if (numChars > 0) {
charBuffer[numChars] = 0; // 添加终止字符
char szBuffer[MAXBYTE];
wsprintf(szBuffer, "HT:%ls pid:%d", charBuffer, GetCurrentProcessId());
OutputDebugString(szBuffer);
}
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
代码解释:
键盘状态获取:使用 GetKeyboardState 来获取当前键盘的状态数组,这包括所有键的上下状态。
字符转换:ToUnicode 函数用来将虚拟键码转换为对应的 Unicode 字符,它同时考虑了当前的键盘布局和按键状态。这个函数能处理组合键和Dead keys,可以生成多于一个字符的输出。
输出调试信息:如果 ToUnicode 成功转换虚拟键码(返回值大于0),则格式化字符串包含转换后的字符并输出。 |