我在 .NET 中使用 PInvoke 使用 SetForegroundWindow API。
当我在 Visual Studio 中调试时使用 API 时,它工作得很好。但当应用程序正常运行时,它并不总是有效。
我在调用 SetForegroundWindow 之前放置了一些日志,并确认 API 正在被调用,但有时不会生效。我也看到了一些关于这个问题的帖子,但我想知道为什么它失败了。
帖子的链接如下:
- Win32 SetForegroundWindow 不可靠
- SetForegroundWindow 仅在 Visual Studio 打开时有效
事实上,这是一个纯粹的 Win32 问题,而不是 .net 特定的问题。 .net框架建立在Win32之上,这里Win32的规则正在向您反映。
的文档SetForegroundWindow全面解释您面临的问题。本质上是设计面临的问题SetForegroundWindow
是它可以用于焦点窃取。焦点是用户应该控制的东西。改变焦点的应用程序可能会很麻烦。所以SetForegroundWindow
尝试防御焦点窃取者。
文档说:
系统限制哪些进程可以设置前台窗口。 A
仅当满足以下条件之一时,进程才能设置前台窗口
条件为真:
- 该进程是前台进程。
- 该进程是由前台进程启动的。
- 该进程接收到最后一个输入事件。
- 没有前台进程。
- 进程正在调试中。
- 前台进程不是现代应用程序或开始屏幕。
- 前景未锁定(请参阅LockSetForegroundWindow)。
- 前台锁定超时已过期(请参阅 SystemParametersInfo 中的 SPI_GETFOREGROUNDLOCKTIMEOUT)。
- 没有菜单处于活动状态。
当用户使用时,应用程序不能强制窗口到前台
正在使用另一个窗口。相反,Windows 会闪烁任务栏
窗口的按钮来通知用户。
您几乎肯定违反了这些标准。请注意,正在调试的进程始终被授予设置前台窗口的权限。这解释了为什么您在调试时没有看到任何问题。但在调试器之外,如果您的进程不是前台进程,则调用SetForegroundWindow
fail.
这都是设计使然。您对此的反应应该是尝试提出一种不需要您尝试调用的设计SetForegroundWindow
当您的进程不是前台进程时。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)