【发布时间】:2013-11-26 18:05:55
【问题描述】:
我们公司有作为任务栏图标运行的应用程序 - 除了任务栏图标之外没有 UI。
某些事件会导致任务栏启动 explorer.exe 以显示目录。用户交互不会导致这种情况,因此我们的应用程序没有焦点。
我可以使用如下代码在 Windows 资源管理器中显示目录:
Process.Start("explorer.exe", "c:\somedirectory");
问题是,文件夹在后台启动,我似乎无法集中注意力。
部分问题是 explorer.exe 进程立即退出,单独启动 explorer.exe 进程。我可以使用Process.processes() 找到启动的窗口,并查看窗口标题和进程的开始时间。
一旦我最终掌握了流程(并等待它打开),我就会努力集中注意力。这是我尝试过的:
//trying to bring the application to the front
form.TopMost = true;
form.Activate();
form.BringToFront();
form.Focus();
Process process = ...;
ShowWindow(process.Handle, WindowShowStyle.ShowNormal);
SetForegroundWindow(process.Handle);
SwitchToThisWindow(process.Handle, true);
ShowWindow(process.MainWindowHandle, WindowShowStyle.ShowNormal);
SetForegroundWindow(process.MainWindowHandle);
SwitchToThisWindow(process.MainWindowHandle, true);
这会使窗口在任务栏中闪烁,但仍然没有焦点。
我怎样才能让窗口来到屏幕的前面?
【问题讨论】:
-
问题是:你想要吗?当您在另一个窗口中输入时弹出一个窗口是非常烦人的。闪烁的图标应该告诉应用程序需要交互。
-
你读过
SetForegroundWindow的文档吗?特别是 Remarks 部分中的要点。执行摘要是该系统旨在阻止您窃取注意力。换句话说,处理这个问题的正确方法是设计你的程序,使它不会试图窃取焦点。 -
交互是由用户在网络浏览器中发起的——基本上他们需要通过点击内网页面上的链接来启动一个文件夹。确实没有其他选择(我们已经探索了浏览器插件等),这正是用户想要的。任何想法如何聚焦窗口是可能的?
-
你需要搜索焦点窃取
-
真正的焦点窃取实际上是在 .NET 中实现的,它使用 Dirty Trick。在大家最喜欢的程序集中,拨打AppActivate() method。
标签: c# windows winforms process