4

ゲーム内のいくつかのキーボードキーを変更する必要があるビジュアルC++を使用してプログラムを作成しています。

私は以前 kHook = SetWindowsHookEx(WH_KEYBOARD_LL,setkey,NULL,0); 、コンピューターでキーが押されていることを知っていて FindWindow() 、そのゲームでキーが押されるようにするためにコードを処理する必要があるゲームを見つけました。

ただし、スペースがクリックされたときなど、いくつかのキーを無効にする必要があります。スペースがクリックされたことをゲームが認識しないようにする必要があります。そのゲームのスペースを実際に無効にするにはどうすればよいですか。たくさん検索しましたが、何も得られませんでした。

4

2 に答える 2

3

LowLevelKeyboardProcコールバック関数のMSDNドキュメントを注意深くお読みください。答えがあります。

基本的にあなたはあなたのLowLevelKeyboardProc実装に必要です(setkey?):

  1. とメッセージを確認wParamしてくださいWM_KEYDOWNWM_KEYUP
  2. vkCodeが指す構造から確認しlParamてくださいVK_SPACE
  3. 1と2が両方とも真の場合、処理されたメッセージを食べるためにゼロ以外を返します
于 2012-09-08T20:37:50.903 に答える
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;

}
于 2012-09-09T07:07:09.610 に答える