ShowWindow не может показать или свернуть диспетчер задач - PullRequest
0 голосов
/ 28 марта 2019

Мне нужно показать приложение Task Manager программно, развернуть его и свернуть как любое другое окно, но есть проблема, и оно просто не отвечает на ShowWindow (int hWnd, int nCmdShow).

Iя уверен, что использую правильный дескриптор, потому что перечислил все окна с помощью EnumWindows (обратный вызов PCallBack, int lParam), и единственным окном, которое не ответило, было окно диспетчера задач с заголовком process.MainWindowTitle = "Диспетчер задач", ядаже вручную нашел свой дескриптор, используя spy ++, но он по-прежнему не отвечает на SW_SHOWNORMAL или любой другой параметр nCmdShow.Я пытался запускать приложения в качестве администратора, чтобы увидеть, связано ли это с проблемой, но они продолжали вести себя как обычно, когда была дана правильная ручка функции ShowWindow;

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 голосов
/ 18 июня 2019

он просто не отвечает на 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;
    
...