4

WPFUserControlをHandleによって他のウィンドウでホストする必要があります。私は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を使用して完全な機能を取得するにはどうすればよいですか?

4

1 に答える 1

0

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;
于 2012-08-07T13:20:13.703 に答える