我的应用程序是在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
查找可执行的名称。 - 检查可执行的名称以查看是否是资源管理器。
当然,资源管理器流程可能负责多个顶级窗口,因此可能需要更多的工作才能确定所需的特定窗口。