キーロガーを書いていますが、悪意のある目的ではありません。実際には、xsplit ブロードキャスト プログラムのプラグインによって読み込まれるファイルを作成し、画面をブロードキャストしているときにキーを押した状態を画面に表示します。
問題なく動作していますが、問題はシフトキーとコントロールキーが表示されないことです。
これは、これらのボタンが最初に押されたときに保存機能が呼び出されていないためです。これは、大文字などが必要かどうかを確認するために待機しているためです。
ボタンを押すとすぐに保存機能を呼び出したいのですが、これを行う方法がわかりません。
#include <cstdlib>
#include <iostream>
#include <windows.h>
#include <winuser.h>
#include <stdio.h>
using namespace std;
/*
* a program to log keys to file
*/
int Save (int key_stroke, char *file);
int main(int argc, char** argv) {
char i;
while (1)
{
for (i =8; i <= 190; i++)
{
if (GetAsyncKeyState(i) == -32767)
Save (i, "LOG.TXT");
}
}
return 0;
}
/********************************************************************************/
/********************************************************************************/
int Save (int key_stroke, char *file)
{
FILE *OUTPUT_FILE;
OUTPUT_FILE = fopen(file, "w");
fprintf(OUTPUT_FILE, "%s", "<xsplit>");
cout << key_stroke << endl;
if (key_stroke == 8)
fprintf(OUTPUT_FILE, "%s", "[Backspace]");
else if (key_stroke == 13)
fprintf(OUTPUT_FILE, "%s", "[Return]");
else if (key_stroke == 32)
fprintf(OUTPUT_FILE, "%s", "[Space]");
else if (key_stroke == VK_SHIFT)
fprintf(OUTPUT_FILE, "%s", "[Shift]");
else if (key_stroke == VK_ESCAPE)
fprintf(OUTPUT_FILE, "%s", "[Escape]");
else if (key_stroke == VK_CONTROL)
fprintf(OUTPUT_FILE, "%s", "[Control]");
else if (key_stroke == VK_END)
fprintf(OUTPUT_FILE, "%s", "[END]");
else if (key_stroke == VK_HOME)
fprintf(OUTPUT_FILE, "%s", "[HOME]");
else if (key_stroke == 1)
fprintf(OUTPUT_FILE, "%s", "[LMOUSE]");
else if (key_stroke == 2)
fprintf(OUTPUT_FILE, "%s", "[RMOUSE]");
else
fprintf(OUTPUT_FILE, "%s", &key_stroke);
fprintf(OUTPUT_FILE, "%s", "</xsplit>");
fclose(OUTPUT_FILE);
return 0;
}
/********************************************************************************/
/********************************************************************************/
作成されたファイルは、fopen() 関数の "w" を "a+" に置き換えるだけでテストしたい場合は、常に上書きされ、新しいキーを押すと置き換えられます。