Как отправить ключи в неактивное окно DirectX ePSXe?

Мне нужно отправить ключ в неактивное окно "ePSXe" с помощью C#. Я получил дескриптор окна с помощью Spy++, но когда я использовал этот код для отправки ключа «x», я ничего не получил. Что я должен делать?

Я пробовал разные значения Msg как 0x0100, 0x0101 и 0x0102, но ничего не получалось. Я также пробовал SendMessage, и результаты были такими же.

[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
private void Send_X(IntPtr p)
{
    PostMessage(p, 0x0100, (IntPtr)Keys.X, IntPtr.Zero);
}

Я ожидаю, что окно ответит на мой ключ. Мне удалось отправить только F-клавиши "F1, F2..", но не буквенные клавиши.

SendMessage(p, 0x0100, (IntPtr)Keys.F4, IntPtr.Zero);
SendMessage(p, 0x0101, (IntPtr)Keys.F4, IntPtr.Zero);

Я думаю, что отправить в неактивное игровое приложение непросто, однако это решение мне очень помогло, но я должен сосредоточиться на ePSXe. Отправка ключей в игру DirectX.

Я все еще ищу решение, которое может отправить в неактивное окно игры.


person AbdelAziz AbdelLatef    schedule 15.06.2019    source источник
comment
Если ваш комментарий выше важен для вашего вопроса, отредактируйте его, иначе он может быть удален.   -  person Samuel Liew♦    schedule 10.10.2019
comment
Почему бы не использовать SetForegroundWindow(p), чтобы вывести окно наверх, чтобы оно имело фокус ввода, а затем SendKeys.SendWait(X)?   -  person MikeFromCanmore    schedule 16.10.2019
comment
В настоящее время я использую это SetForegroundWindow(p) как несовершенное решение. Моя конечная цель - отправлять ключи без необходимости выводить окно на передний план, поскольку я хочу одновременно управлять несколькими окнами.   -  person AbdelAziz AbdelLatef    schedule 16.10.2019
comment
Как ты получил ручку? Прямая копия из Spy++? FindWindow()?   -  person live627    schedule 18.10.2019
comment
Используя этот handle = Process.GetProcessesByName("ePSXe")[0].MainWindowHandle;, я подтверждаю его с помощью Spy++.   -  person AbdelAziz AbdelLatef    schedule 18.10.2019


Ответы (1)


Process P = ...get process; 
IntPtr whandle= P.MainWindowHandle;
PostMessage(whandle, WM_KEYDOWN, (IntPtr)(Keys.X), IntPtr.Zero);

Это работает, если у вас есть MainWindowHandle этого процесса, иначе нет.

person divyang4481    schedule 16.10.2019
comment
Значения sr дескриптора окна нестабильны, они, вероятно, будут меняться при каждом запуске вашего целевого приложения. И вам нужно найти верхнее окно этого процесса. в противном случае ваше сообщение не будет обработано. А также убедитесь, что дескриптор вашего окна не IntPtr.zero - person divyang4481; 16.10.2019
comment
Я уже знаю это. Я получил дескриптор и не сомневаюсь в этом, но это не проблема, так как я могу успешно отправить F4. Проблема с буквенными клавишами. - person AbdelAziz AbdelLatef; 17.10.2019