c# - SetForegroundWindow 在对话框窗口中使用时不起作用
问题描述
我有一个使用该ShowDialog()
方法从 WPF 应用程序显示的窗口。在这个对话框窗口中,我需要调用本机SetForegroundWindow
以将其他应用程序带到前台,然后我需要SetForegroundWindow
再次调用以将该窗口带回前台。
可以使用按钮(具有命令绑定)或键(处理和ShowDialog()
调用 KeyUp 事件)打开对话框窗口。
单击按钮时一切正常(显示对话框-> 另一个应用程序进入前台-> 对话框再次进入前台)。但是,当使用该键时,对话窗口在其他应用程序上使用后不再被带到前台,SetForegroundWindow
并且任务栏呈橙色闪烁(表示该窗口请求前台,但Windows阻止它,因为它认为对话窗口正在试图窃取焦点)。
这是我在打开对话框窗口时使用的代码:
try
{
await BringApplicationIntoForegroundAsync(hWnd); // this code brings application into foreground at some point
// do some work
}
finally
{
SetForegroundWindow(hWnd);
}
如果我在调用之前发送任何键或单击对话框窗口BringApplicationIntoForegroundAsync(hWnd)
一切正常(即使对话框是使用键打开的)。
如果对话框是使用一个键打开的并且用户在第一个之前没有与之交互,SetForegroundWindow
那么第二个SetForegroundWindow
不起作用(返回false
)。
我的猜测是,当按钮用于打开对话框时,对话框以某种方式接收输入,Windows 允许它SetForegroundWindow
第二次调用。
解决方案
如果您的最终目标是确保您的对话窗口是最顶层的窗口,而另一个应用程序是它下面的窗口,那么使用SetForegroundWindow
两次将不是正确的选择,因为正如您所说,当您SetForegroundWindow
第二次调用时,您的应用程序不再有焦点(另一个应用程序有),因此不能这样做。
相反,请尝试SetWindowPos。这将允许您在另一个窗口(您的对话窗口)之后专门设置一个窗口(另一个应用程序)。
例子:
SetWindowPos(OtherAppHandle, DialogWindowHandle, 0, 0, 0, 0,
(uint)(NativeMethods.SET_WINDOW_POSITION.SWP_NOSIZE |
NativeMethods.SET_WINDOW_POSITION.SWP_NOMOVE |
NativeMethods.SET_WINDOW_POSITION.SWP_NOACTIVATE |
NativeMethods.SET_WINDOW_POSITION.SWP_NOREDRAW));
推荐阅读
- python - 熊猫数据透视表不能在 2 个级别聚合
- android - Android Travis CI 无效 abi
- javascript - 无法按预期获得异步等待结果
- javascript - 将网站从 HTML、CSS、bootstrap 和 JQuery 转换为 React?
- python - 我的 Django 模型中只有一个主键,但它显示错误为多个主键
- laravel - Laravel 6:外键不保存
- python - 类型错误:尝试使用带有 Suds 的 Windows 身份验证 (Python NTLM) 时的预期字符串或类似字节的对象
- c++ - 函数返回零大小的字符串,即使它的大小不为零
- python - Python 3 中嵌套 For 循环的最大深度是多少?
- python - 图中的python直方图打印bin频率