Отправка сообщений клавиатуры WM_INPUT в приложение HWNDHOST
Я все еще новичок в C# и WPF, в качестве учебного упражнения я строю простую оболочку в WPF для неуправляемого приложения Win32 C++. В настоящее время у меня есть неуправляемое приложение, размещенное с помощью HWNDHOST
в контроле WPF и получаю WM_INPUT
сообщения для ввода с помощью мыши, но когда дело доходит до ввода с клавиатуры, я получаю только WM_KEYUP/DOWN
сообщения для клавиатуры, но нет WM_INPUT
Сообщения.
Размещенное приложение, к сожалению, использует исключительно RawInput
и поэтому требует WM_INPUT
сообщения для системы ввода с клавиатуры для функционирования.
Код C# для хостинга приложения приведен ниже:
class EngineHost : HwndHost
{
#region Win32
private const int SWP_NOZORDER = 0x0004;
private const int SWP_NOACTIVATE = 0x0010;
private const int GWL_STYLE = -16;
private const int WS_CAPTION = 0x00C00000;
private const int WS_THICKFRAME = 0x00040000;
private const int WS_CHILD = 0x40000000;
[DllImport("user32.dll")]
private static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong);
[DllImport("user32.dll", SetLastError = true)]
private static extern int GetWindowLong(IntPtr hWnd, int nIndex);
[DllImport("user32")]
private static extern IntPtr SetParent(IntPtr hWnd, IntPtr hWndParent);
#endregion
#region Members
private Process _process;
#endregion
#region Implementation
protected override HandleRef BuildWindowCore(HandleRef hwndParent)
{
ProcessStartInfo psi = new ProcessStartInfo("Kruger.exe");
psi.WindowStyle = ProcessWindowStyle.Minimized;
_process = Process.Start(psi);
_process.WaitForInputIdle();
// The main window handle may be unavailable for a while, just wait for it
while (_process.MainWindowHandle == IntPtr.Zero)
{
Thread.Yield();
}
IntPtr engineHandle = _process.MainWindowHandle;
int style = GetWindowLong(engineHandle, GWL_STYLE);
style = style & ~((int)WS_CAPTION) & ~((int)WS_THICKFRAME); // Removes Caption bar and the sizing border
style |= ((int)WS_CHILD); // Must be a child window to be hosted
SetWindowLong(engineHandle, GWL_STYLE, style);
SetParent(engineHandle, hwndParent.Handle);
return new HandleRef(this, engineHandle);
}
protected override void DestroyWindowCore(HandleRef hwnd)
{
if (_process != null)
{
_process.CloseMainWindow();
_process.WaitForExit(5000);
if (_process.HasExited == false)
{
_process.Kill();
}
_process.Close();
_process.Dispose();
_process = null;
}
}
#endregion
}
Может кто-нибудь сказать мне, почему WM_INPUT
сообщения клавиатуры не создаются для размещенного приложения, и как / если я могу это исправить?