ShowWindow无法显示或最小化任务管理器

时间:2019-03-28 15:03:20

标签: c# pinvoke taskmanager user32

我需要以编程方式显示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;

基本上这是我的问题。需要帮助。

1 个答案:

答案 0 :(得分:0)

  

它根本不响应ShowWindow(int hWnd,int nCmdShow)。

我在Windows 10上进行了测试,对我来说很有效:

  • 带有 level =“ requireAdministrator”
  • 的清单文件
  • 测试:

    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;