【发布时间】:2012-12-18 12:45:02
【问题描述】:
我在 WPF 项目中有以下 C# 代码:
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 语句正在评估 true 并正确解析句柄。
我还尝试使用user32.dll 中的SetWindowLongPtr 方法(针对x64 编译,因此不使用SetWindowLong),该方法在here 中进行了简要描述,并在使用here 中显示。此方法适用于 WinForms,但似乎不适用于 WPF。帮助我欧比旺克诺比,你是我唯一的希望。
【问题讨论】:
-
SettingsWindow是一个winforms 窗口吗?因为如果SettingsWindow也是 WPF,ShowDialog()应该阻止访问您的主 WPF 表单 -
不,SettingsWindow 是 WPF 窗口。我的程序没有打开任何其他窗口,没有“主”窗口。控制面板屏保选择窗口,是一个原生窗口,是应该设置为settingsWindow所有者的窗口。 ShowDialog() 确实阻止了我程序的 UI 线程,但这不是问题。我需要 settingsWindow 来防止焦点和与控制面板窗口的交互,直到 settingsWindow 关闭(即modal window
-
我注意到,当使用 WindowInteropHelper 设置窗口的所有者时,窗口现在总是在所有者之上,即使所有者仍然可以接收焦点并与之交互。所以它正在做一些事情,而不是它应该做的一切......
标签: c# wpf window native owner