2012-06-26 63 views
4

我需要在Handle的其他窗口中託管我的WPF UserControl。 我試着使用HwndSource:在使用HwndSource的Win32應用程序中託管WPF UserControl

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; 

但在這種情況下箭頭鍵和Tab鍵不起作用。

如果我用ElementHost的一切都OK了:

[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完整的功能?

回答

0

當您使用HwndSource時,您必須爲Windows消息註冊一個處理程序。

,這可以通過調用來完成:

src.AddHook(this.messageHook); 

掛鉤必須檢查WM_GETDLGCODE消息。通過Dlgc_WantChars,Dlgc_WantTab,Dlgc_WantArrows和你需要什麼Dlgc_WantAllKeys

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; 
    } 

回報。

檢查此用於消息和代碼: 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;