2015-11-17 4 views
1

Я закодировал программу для обновления моего отношения k/d во время потоковой передачи, и я хотел, чтобы она была проста в использовании, в основном, чтобы нажимать «shift + 1», чтобы увеличить убивает и т. д. Теперь он работает, когда я нахожусь в Google Chrome и некоторых других приложениях, но когда я в игре, в этом случае Arma, когда я нажимаю эти клавиши, он просто этого не делает, я должен alt + tab, а затем нажмите клавиши, и это сработает. Есть ли способ сделать так, чтобы приоритет захвата ключа был абсолютным, что более важно, чем Arma, и будет захватываться, даже если я в игре?C++ Capturing Keyboard Specific Keys, даже если в игре

Благодаря

Код:

#include <iostream> 
#include <windows.h> 

using namespace std; 

int main(int argc, const char * argv[]) { 
RegisterHotKey(NULL, 1, MOD_SHIFT, 0x31); // shift + 1 
RegisterHotKey(NULL, 2, MOD_SHIFT, 0x32);// shift + 2 
RegisterHotKey(NULL, 3, MOD_SHIFT, 0x33);// shift + 3 
RegisterHotKey(NULL, 4, MOD_SHIFT, 0x30);// shift + 0 
//shift + 1 = kill 
//shift + 2 = death 
//shift + 3 = reset 
//shift + 0 = close; 
int exit = 0; 
int kill = 0; 
int death = 0; 

cout << "K: " << kill << endl; 
cout << "D: " << death; 

do 
{ 
    int showKill = kill; 
    int showDeath = death; 
    do 
    { 
     MSG msg = {0}; 
     if (GetMessageA(&msg, NULL, 0, 0) != 0) 
      if(msg.message == WM_HOTKEY) 
      { 
       if(msg.wParam == 1) 
        kill++; 
       else if(msg.wParam == 2) 
        death++; 
       else if(msg.wParam == 3) 
       { 
        kill = 0; 
        death = 0; 
       } 
       else 
       { 
        exit++; 
        break; 
       } 
      } 
    } 
    while(kill == showKill && death == showDeath); 

    system("CLS");//clear the console 
    cout << "K: " << kill << endl; 
    cout << "D: " << death; 
} 
while(exit == 0); 


UnregisterHotKey(NULL, 1); 
UnregisterHotKey(NULL, 2); 
UnregisterHotKey(NULL, 3); 
UnregisterHotKey(NULL, 4); 
return 0; 
} 

ответ

1

Из того, что я могу думать от от верхней части моей головы, есть две довольно простые способы, как решить это при условии, что вы играете в игру на Windows:

  1. Вы пишете крючок и вводите его в game.exe во время работы.
  2. Вы используете SetWindowsHookEx и захватываете входные события низкого уровня клавиатуры.

первого подхода требует, чтобы написать модуль DLL, и что вы будете иметь возможность использовать большую часть уже написанного кода, он должен идти что-то вроде этого:

#include <windows.h> 
#include <iostream> 

using namespace std; 

DWORD WINAPI KeyThread(LPVOID) 
{ 
    RegisterHotKey(NULL, 1, MOD_SHIFT, 0x31); // shift + 1 
    RegisterHotKey(NULL, 2, MOD_SHIFT, 0x32);// shift + 2 
    RegisterHotKey(NULL, 3, MOD_SHIFT, 0x33);// shift + 3 
    RegisterHotKey(NULL, 4, MOD_SHIFT, 0x30);// shift + 0 
    //shift + 1 = kill 
    //shift + 2 = death 
    //shift + 3 = reset 
    //shift + 0 = close; 
    int exit = 0; 
    int kill = 0; 
    int death = 0; 

    // There's no console here so cout won't work, you'll need to use MessageBox or make a file log somewhere 
    cout << "K: " << kill << endl; 
    cout << "D: " << death; 

    do 
    { 
     int showKill = kill; 
     int showDeath = death; 
     do 
     { 
      MSG msg = {0}; 
      if (GetMessageA(&msg, NULL, 0, 0) != 0) 
       if(msg.message == WM_HOTKEY) 
       { 
        if(msg.wParam == 1) 
         kill++; 
        else if(msg.wParam == 2) 
         death++; 
        else if(msg.wParam == 3) 
        { 
         kill = 0; 
         death = 0; 
        } 
        else 
        { 
         exit++; 
         break; 
        } 
       } 
     } 
     while(kill == showKill && death == showDeath); 

     system("CLS");//clear the console 
     cout << "K: " << kill << endl; 
     cout << "D: " << death; 
    }while(exit == 0); 


    UnregisterHotKey(NULL, 1); 
    UnregisterHotKey(NULL, 2); 
    UnregisterHotKey(NULL, 3); 
    UnregisterHotKey(NULL, 4); 
} 

