MainWindowHandle返回错误的IntPtr句柄

时间:2019-07-07 05:24:18

标签: c# wpf

我有一个带有工具提示按钮的窗口。单击该按钮将显示一个对话框窗口。当焦点从应用程序切换到其他应用程序(例如记事本),然后单击带有可见工具提示Process.GetCurrentProcess().MainWindowHandle的按钮时,与在显示工具提示之前单击按钮或焦点位于应用程序上时,单击按钮返回的句柄不同,就会出现问题。

我正在使用该句柄通过WindowInteropHelper设置对话框的所有者。当分配了错误的句柄并显示对话框时,对话框将显示半秒钟,然后消失。主窗口被阻止,必须杀死该应用程序。

我已经检查了调用堆栈,并且该过程在ShowDialog方法中停止,等待对话框关闭。我还检查了导致该对话框关闭的原因,并且是一些与工具提示连接的Windows API会强制关闭该对话框。

据我所知,WPF为每个窗口创建句柄,但是该窗口中的每个控件都与该句柄相关(与Win32中每个控件都有自己的hwnd不同)。但是,诸如下拉菜单,上下文菜单之类的弹出窗口有其自己的句柄。也许同样的情况适用于工具提示。如果是这样,根据我所知道的情况,似乎当应用程序失去焦点时,MainWindowHandle属性将返回工具提示的句柄,而对话框的所有者就是该工具提示。单击按钮后,工具提示将关闭,并且应用程序被卡住。我已经读过here。但是,奇怪的是,当应用程序聚焦时,一切都可以正常运行。而且,下面的日志也很奇怪。将鼠标悬停在按钮MainWindowHandle上会返回正确的句柄,但是单击它会切换到其他内容。

当应用程序失去焦点并单击按钮时,来自工具提示的OpeningClosing事件的调试日志:

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窗口中,因此必须使用WindowInteropHelperProcess.GetCurrentProcess().MainWindowHandle。但是,我能够在一个简单的WPF应用程序中重现此问题。

0 个答案:

没有答案