c语言中键盘捕获用什么,C++即使在游戏中也能捕获键盘特定的键

从我可以从我的头顶断认为,有两个非常简单的方法如何解决此假设你正在玩一个游戏在Windows上:

你写一个钩子,并在运行时将它注入game.exe。

您使用SetWindowsHookEx并捕获键盘低级输入事件。

1的方法需要你写一个dll模块,并与你将能够使用你的大部分已经写好的代码,它应该是这样的:

#include

#include

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。如果你是一个冒失鬼,你可以自己写一个。我必须注意到,如果你的游戏是基于多人游戏并且使用了反向加热,那么如果反向加热使用白名单系统扫描游戏模块而不是黑名单,你可能会触发某种进攻。

第二种方法是使正常的可执行文件和SetWindowsHookEx来监视低级别的键盘事件。我自己写了很久以前,但因为我找不到它,我只是简单地给你提供一个使用这种方法的example of keylogger,稍作修改,它应该完美地工作,我冒昧并且布置一个基本的东西给你:

#include

#include

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;

}

这第二种方法可能会被检测为一些防病毒软件的恶意软件,但它能够打印的东西到一个控制台没有任何调整,是那么复杂,简单的初学者。

我必须提到代码示例没有经过测试,所以可能会有一些语法错误,但逻辑本身应该是正确的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值