获取Windows资源管理器的进程句柄
本文关键字:进程句柄 资源管理器 Windows 获取 | 更新日期: 2023-09-27 18:36:47
我想获取我的"Windows Explorer"Windows(不是Internet Explorer)的句柄。
通常它适用于
var processes = Process.GetProcesses();
foreach (var process in processes)
{
var handle = process.Handle;
}
我想做的是:
将特定的资源管理器窗口带到ForeGround
。我已经实现了"ToForeGround"方法,它适用于除Windows资源管理器以外的所有其他Windows
我只能获得任务栏的进程,而与打开的Windows数量无关,只有一个"Windows资源管理器"进程。
或者有人可以解释为什么"Windows资源管理器"与其他程序不同吗?
观点很好,所以让我尝试简要解释一下代码的作用 - 你可以在这里阅读更多关于 ShellWindows 对象的信息。下面的代码可帮助您查找所有正在运行的 Windows 资源管理器实例(不是 Internet Explorer,请注意,在 if 语句中使用了"explorer",而不是"iexplore")。
添加对 Shell32.dll 的引用,位于 Windows/system32 文件夹中
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
string filename;
ArrayList windows = new ArrayList();
foreach (SHDocVw.InternetExplorer ie in shellWindows)
{
filename = Path.GetFileNameWithoutExtension(ie.FullName).ToLower();
if (filename.Equals("explorer"))
{
//do something with the handle here
MessageBox.Show(ie.HWND.ToString());
}
}
有人可以解释为什么"Windows资源管理器"与其他程序不同吗?
它是默认外壳。资源管理器.exe处理Windows的许多(用户界面)任务,其中一些是任务栏,托管扩展和托管文件资源管理器。
这是一个(某种)单实例进程,因此当您启动新实例时,它会将参数传递给正在运行的实例。
如果要在某个路径上聚焦或打开资源管理器,只需使用:
Process.Start(@"C:'SomeFolder'");
以下代码遍历所有资源管理器和 Internet Explorer 窗口(选项卡)(W7/IE11)。位置 URL 将提供在资源管理器中查看的文件夹。如果该文件夹是需要置于前台的文件夹,则可以将该窗口的HWND
用于前台并将其置于前台。
注意"计算机"的资源管理器窗口的位置 URL 将为空。我不确定是否还有更多这样的特殊情况。
SHDocVw.ShellWindows shellWindows = new SHDocVw.ShellWindows();
foreach (SHDocVw.InternetExplorer window in shellWindows){
if (window.LocationURL.Contains("Some Folder I am interested in")){
SetForegroundWindow((IntPtr)window.HWND);
}
}