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

时间:2014-02-05 17:19:32

标签: windows shell windows-explorer

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

允许用户定义自定义“按钮”以调用CMD,Regedit,Explorer等实用程序......

当用户按下按钮时,会打开一个带有指定实用程序的窗口。

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

除了Explore.exe之外,这很好用。

在以下代码中,对于Emplorer.exe,proc.MainWindowHandle为空/零。

知道这是一个“特例”程序,有没有办法确定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);
        }
    }
}

1 个答案:

答案 0 :(得分:0)

当然,资源管理器进程可能负责多个顶级窗口,因此可能需要更多工作来识别您正在寻找的特定窗口。