有沒有辦法做我所問。但是我們發現了一個解決方案。 「簡單地」在Windows窗體中嵌入xaml窗口。
這是我們遵循的步驟:
1 - Windows窗體添加到項目中。
2 - 刪除app.xaml並使新窗體成爲應用程序的入口點。
3 - 由於我們需要我們增加了這個道具的代碼背後
public IntPtr Hwnd
{
get { return new WindowInteropHelper(this).Handle; }
}
4 main.xaml的HWND - 然後從窗體的構造函數,我們創建WPF窗口類
的一個實例
private Main app;
public ContainerForm()
{
InitializeComponent();
app = new Main();
ElementHost.EnableModelessKeyboardInterop(app);
}
我們需要
ElementHost.EnableModelessKeyboardInterop(app);
,因爲我們希望所有的鍵盤輸入,從通過windows窗體到xaml窗口
5 - 現在我們要將xpf窗口綁定到winform。爲了做到這一點,我們需要使用Windows Api,我們在窗體的OnShow事件中執行它(之所以稍後將解釋)。
[DllImport("user32.dll", SetLastError = true)]
private static extern long SetFocus(IntPtr hWnd);
[DllImport("user32.dll", SetLastError = true)]
private static extern long SetParent(IntPtr hWndChild, IntPtr hWndNewParent);
[DllImport("user32.dll", SetLastError = true)]
private static extern bool MoveWindow(IntPtr hwnd, int x, int y, int cx, int cy, bool repaint);
[DllImport("user32.dll", EntryPoint = "SetWindowLongA", SetLastError = true)]
private static extern long SetWindowLong(IntPtr hwnd, int nIndex, long dwNewLong);
private const int GWL_STYLE = (-16);
private const int WS_VISIBLE = 0x10000000;
private void ContainerForm_Shown(object sender, EventArgs e)
{
app.Show();
SetParent(app.Hwnd, this.Handle);
SetWindowLong(app.Hwnd, GWL_STYLE, WS_VISIBLE);
MoveWindow(app.Hwnd, 0, 0, this.Width, this.Height, true);
SetFocus(app.Hwnd);
}
與
SetParent(app.Hwnd, this.Handle);
を做魔術,然後用
SetWindowLong(app.Hwnd, GWL_STYLE, WS_VISIBLE);
我們從WPF窗口中刪除人的鉻(存在即使窗口被定義無邊界的邊界,不要問我爲什麼)
然後我們使wpf窗口填充winform的所有客戶區域
MoveWindow(app.Hwnd, 0, 0, this.Width, this.Height, true);
,然後我們把重點放在WPF窗口
SetFocus(app.Hwnd);
這就是爲什麼我們在做節目時的一切。因爲如果我們在窗體的構造函數中執行它,那麼wpf窗口將失去焦點,因爲在winform中,主窗口從操作系統獲得焦點。
我們不明白爲什麼我們現在需要添加其他api調用,但是如果我們將它們留在構造函數中,那麼這個技巧就無法工作。
反正 問題就解決了;)
如果細您的解決方案,但我們的目的是不是有用,因爲是傳統的應用程序,啓動我們的應用程序,所以類名應該是唯一的 –
@ Stefano.net - 當您在Spy ++中使用查找窗口工具該類的輸出是什麼:???這正是你在問題中展示的例子嗎? http://msdn.microsoft.com/en-us/library/dd460750.aspx –
是的。正如我在問題中所述,guid每次執行都會發生變化 –