如何禁用另一个程序中的密钥

How to disable a key in another program?

本文关键字:密钥 程序 何禁用 另一个      更新时间:2023-10-16

我正在用visual C++编写一个程序,该程序应该会更改游戏中的一些键盘键。

我曾经kHook = SetWindowsHookEx(WH_KEYBOARD_LL,setkey,NULL,0);了解电脑中的按键和FindWindow()找到我应该处理代码的游戏,以获得在该游戏中按下的键。

但我需要禁用一些键,例如当空间被点击时,我需要阻止游戏知道空间被点击了。实际上在那个游戏中禁用空间我该怎么办。我搜索了很多,但一无所获。

请仔细阅读LowLevelKeyboardProc回调函数MSDN文档。答案是有的。

基本上,您在LowLevelKeyboardProc实现(setkey?)中需要:

  1. 检查wParam是否有WM_KEYDOWNWM_KEYUP消息
  2. lParam指向的结构中检查vkCode是否为VK_SPACE
  3. 如果1和2都为真,则返回非零以吃掉已处理的消息

这个系统范围的键盘挂钩可能会让你半途而废。它检测空格键。

代码:

#define _WIN32_WINNT 0x0400
#pragma comment( lib, "user32.lib" )
#include <windows.h>
#include <stdio.h>
HHOOK hKeyboardHook;
__declspec(dllexport) LRESULT CALLBACK KeyboardEvent (int nCode, WPARAM wParam, LPARAM lParam)
{
    DWORD SHIFT_key=0;
    DWORD CTRL_key=0;
    DWORD ALT_key=0;
    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;
        lpszKeyName[i] = ']';
        int key = hooked_key.vkCode;
        SHIFT_key = GetAsyncKeyState(VK_SHIFT);
        CTRL_key = GetAsyncKeyState(VK_CONTROL);
        ALT_key = GetAsyncKeyState(VK_MENU);

        if (key ==VK_SPACE)   //Space key detected, do stuff
        {
            MessageBox(NULL, "Space key detected", "Keyboard hook", MB_OK); 
             return 1;
        }

    }
    return CallNextHookEx(hKeyboardHook,    nCode,wParam,lParam);
}
void MessageLoop()
{
    MSG message;
    while (GetMessage(&message,NULL,0,0)) 
    {
        TranslateMessage( &message );
        DispatchMessage( &message );
    }
}
DWORD WINAPI my_HotKey(LPVOID lpParm)
{
    HINSTANCE hInstance = GetModuleHandle(NULL);
    if (!hInstance) hInstance = LoadLibrary((LPCSTR) lpParm); 
    if (!hInstance) return 1;
    hKeyboardHook = SetWindowsHookEx (  WH_KEYBOARD_LL, (HOOKPROC) KeyboardEvent,   hInstance,  NULL    );
    MessageLoop();
    UnhookWindowsHookEx(hKeyboardHook);
    return 0;
}
int main(int argc, char** argv)
{
    HANDLE hThread;
    DWORD dwThread;
    hThread = CreateThread(NULL,NULL,(LPTHREAD_START_ROUTINE)   my_HotKey, (LPVOID) argv[0], NULL, &dwThread);

    if (hThread) return WaitForSingleObject(hThread,INFINITE);
    else return 1;
}