BOOL WINAPI DllMain(HINSTANCE hModule, DWORD fdwReason, LPVOID lpvReserved) 
{ 
    if (fdwReason == DLL_PROCESS_ATTACH) 
    { 
     CreateThread(NULL, NULL, KeyThread, NULL, NULL, NULL); 
    } 
    return TRUE; 
} 

После компиляции DLL вам вам нужно будет ввести его в свой игровой процесс, я бы рекомендовал Winject или Extreme Injector. Если вы смельчак, вы можете пойти и написать его самостоятельно. Я должен отметить, что если ваша игра основана на многопользовательской игре, и она использует antiheat, вы можете вызвать какое-то нарушение, если этот антихрит использует систему белых списков для сканирования игровых модулей вместо черного списка.

2-й подход заключается в создании нормального исполняемого файла и SetWindowsHookEx для мониторинга событий клавиатуры низкого уровня. Я сам написал это давным-давно, но так как я не мог найти его, я просто предоставил вам example of keylogger, который использует этот подход, некоторые небольшие модификации, и он должен работать отлично, я взял на себя смелость и макет вещи для вас:

#include <windows.h> 
#include <stdio.h> 

HHOOK hKeyboardHook = NULL; 
LRESULT WINAPI LowLevelKeyboardProc(int nCode, WPARAM wParam, LPARAM lParam) 
{ 
    if ((nCode == HC_ACTION) && ((wParam == WM_SYSKEYDOWN) || (wParam == WM_KEYDOWN))) 
    { 
     KBDLLHOOKSTRUCT hooked_key = *((KBDLLHOOKSTRUCT*)lParam); 
     DWORD dwMsg = 1; 
     dwMsg += hooked_key.scanCode << 16; 
     dwMsg += hooked_key.flags << 24; 
     char lpszKeyName[1024] = { 0 }; 
     lpszKeyName[0] = '['; 
     int i = GetKeyNameText(dwMsg, (lpszKeyName + 1), 0xFF) + 1; 
     int key = hooked_key.vkCode; 
     lpszKeyName[i] = ']'; 

     if (key >= 'A' && key <= 'Z') 
     { 
      if (GetAsyncKeyState(VK_SHIFT) >= 0) 
      { 
       key += 0x20; 
      } 
       printf("%c \n", key); 
     } 

     else 
     { 
      printf("%s \n", lpszKeyName); 
     } 
    } 
    return CallNextHookEx(hKeyboardHook, nCode, wParam, lParam); 
} 


int main() 
{ 
    MSG message; 
    HINSTANCE hins; 
    hins = GetModuleHandle(NULL); 
    hKeyboardHook = SetWindowsHookEx(WH_KEYBOARD_LL, (HOOKPROC)LowLevelKeyboardProc, hins, 0); 

    // Message pump 
    while (GetMessage(&message, NULL, 0, 0)) 
    { 
     TranslateMessage(&message); 
     DispatchMessage(&message); 
    } 
    UnhookWindowsHookEx(hKeyboardHook); 
    return 0; 
} 

Этот второй подход может быть определен как вредоносные программы с помощью некоторых антивирусов, но он будет иметь возможность печатать вещи в консоли без тонкой настройки и менее сложным и простым для начинающих.

Я должен упомянуть, что примеры кода не были протестированы, поэтому может возникнуть некоторая синтаксическая ошибка, но сама логика должна быть правильной.

+1

Так что в принципе мне нужно превратить это в «настоящий» кейлоггер (простой способ) Имеет смысл, спасибо большое! – user3352374

0

Для конкретных Windows, это должно быть легко сделать с помощью:

GetAsyncKeyState()

Прочитайте документацию, так как это дает состояние ключа и конкретный бит включения/выключения, когда клавиша нажата/вверх.