ゲームのキーストロークをシミュレートするプログラムを作成しました。「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);
どんな助けでも喜んでいます!