我有一个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