首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >c++ KeyLogger不记录第一次按shift键或control键

c++ KeyLogger不记录第一次按shift键或control键
EN

Stack Overflow用户
提问于 2012-07-30 06:11:30
回答 3查看 1.4K关注 0票数 0

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

它工作得很好,但问题是shift和control键没有显示出来。

这是因为当最初按下这些按钮时,不会调用save函数,因为它会等待我是否只想要一个大写字母或类似的东西。

我真的很想在按下按钮时立即调用save函数,但不确定如何做到这一点。

代码语言:javascript
复制
#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()函数上用"a+“替换"w”。

EN

回答 3

Stack Overflow用户

发布于 2012-11-17 14:04:05

更改:

代码语言:javascript
复制
for (i =8; i <= 190; i++) 

至:

代码语言:javascript
复制
for (i =0; i <= 255; i++)    
票数 2
EN

Stack Overflow用户

发布于 2012-07-30 06:26:06

我将为此使用事件循环,并处理WM_KEYDOWNWM_KEYUP消息。这还可以避免在main()中使用繁忙循环将某个内核的使用率提升到100%。

票数 0
EN

Stack Overflow用户

发布于 2013-08-16 23:22:00

我希望我的这篇文章能对你有所帮助,http://www.codeproject.com/Articles/635134/Target-Eye-Revealed-part-4-Keyboard-Capturing

致以敬意,

迈克尔·哈夫拉蒂

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11713428

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档