1

ゲームのキーストロークをシミュレートするプログラムを作成しました。「v」を押すまで待機してから、シミュレートします。

- open console (p)
- ctrl + a
- copy to clipboard some stuff
- ctrl + v
- enter
- close console (p)

奇妙なことに、Visual StudioリリースモードでF5キーを押すと期待どおりに機能しますが、リリースフォルダーから.exeをダブルクリックすると、プログラムのバグが発生し、ウィンドウが正しく開いてレンダリングされますが、キーストロークを入力する以外のすべてを無視するには(つまり、「v」を押した後、ゲームのチャットモードでim)、入力インジェクションには、すばやくダーティなC++ライブラリを使用します。コードは次のとおりです。

#include <stdlib.h>
#include <Windows.h>

extern "C"
{

__declspec(dllexport ) void InjectKey(int c, int flags)
{
    char ch = (char)c;
    INPUT key;
    memset(&key, 0, sizeof(INPUT));
    key.type = INPUT_KEYBOARD;
    key.ki.dwExtraInfo = GetMessageExtraInfo();
    key.ki.wScan = static_cast<WORD>(MapVirtualKeyEx(VkKeyScan(ch), MAPVK_VK_TO_VSC, GetKeyboardLayout(0)));
key.ki.dwFlags = KEYEVENTF_SCANCODE | flags;

SendInput(1, &key, sizeof(INPUT));
}

__declspec(dllexport ) void InjectKeyDirect(int code, int flags)
{
    INPUT input = { 0 };
    input.type = INPUT_KEYBOARD;
    input.ki.dwFlags = KEYEVENTF_SCANCODE | flags;
    input.ki.wScan = MapVirtualKeyEx(code, MAPVK_VK_TO_VSC, GetKeyboardLayout(0));
    SendInput(1, &input, sizeof(INPUT));
}

__declspec(dllexport ) void InjectKeyPress(int code, int flags)
{
    InjectKey(code, flags);
    InjectKey(code, KEYEVENTF_KEYUP | flags);
}

__declspec(dllexport ) void InjectKeyPressDirect(int code, int flags)
{
    InjectKeyDirect(code, flags);
    InjectKeyDirect(code, KEYEVENTF_KEYUP | flags);
}

私はこのようにPInvokeでC#の関数を使用します

            [DllImport("InputInjector.dll", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
    public static extern void InjectKey(int c, int flags = 0);[DllImport("InputInjector.dll", ExactSpelling = false, CallingConvention = CallingConvention.Cdecl)]
    public static extern void InjectKey(int c, int flags = 0);

どんな助けでも喜んでいます!

4

0 に答える 0