我知道为什么这是一个坏主意的所有原因。我不喜欢它,如果一个应用程序窃取输入焦点,但这是纯粹的个人使用,我希望它发生;它不会打扰任何东西。
(for好奇的人:我正在NetBeans中运行单元测试,它会生成一个日志文件。当我的后台应用程序看到日志文件的时间戳更改时,我希望它解析日志文件并在前面显示结果。
This question没有帮助,谷歌也没有。似乎BringToFront()
已经不工作了很长一段时间,我找不到任何替代品。
有什么想法吗?
我知道为什么这是一个坏主意的所有原因。我不喜欢它,如果一个应用程序窃取输入焦点,但这是纯粹的个人使用,我希望它发生;它不会打扰任何东西。
(for好奇的人:我正在NetBeans中运行单元测试,它会生成一个日志文件。当我的后台应用程序看到日志文件的时间戳更改时,我希望它解析日志文件并在前面显示结果。
This question没有帮助,谷歌也没有。似乎BringToFront()
已经不工作了很长一段时间,我找不到任何替代品。
有什么想法吗?
8条答案
按热度按时间baubqpgj1#
这里有一些简单的东西,似乎工作,测试与多个盒子组成的XP,Server2003,Vista,Server2008,W7。测试应用程序运行与标准(或管理员)帐户,偷了输入焦点从记事本,而在前台写作。
字符串
如果需要的话,你可以进一步调整它,比如最小化应用程序等。
x4shl7ld2#
您无法可靠地执行此操作。Windows XP有一个允许此操作的解决方案,但此后的版本大多禁止此操作(请参阅下面的注解)。这在
SetForegroundWindow
上的MSDN文档的备注部分中有明确说明:系统限制哪些进程可以设置前台窗口。只有当下列条件之一为真时,进程才可以设置前台窗口:
当用户正在使用另一个窗口时,应用程序不能强制窗口到前台。相反,Windows会 Flink 窗口的“关闭”按钮以通知用户。
注意引用文件的最后一段,尤其是第一句。
的问题
这纯粹是个人使用,我希望它发生;它不会打扰任何东西。
任何应用程序都可以尝试做同样的事情。“纯粹个人使用”如何告诉它是你个人而不是任何应用程序?
注意事项:我已经尝试了所有我能想到的方法,让IDE的文档在我单击帮助工具按钮时显示在前台,但我所能得到的只是 Flink 的按钮(我作为用户希望它这样做)。
0h4hbjxa3#
我在我的一个应用程序中做了类似的事情,这个函数在xp/vista/w7中对我有效:
字符串
另一种解决方案是不窃取焦点,只是将窗口TOPMOST放在z缓冲区中:
型
t3irkdon4#
假设没有其他StayOnTop应用程序正在运行,您可以临时将表单FormStyle设置为fsStayOnTop,然后执行应用程序还原和BringToFront,然后将表单样式更改回原来的样式。
字符串
同样,这只适用于没有其他stayontop应用程序的情况。
vddsk6oq5#
字符串
icomxhvb6#
即使在Windows7+8操作系统中也应该可以工作。唯一的要求是应用程序本身可以调用函数。使用外部应用程序设置另一个进程的窗口前面更棘手。
字符串
编辑好了,我发现了一个问题。应用程序被带到前面,但焦点保留在原始应用程序中。使用这个答案来解决这个问题,它的方法相当复杂,但复制粘贴可以解决这个问题。在调用ForceForegroundWindow(wnd)之前,您可能必须调用Application.Restore unminimizing a window. https://stackoverflow.com/a/5885318/185565
e3bfsja27#
您可以编写一个Executable来解决这个限制。例如,一个简单的(非可视)应用程序(基本上是一个控制台应用程序,但没有{$APPTYPE CONSOLE}),其唯一目的是将所需的窗口放在前面。
当需要bringtofront操作时,您的监控后台应用程序通过命令行调用(例如ShellExecute)调用助手应用程序。由于此应用程序正在成为前台进程,因此它可以将其他窗口带到前台(SetForeGroundWindow)。您可以使用FindWindow获取目标窗口的句柄或在启动助手应用程序时传递适当的参数。
dfddblmv8#
Form.bringtofront;?
应该能用。如果你把它放进计时器里,它会一直在前面。