Отправка макрокоманд клавиатуры в Windows игры - PullRequest
2 голосов
/ 02 января 2009

Я хочу сделать макропрограмму для игры. Но есть проблема с отправкой ключей только в игровое приложение (игровое окно). Я использую keybd_event API для отправки ключей в окно игры. Но я хочу только отправлять ключи в игровое окно, а не в проводник или любое открытое окно, когда моя макропрограмма работает. Когда я изменил окна, он все еще посылал ключи. Я пытался использовать Interaction.App со ссылкой Visual Basic.dll. Но Interaction.App только Фокус игрового окна.

Я не смог найти ничего о моей проблеме. Может кто-нибудь мне помочь? Thanx

Ответы [ 5 ]

2 голосов
/ 05 января 2009

я исправил свою проблему. в этом поле;

PostMessage (hWnd, WM_KEYDOWN, ключ, {должен дать lParam ключа} );

в противном случае это не работает. И мы можем управлять классом ChildWindow с помощью инструмента Spy ++ от Microsoft.

Спасибо всем за помощь.

1 голос
/ 02 января 2009
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);
1 голос
/ 02 января 2009

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

API SendMessage:
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
1 голос
/ 02 января 2009

Вы постоянно получаете дескриптор окна или помните его?

Если вы используете API FindWindow (), вы можете просто сохранить дескриптор и использовать API SendMessage для ручной отправки событий клавиш / мыши.

0 голосов
/ 02 января 2009

Если вы хотите общаться с игрой, вам, как правило, приходится иметь дело с DirectInput, а не с обычным API клавиатуры.

...