Отправка сообщений клавиатуры 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 сообщения клавиатуры не создаются для размещенного приложения, и как / если я могу это исправить?

0 ответов

Другие вопросы по тегам