我有一個WPF項目下面的C#代碼:WPF窗口應該是有模式,以本地所有者窗口,但不
private static void RunConfig(string owner)
{
long ownerHandle;
var settingsWindow = new SettingsWindow();
if (long.TryParse(owner, out ownerHandle))
{
WindowInteropHelper helper = new WindowInteropHelper(settingsWindow);
helper.Owner = new IntPtr(ownerHandle);
}
settingsWindow.ShowDialog();
}
的SettingsWindow沒有正確模態的所有者窗口(即我可以在SettingsWindow仍然打開的情況下關注所有者窗口,與之交互,甚至關閉所有者窗口)。我究竟做錯了什麼?
對於上下文,此代碼是屏幕保護程序的一部分,所有者窗口是控制面板屏幕保護程序選擇窗口(通過命令行參數傳入句柄以用作所有者)。我知道IF語句正在評估真實和正確解析句柄。
我已經使用SetWindowLongPtr
方法從user32.dll
也嘗試(編譯爲64位,因此不使用SetWindowLong
),其是簡要描述here並且在使用中here所示。此方法適用於WinForms,但在WPF中似乎不起作用。幫助我Obi-Wan Kenobi,你是我唯一的希望。
是'SettingsWindow'一個winforms窗口?因爲如果'SettingsWindow'是WPF,'ShowDialog()'應該阻止對主WPF窗體的訪問 –
不,SettingsWindow是一個WPF窗口。我的程序沒有打開任何其他窗口,沒有「主」窗口。控制面板屏幕保護程序選擇窗口是一個本地窗口,它應該被設置爲settingsWindow的所有者。 ShowDialog()會阻止我的程序的UI線程,但這不是問題。我需要settingsWindow來防止焦點和與控制面板窗口的交互,直到settingsWindow關閉(即[模態窗口](http://en.wikipedia)。org/wiki/Modal_window) – Jargon
我注意到,當使用WindowInteropHelper來設置窗口的所有者時,窗口現在總是位於所有者之上,即使所有者仍然可以獲得焦點並與之交互。 所以它正在做一些事情,而不是它應該做的一切...... – Jargon