c# - 在任务栏中从 C# 应用程序聚焦 Windows 资源管理器

标签 c# windows winforms process

我们公司有作为任务栏图标运行的应用程序 - 除了任务栏图标之外没有 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);  

这会使任务栏中的窗口闪烁,但它仍然没有聚焦。

如何让窗口出现在屏幕前面?

最佳答案

您可以使用 Shell.Application scripting interface要求资源管理器创建并显示一个新窗口。我相信使用类型化接口(interface)也可以做到这一点,但目前我不知道确切的接口(interface)。

var shellApplication = Type.GetTypeFromProgID("Shell.Application");
dynamic shell = Activator.CreateInstance(shellApplication);
shell.Open(@"C:\drop\");

这似乎打开了带有焦点的窗口(在 Win 8.1 上使用定时器在 30 秒后打开进行了测试,然后在聚焦的 Web 浏览器中导航直到定时器触发)。

关于c# - 在任务栏中从 C# 应用程序聚焦 Windows 资源管理器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20224673/

相关文章:

windows - Intel Visual Fortran 中 C_INT32_T 的负值

C#:WAITING变量变为非空

c# - 当所有异步方法调用完成时引发事件

windows - Strawberry Perl——默认情况下编码转换在哪里完成?

c# - 将用户名传递给表单但用户名返回 null c#

.net - 绑定(bind)到 EntityCollection 时如何让 Windows 窗体 DataGridView 显示新记录

c# - 在父窗体上启用滚动条

c# - 如何以百分比设置 XAML 宽度?

c# - 设置窗口位置

windows - 是否可以确定哪个键盘发送了按键?