我需要以编程方式显示Task Manager应用程序,将其最大化,并使其最小化,就像其他任何窗口一样,但是存在问题,并且它根本无法响应ShowWindow(int hWnd,int nCmdShow)。
我非常确定我使用了正确的句柄,因为我使用EnumWindows(PCallBack回调,int lParam)枚举了所有窗口,唯一没有响应的窗口是带有标题process.MainWindowTitle =“ Task的任务管理器窗口。管理器”,我什至使用spy ++手动找到了它的句柄,但它仍然不响应SW_SHOWNORMAL或任何其他nCmdShow参数。我尝试以管理员身份运行应用程序,以查看是否与该问题有关,但是在为ShowWindow函数赋予适当的句柄时,它们仍然表现出与往常一样的状态; </ p>
private delegate bool PCallBack(int hWnd, int lParam);
private static void ShowWindows()
{
EnumWindows(new PCallBack(FindWindows), 0);
}
private bool FindWindows(int handle, int lparam)
{
Console.WriteLine("showing");
ShowWindow(handle, (int)SW.SHOWMINIMIZED);
ShowWindow(handle, (int)SW.SHOWNORMAL);
Thread.Sleep(3000);
return true;
}
static void Main(string[] args)
{
ShowWindows();
}
此代码从字面上显示了EnumWindows可以找到的每个窗口,即使它们不可见,也从未显示过任务管理器,这向我证明了问题与错误的句柄无关。 这就是我的发现方式。
// the correct handle of Task Manager window
var handle = (int)Process.GetProcessesByName("taskmgr").FirstOrDefault().MainWindowHandle;
基本上这是我的问题。需要帮助。
答案 0 :(得分:0)
它根本不响应ShowWindow(int hWnd,int nCmdShow)。
我在Windows 10上进行了测试,对我来说很有效:
测试:
IntPtr hWndTarget = FindWindow("TaskManagerWindow", null);
bool bRet = ShowWindow(hWndTarget, SW_SHOWMINIMIZED);
带有声明:
[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Unicode)]
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
[DllImport("User32.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;