当我的应用程序处于 Shell 模式时,如何访问手动启动的资源管理器句柄?



我的应用程序是在Shell模式下运行的(通过注册表更改)。

允许用户定义自定义"按钮"以调用公用事业,例如CMD,Regedit,Explorer ...

用户按按钮使用其指定的实用程序打开窗口。

按下实用程序窗口的最小化按钮将驱动应用程序代码缩小并将窗口移至屏幕底部,然后将其随后由用户移动或扩展。

除了Explore.exe。

,这很好地工作了

在以下代码中,proc.mainwindowhandle为emplorer.exe为空/零。

知道这是一个"特殊情况"程序,是否有任何方法可以确定explorer.exe的mainwindowhandle,以便该程序也可以管理它?

// Minimize all utility windows
Process[] procs = Process.GetProcesses();
Process currentProcess = Process.GetCurrentProcess();
IntPtr hWnd;
foreach (Process proc in procs)
{
    if (proc.Id != currentProcess.Id)
    {
        if ((hWnd = proc.MainWindowHandle) != IntPtr.Zero)
        {
            WINDOWPLACEMENT wp = new WINDOWPLACEMENT();
            GetWindowPlacement(hWnd, ref wp);
            if (wp.showCmd != (int)ShowWindowCommand.ShowMinimized || wp.showCmd != (int)ShowWindowCommand.Minimize || wp.showCmd != (int)ShowWindowCommand.ShowMinNoActive)
            {
                ShowWindowAsync(hWnd, (int)ShowWindowCommand.ShowMinimized);
            }
            SetWindowPos(hWnd, HWND_TOPMOST, 0, 0, 0, 0, SetWindowPosFlags.IgnoreMove | SetWindowPosFlags.DoNotActivate | SetWindowPosFlags.IgnoreResize);
        }
    }
}
  • 致电EnumWindows枚举顶级窗口。
  • 调用GetWindowThreadProcessId查找拥有窗口的过程ID。
  • 致电OpenProcess获取过程句柄。
  • 致电GetModuleFileNameEx查找可执行的名称。
  • 检查可执行的名称以查看是否是资源管理器。

当然,资源管理器流程可能负责多个顶级窗口,因此可能需要更多的工作才能确定所需的特定窗口。

最新更新