C # Использование PostMessage - PullRequest
       62

C # Использование PostMessage

1 голос
/ 03 августа 2011

Я пытаюсь отправить ключ в приложение. Я протестировал значение Handlewindow, используя точки останова, чтобы понять, что я делаю с этим, но не могу найти решение. Если быть более точным, это небольшая игра, и когда я активирую игру в чате, там будет написан ключ, который я хочу отправить, но я хочу сделать его функциональным, когда я играю, чтобы использовать команды. В игре нет охранника или защиты.

Вот мой код:

[DllImport("user32.dll")]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);

    const uint WM_KEYDOWN = 0x0100;

    private void button1_Click(object sender, EventArgs e)
    {
        string pName = textBox1.Text;


        //Get Processes
        Process[] processes = Process.GetProcessesByName(pName);

        //Main part
        foreach (Process p in processes)
            if (p.ProcessName == (string)pName)
            {
                    PostMessage(p.MainWindowHandle, WM_KEYDOWN, (int)Keys.W, 0);
            }


    }

Как я уже сказал, его можно успешно отправить 1000000 раз, но ничего не происходит. Есть ли другой способ, как я могу отправить ключи в приложение Windows, которое работает в свернутом или скрытом виде? Это должно быть только отправить в мое приложение.

Ответы [ 4 ]

1 голос
/ 03 августа 2011

Если я правильно понимаю, вы хотите отправить ключи в игру.В этом случае я думаю, что игра не получает ключи из очереди сообщений Windows, возможно, она читает состояние клавиатуры напрямую, используя DirectX или аналогичные способы.

См. Аналогичный вопрос:

Отправка клавиш в игры

0 голосов
/ 03 августа 2011

Вы не можете имитировать подобные сообщения и ожидать, что оно будет работать надежно - все, что вы делаете, это отправляете сообщение, ничего особенного.

Что это означает, что если целевая программа проверяет ввод вдругим способом (например, путем прямой проверки состояния ключа, реагирования на разные сообщения или просто с использованием совершенно другого механизма) целевая программа в лучшем случае может просто полностью игнорировать ваш ввод, а в худшем - полностью запутаться.

Использовать SendInput функция вместо этого (я не уверен, выставлено ли это как часть .Net framework или нет).

Некоторые интересные статьи блога, которые довольно актуальны:

0 голосов
/ 03 августа 2011

Вы должны использовать SendInput для имитации ввода в другое окно.

См. это сообщение в блоге для более подробной информации.

0 голосов
/ 03 августа 2011

Часто программисты будут реагировать на KeyUp события, а не на сбой; Вы пытались отправить WM_KEYUP?

...