Я запрограммировал программу для обновления моего отношения k / d во время потоковой передачи, и я хотел, чтобы она была простой в использовании, в основном, чтобы можно было нажимать «shift + 1» для увеличения моих убийств и т. Д.
Теперь он работает, когда я нахожусь в Google Chrome и некоторых других приложениях, но когда я в игре, в данном случае Arma, когда я нажимаю эти клавиши, он просто не делает этого, я должен Alt + Tab и затем нажмите клавиши, и это сработает.
Есть ли способ сделать так, чтобы приоритет захвата клавиш программы был абсолютным, то есть более важным, чем Arma, и будет захватывать, даже если я в игре?
Спасибо
Код:
#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;
}
Исходя из того, что я могу придумать, у меня есть два довольно простых способа решить эту проблему, если вы играете в игру для Windows:
Первый подход требует, чтобы вы написали модуль 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. Если вы смельчак, вы можете пойти и написать один самостоятельно. Я должен отметить, что если ваша игра основана на многопользовательском режиме и использует античит, вы можете вызвать какое-то нарушение, если этот античит использует систему белых списков для поиска игровых модулей вместо черного списка.
2-й подход — сделать обычный исполняемый файл и SetWindowsHookEx для мониторинга низкоуровневых событий клавиатуры. Я сам написал это давным-давно, но так как я не мог найти это, я просто предоставлю вам пример кейлоггера который использует этот подход, некоторую небольшую модификацию, и он должен работать отлично, я взял на себя смелость и разложил основные вещи для вас:
#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;
}
Этот второй подход может быть обнаружен как вредоносное ПО некоторыми антивирусами, но он сможет печатать данные в консоль без каких-либо настроек и является менее сложным и простым для начинающих.
Я должен упомянуть, что примеры кода не были протестированы, поэтому может быть некоторая синтаксическая ошибка, но сама логика должна быть правильной.
Для Windows, это должно быть легко сделать с:
GetAsyncKeyState ()
Прочитайте документацию, так как это дает информацию о состоянии ключа, и определенный бит включается / выключается, когда ключ нажат / вверх.