Я постараюсь описать мою проблему и вопрос как можно более четко,
Я пытаюсь создать программу, которая позволила бы вам подключить две клавиатуры и мыши к одному компьютеру и играть в две копии одной и той же игры одновременно, разделив их входные данные для разных окон приложений. Я не нашел хорошего инструмента для этого онлайн, поэтому я делаю свой собственный.
Из всех моих исследований и испытаний кажется, что 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: Обновлено, потому что я немного улучшил программу и, надеюсь, моя проблема стала яснее
Также: у меня есть теория, что может делает это из-за того, как меняется изображение курсора в игровом клиенте. Так что, может быть, есть какой-то скрытый аспект того, что нарушает то, что я пытаюсь сделать.