Размещение WPF UserControl в приложении Win32 с использованием HwndSource
Мне нужно разместить мой WPF UserControl в другом окне с помощью дескриптора. Я пытался использовать HwndSource:
var userControl = new MyUserControl();
var parameters = new HwndSourceParameters();
parameters.WindowStyle = 0x10000000 | 0x40000000;
parameters.SetPosition(5, 5);
parameters.SetSize(300, 300);
parameters.ParentWindow = parentWindowHwnd;
var src = new HwndSource(parameters);
src.RootVisual = userControl;
Но в этом случае стрелки и клавиши табуляции не работают.
Если я использую ElementHost все в порядке:
[DllImport("user32.dll", SetLastError = true)]
static extern IntPtr SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
var userControl = new UserControl1();
var elementHost = new ElementHost();
elementHost.Child = userControl;
elementHost.Left = 5;
elementHost.Top = 5;
elementHost.Width = 300;
elementHost.Height = 300;
SetParent(elementHost.Handle, parentWindowHwnd);
Как я могу получить полную функциональность, используя HwndSource?
1 ответ
Когда вы используете HwndSource, вы должны зарегистрировать обработчик для сообщений Windows.
это можно сделать по телефону:
src.AddHook(this.messageHook);
Хук должен проверять наличие сообщения wm_getdlgcode.
private IntPtr messageHook(IntPtr hwnd, int msg, IntPtr wparam, IntPtr lparam, ref bool handled)
{
switch (msg)
{
case WmGetDlgCode:
{
handled = true;
return (IntPtr)(DlgcWantChars | DlgcWantTab | DlgcWantArrows | DlgcWantAllKeys);
}
}
return IntPtr.Zero;
}
вернуть через Dlgc_WantChars, Dlgc_WantTab, Dlgc_WantArrows и Dlgc_WantAllKeys то, что вам нужно.
проверьте это для сообщения и кодов: http://msdn.microsoft.com/en-us/library/windows/desktop/ms645425(v=vs.85).aspx
private const int WmGetDlgCode = 0x0087;
private const int DlgcWantChars = 0x0080;
private const int DlgcWantTab = 0x0002;
private const int DlgcWantAllKeys = 0x0004;
private const int DlgcWantArrows = 0x0001;