Отправка ввода мышью в другое приложение без фокуса - PullRequest
0 голосов
/ 16 января 2019

Я постараюсь описать мою проблему и вопрос как можно более четко,

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

Из всех моих исследований и испытаний кажется, что SendMessage и PostMessage - моя лучшая ставка. Я перехватывал сообщения WM_INPUT и отправлял их нужному приложению, и до сих пор это работало ... до некоторой степени.

У меня есть два видео, чтобы помочь вам понять проблему, с которой я столкнулся: Первый просто показывает, что моя программа работает так, как я ожидал при отправке ввода в Chrome. Когда я прокручиваю и нажимаю на окно InputMapper, вы можете видеть, как Chrome реагирует на наложенный курсор, как будто я прокручиваю его прямо над ним. Видео 1: Ницца

Второе видео показывает, что я делаю то же самое с клиентом игры, и по какой-то причине это не совсем правильно работает. Просто он не работает с фиктивным курсором, но он реагирует на курсор real , даже если окно технически не имеет фокуса (что говорит мне о том, что PostMessage работает, но это просто отказывается подтверждать щелчки в месте расположения фиктивного курсора вместо реального курсора). Видео 2: Не совсем

Так что мой вопрос прост: я использую один и тот же код в обоих сценариях, но оба приложения реагировали по-разному, и это не совсем работало для игрового клиента. У кого-нибудь есть идеи, почему у меня такое поведение? Похоже, что игра по какой-то причине все еще регистрирует клики как в месте реального курсора, а не в месте L_PARAM, который я отправляю.

Чтобы привести пример моего кода для обработки событий щелчка мыши, перейдите:

private void m_MouseButtonDown(object sender, InputDevice.MouseControlEventArgs e)
    {
        if (e.Mouse.deviceHandle != MouseHandle1)
            return;

        uint L_Param_Window = (uint)(cursorPosX + ((int)cursorPosY << 16));

        uint W_Param = 0;
        switch (e.Mouse.buttonMessage)
        {
            case WM_LBUTTONDOWN:
                W_Param = (uint)MouseButtons.LEFT;
                break;
            case WM_MBUTTONDOWN:
                W_Param = (uint)MouseButtons.MIDDLE;
                break;
            case WM_RBUTTONDOWN:
                W_Param = (uint)MouseButtons.RIGHT;
                break;
        }

        // Send Messages
        PostMessage(applicationHandle1, e.Mouse.buttonMessage, (IntPtr)W_Param, (IntPtr)L_Param_Window);
    }

Заранее спасибо.

Редактировать: исправлены ссылки на видео, потому что я заметил, что я дурачок

Редактировать 2: Обновлено, потому что я немного улучшил программу и, надеюсь, моя проблема стала яснее Также: у меня есть теория, что может делает это из-за того, как меняется изображение курсора в игровом клиенте. Так что, может быть, есть какой-то скрытый аспект того, что нарушает то, что я пытаюсь сделать.

1 Ответ

0 голосов
/ 18 января 2019

Вы можете отправить клавиатуру сообщения или мышь сообщения на определенный дескриптор с помощью Sendmessage, указав дескриптор, но проблема заключается в том, чтобы определить источник сообщения: какое устройство отправляет это сообщение ?? Чтобы различать устройства ввода, вам нужно использовать Raw Input API. Это требует некоторых навыков ....

...