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 在对话框窗口中使用时不起作用的主要内容,如果未能解决你的问题,请参考以下文章

原生Js弹窗插件|web弹出层组件|对话框

Android重构与设计之路,从整理提示对话框弹窗开始

SetForegroundWindow 不适用于最小化进程[重复]

Android FlycoDialog 简单实用的自定义Android弹窗对话框之Dialog篇

React全局浮窗对话框

JS中的弹窗问题confirm和prompt