【发布时间】:2014-04-01 12:05:00
【问题描述】:
我目前正在开发一个名为“Key-O-Meter”的程序。该程序应跟踪在 Windows 上使用键盘进行的每个输入。跟踪的键将用于在其他时间创建统计信息。不幸的是,我在确定输入了哪个字符时遇到了问题。下面的代码仅在键盘上打印字符(即,如果按下 a,则打印“a”,如果按下 shift +“a”,则不会打印“A”)。特殊字符根本不起作用。
有没有比 MapVirtualKeyA 更好的 WinAPI 函数来提供这个功能?
#include <iostream>
#include <windows.h>
using namespace std;
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
LPARAM lParam);
/**
*
*/
int CALLBACK WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow) {
//add hook
HHOOK hook;
hook = SetWindowsHookEx(WH_KEYBOARD_LL,
(HOOKPROC) lowLevelKeyboardProc, NULL, 0);
//start message loop
MSG message;
while (GetMessage(&message, NULL, 0, 0) != 0) {
TranslateMessage(&message);
DispatchMessage(&message);
}
//disable hook
UnhookWindowsHookEx(hook);
return 0;
}
/**
*
*/
LRESULT WINAPI lowLevelKeyboardProc(int nCode, WPARAM wParam,
LPARAM lParam) {
if (wParam == WM_KEYDOWN) {
//handle normal keydown
PKBDLLHOOKSTRUCT hookStruct = (PKBDLLHOOKSTRUCT) lParam;
char keyChar = MapVirtualKeyA(hookStruct->vkCode, MAPVK_VK_TO_CHAR);
cout << keyChar << endl;
}
return CallNextHookEx(0, nCode, wParam, lParam);
}
【问题讨论】:
-
您似乎根本没有处理修饰键
-
我该如何处理它们?请提供一个小例子
-
你遇到了更大的问题。你有知识缺陷。让其他人为您编写代码不会帮助您学习。您缺少的是 Windows 如何处理输入、虚拟键等方面的坚实基础。在继续之前,您需要了解这一点。
标签: c++ windows winapi keylogger