我有一个带有工具提示按钮的窗口。单击该按钮将显示一个对话框窗口。当焦点从应用程序切换到其他应用程序(例如记事本),然后单击带有可见工具提示Process.GetCurrentProcess().MainWindowHandle
的按钮时,与在显示工具提示之前单击按钮或焦点位于应用程序上时,单击按钮返回的句柄不同,就会出现问题。
我正在使用该句柄通过WindowInteropHelper
设置对话框的所有者。当分配了错误的句柄并显示对话框时,对话框将显示半秒钟,然后消失。主窗口被阻止,必须杀死该应用程序。
我已经检查了调用堆栈,并且该过程在ShowDialog
方法中停止,等待对话框关闭。我还检查了导致该对话框关闭的原因,并且是一些与工具提示连接的Windows API会强制关闭该对话框。
据我所知,WPF为每个窗口创建句柄,但是该窗口中的每个控件都与该句柄相关(与Win32中每个控件都有自己的hwnd不同)。但是,诸如下拉菜单,上下文菜单之类的弹出窗口有其自己的句柄。也许同样的情况适用于工具提示。如果是这样,根据我所知道的情况,似乎当应用程序失去焦点时,MainWindowHandle
属性将返回工具提示的句柄,而对话框的所有者就是该工具提示。单击按钮后,工具提示将关闭,并且应用程序被卡住。我已经读过here。但是,奇怪的是,当应用程序聚焦时,一切都可以正常运行。而且,下面的日志也很奇怪。将鼠标悬停在按钮MainWindowHandle
上会返回正确的句柄,但是单击它会切换到其他内容。
当应用程序失去焦点并单击按钮时,来自工具提示的Opening
和Closing
事件的调试日志:
Tooltip Opening - MainWindowHandle: 198116
Tooltip Opening - MainWindowTitle: MainWindow
------
Tooltip Closing - MainWindowHandle: 2295110
Tooltip Closing - MainWindowTitle:
------
带有工具提示的按钮的单击处理程序:
private void ClickMeButtonClick(object sender, RoutedEventArgs e)
{
var myDialog = new MyDialogWindow();
var process = Process.GetCurrentProcess();
MainWindowHandle = process.MainWindowHandle;
MainWindowTitle = process.MainWindowTitle;
var windowInterop = new WindowInteropHelper(myDialog) {Owner = MainWindowHandle};
myDialog.ShowDialog();
}
我不确定这是否是错误。也许我做错了什么?还是问题出在其他地方? 请注意,由于WPF托管在MFC窗口中,因此必须使用WindowInteropHelper
和Process.GetCurrentProcess().MainWindowHandle
。但是,我能够在一个简单的WPF应用程序中重现此问题。