2

ゲーム用のマクロプログラムを作りたいです。しかし、ゲーム アプリケーション (ゲーム ウィンドウ) だけにキーを送信するのには問題があります。keybd_eventゲーム ウィンドウにキーを送信するために API を使用しています。しかし、マクロ プログラムの実行中に、キーをゲーム ウィンドウに送信したいだけで、エクスプローラーや開いているウィンドウには送信したくありません。Windowsを変更しても、まだキーを送信しています。参考に使っInteraction.Appてみました。Visual Basic.dllただしInteraction.App、ゲームウィンドウにフォーカスするだけです。

私の問題について何も見つかりませんでした。誰でも私を助けることができますか?ありがとう

4

5 に答える 5

2

問題を修正しました。この分野で ;

PostMessage(hWnd、WM_KEYDOWN、key、{キーのlParamを指定する必要があります});

それ以外の場合は機能しません。MicrosoftのSpy++ツールを使用してChildWindowクラスを制御できます。

助けてくれてありがとう。

于 2009-01-05T06:44:28.190 に答える
1
class SendKeySample
{
    private static Int32 WM_KEYDOWN = 0x100;
    private static Int32 WM_KEYUP = 0x101;

    [return: MarshalAs(UnmanagedType.Bool)]
    [DllImport("user32.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, int Msg, System.Windows.Forms.Keys wParam, int lParam);

    [DllImport("user32.dll", SetLastError = true)]
    private static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);

    public static IntPtr FindWindow(string windowName)
    {
        foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses())
        {
            if (p.MainWindowHandle != IntPtr.Zero && p.MainWindowTitle.ToLower() == windowName.ToLower())
                return p.MainWindowHandle;
        }

        return IntPtr.Zero;
    }

    public static IntPtr FindWindow(IntPtr parent, string childClassName)
    {
        return FindWindowEx(parent, IntPtr.Zero, childClassName, string.Empty);
    }

    public static void SendKey(IntPtr hWnd, System.Windows.Forms.Keys key)
    {
        PostMessage(hWnd, WM_KEYDOWN, key, 0);

    }
}

呼び出しコード

        var hWnd = SendKeySample.FindWindow("Untitled - Notepad");
        var editBox = SendKeySample.FindWindow(hWnd, "edit");

        SendKeySample.SendKey(editBox, Keys.A);
于 2009-01-02T16:06:17.933 に答える
1

ウィンドウのハンドルを常に取得していますか、それとも覚えていますか?

FindWindow() API を使用すると、Handle を保存し、SendMessage API を使用してキー/マウス イベントを手動で送信できます。

于 2009-01-02T15:14:16.120 に答える
1

FindWindow API:
http://www.pinvoke.net/default.aspx/user32.FindWindowEx

SendMessage API:
http://www.pinvoke.net/default.aspx/user32/SendMessage.html

VB

Private Const WM_KEYDOWN As Integer = &H100
Private Const WM_KEYUP As Integer = &H101

C#

private static int WM_KEYDOWN = 0x100
private static int WM_KEYUP = 0x101
于 2009-01-02T15:31:10.983 に答える
0

ゲームと通信したい場合は、通常、通常のキーボード API ではなく、DirectInput を処理する必要があります。

于 2009-01-02T15:26:28.013 に答える