-2
我正在尝试使用低级别的键盘挂接将程序记录到文本文件中。我遇到的问题是,虽然它会记录字母,但文本文件只包含最后一个被按下的字母。使用日志记录键的问题
例如,如果我输入单词“你好”,文本文件将只包含“o”。
这是我的代码。再次感谢您的帮助。
#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iostream>
#include <fstream>
// function declaration.
using namespace std;
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam);
int main()
{
HINSTANCE appInstance = GetModuleHandle(NULL);
SetWindowsHookEx(WH_KEYBOARD_LL, LowLevelKeyboardProc, appInstance, 0);
MSG msg;
while(GetMessage(&msg, NULL, 0, 0) > 0)
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return 0;
}
LRESULT CALLBACK LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam)
{
ofstream myfile;
myfile.open("log.txt");
KBDLLHOOKSTRUCT *pKeyBoard = (KBDLLHOOKSTRUCT *)lParam;
switch(wParam)
{
case WM_KEYUP:
{
switch(pKeyBoard->vkCode)
{
case VK_RETURN:
myfile<<"Enter \n";
break;
case 0x41:
myfile<<"A \n";
break;
case 0x42:
myfile<<"B \n";
break;
case 0x43:
myfile<<"C \n";
break;
case 0x44:
myfile<<"D \n";
break;
case 0x45:
myfile<<"E \n";
break;
case 0x46:
myfile<<"F \n";
break;
case 0x47:
myfile<<"G \n";
break;
case 0x48:
myfile<<"H \n";
break;
case 0x49:
myfile<<"I \n";
break;
case 0x4A:
myfile<<"J \n";
break;
case 0x4B:
myfile<<"K \n";
break;
case 0x4C:
myfile<<"L \n";
break;
case 0x4D:
myfile<<"M \n";
break;
case 0x4E:
myfile<<"N \n";
break;
case 0x4F:
myfile<<"O \n";
break;
case 0x50:
myfile<<"P \n";
break;
case 0x51:
myfile<<"Q \n";
break;
case 0x52:
myfile<<"R \n";
break;
case 0x53:
myfile<<"S \n";
break;
case 0x54:
myfile<<"T \n";
break;
case 0x55:
myfile<<"U \n";
break;
case 0x56:
myfile<<"V \n";
break;
case 0x57:
myfile<<"W \n";
break;
case 0x58:
myfile<<"X \n";
break; case 0x59:
myfile<<"Y \n";
break;
case 0x5A:
myfile<<"Z \n";
break;
case 0x30:
myfile<<"0 \n";
break;
case 0x31:
myfile<<"1 \n";
break;
case 0x32:
myfile<<"2 \n";
break;
case 0x33:
myfile<<"3 \n";
break;
case 0x34:
myfile<<"4 \n";
break;
case 0x35:
myfile<<"5 \n";
break;
case 0x36:
myfile<<"6 \n";
break;
case 0x37:
myfile<<"7 \n";
break;
case 0x38:
myfile<<"8 \n";
break;
case 0x39:
myfile<<"9 \n";
break;
}
}
default:
return CallNextHookEx(NULL, nCode, wParam, lParam);
}
myfile.close();
return 0;
}
您不需要所有此代码来重现该问题。这是_a文件处理问题_。因此,所有的密钥处理代码都可以使用,就像Windows专用的代码一样。请学习生成一个[5-10行_minimal_ testcase](http://sscce.org):在这里,你需要发布一个问题才能找到问题。 – 2014-12-04 14:34:38
每次调用proc时都会打开该文件,但不会*追加*。 – crashmstr 2014-12-04 14:35:25