SetForegroundWindow 在对话框窗口中使用时不起作用
Posted
技术标签:
【中文标题】SetForegroundWindow 在对话框窗口中使用时不起作用【英文标题】:SetForegroundWindow is not working when used on dialog window 【发布时间】:2021-10-28 23:56:16 【问题描述】:我有一个使用ShowDialog()
方法从WPF 应用程序显示的窗口。在这个对话框窗口中,我需要调用原生的SetForegroundWindow
来将其他一些应用程序带到前台,然后我需要再次调用SetForegroundWindow
来让这个窗口回到前台。
可以使用按钮(具有命令绑定)或键(处理 KeyUp 事件并调用 ShowDialog()
)打开对话窗口。
单击按钮时一切正常(显示对话框 -> 另一个应用程序进入前台 -> 对话框再次进入前台)。但是,当使用该键时,在其他应用程序上使用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
。
【问题讨论】:
听起来像是 Windows API 中的一个错误......也许可以模拟按键来解决这个问题?其他人有类似(但不同)的问题并以这种方式修复:***.com/questions/10740346/… 感谢马修的帮助!也许我做错了什么,因为单击事件以正确的状态打开对话框窗口,而 keyup 事件却没有。但是,在窗口上模拟按键来解决这个问题感觉有点hacky,但如果没有其他选择,我会使用这种方法。 【参考方案1】:如果您的最终目标是确保您的对话框窗口是最顶部的窗口,而另一个应用程序是其下方的窗口,那么使用 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));
【讨论】:
感谢谭贝的帮助!不幸的是,我的最终目标不是让另一个窗口就在我的对话窗口后面。第一个 SetForegroundWindow 更像是给定的。我不能用 SetWindowPos 替换它。使用 SetForegroundWindow 将另一个应用程序置于前台,然后执行一些自定义逻辑。当一切都完成后,我需要将我的对话窗口带回前台(使用 SetForegroundWindow 或其他东西)。以上是关于SetForegroundWindow 在对话框窗口中使用时不起作用的主要内容,如果未能解决你的问题,请参考以下文章
SetForegroundWindow 不适用于最小化进程[重复]