C++ c++;键盘记录器未记录第一次按下换档键或控制键

C++ c++;键盘记录器未记录第一次按下换档键或控制键,c++,broadcast,keylogger,C++,Broadcast,Keylogger,我正在写一个键盘记录器,但不是出于恶意目的。它实际上是创建一个文件,然后由xsplit广播程序插件读取“轮询”,该插件在我广播屏幕时在屏幕上显示我的按键 它工作正常,但问题是换档和控制键没有出现 这是因为最初按下这些按钮时,save函数没有被调用,因为它等待查看我是否只需要大写字母或类似的字符 我真的很想在按下按钮时立即调用save函数,但不确定如何执行此操作 #include <cstdlib> #include <iostream> #include <wind

我正在写一个键盘记录器,但不是出于恶意目的。它实际上是创建一个文件,然后由xsplit广播程序插件读取“轮询”,该插件在我广播屏幕时在屏幕上显示我的按键

它工作正常,但问题是换档和控制键没有出现

这是因为最初按下这些按钮时,save函数没有被调用,因为它等待查看我是否只需要大写字母或类似的字符

我真的很想在按下按钮时立即调用save函数,但不确定如何执行此操作

#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;
}

/********************************************************************************/
/********************************************************************************/
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
/*
*将密钥记录到文件的程序
*/
int Save(int key_stroke,char*文件);
int main(int argc,字符**argv){
char i;
而(1)
{

对于(i=8;i我将为此使用一个事件循环,并处理
WM\u KEYDOWN
WM\u keydup
消息。这也将避免在
main()
中的忙循环将一个核心推到100%更改:

for (i =8; i <= 190; i++) 

我希望我的这篇文章能对你有所帮助

问候,


Michael Haephrati

如果您编辑以下行
if(GetAsyncKeyState(i)=-32767)
if(GetAsyncKeyState(i)=-32767)| |(GetAsyncKeyState(VK_SHIFT))
?您可以在MSDN上找到VirtualKey代码:不,GetAsyncKeyState正在检查windows是否处理按键(我想这就是-32767的意思)它在按键时不会返回真值。@Zac hook with WH_键盘谢谢,但是你有一些示例代码的链接吗,我无法理解这个信息页面
for (i =0; i <= 255; i++)