Скрыть Start Orb в Vista / Win 7 в C #

При скрытии панели задач в Vista и Windows 7 кнопка «Пуск» (также известная как «Пуск») не скрывается. Я искал решение этой проблемы и нашел одно, но оно кажется более сложным, чем необходимо. Эта статья CodeProject описывает (и содержит код) решение, в котором вы перечисляете все дочерние окна всех потоков в процессе, содержащем меню «Пуск».

Кто-нибудь нашел более простое решение?

Просто для справки. Код для скрытия панели задач (без скрытия сферы) выглядит следующим образом. Сначала выполните необходимый импорт и объявления Win32.

[DllImport("user32.dll")]
private static extern IntPtr FindWindow(string className, string windowText);

[DllImport("user32.dll")]
private static extern int ShowWindow(IntPtr hwnd, int command);


private const int SW_HIDE = 0;
private const int SW_SHOW = 1;

Затем в каком-нибудь методе вызовите их с правильными аргументами

IntPtr hwndTaskBar = FindWindow("Shell_TrayWnd", "");
ShowWindow(this.hwndTaskBar, SW_HIDE);

person Waylon Flinn    schedule 22.07.2009    source источник
comment
Я думаю, что это несколько повторяющийся вопрос. Кто-то уже отправлял запрос, как скрыть панель задач, и предложенное решение - иметь форму.WindowState = FormWindowState.Maximized; form.FormBorderStyle = FormBorderStyle.None; Эта комбинация должна хорошо скрывать панель задач. У меня нет проблем с этим на Win7. На Vista не пробовал.   -  person Jimmy Chandra    schedule 22.07.2009
comment
Это не скрывает панель задач. Он прикрывает это.   -  person Waylon Flinn    schedule 22.07.2009
comment
См. stackoverflow.com/questions/505167/   -  person Jimmy Chandra    schedule 22.07.2009
comment
Ах ... ты хочешь, чтобы он ушел альтогехтер? :)   -  person Jimmy Chandra    schedule 22.07.2009
comment
да. Я не могу позволить себе покрыть весь экран одним окном.   -  person Waylon Flinn    schedule 22.07.2009
comment
Вы можете создать дополнительное окно, которое закрывает экран, а затем позволить другим вашим окнам делать все, что им нравится. Не бегайте, скрывая панель задач вручную - что, если бы это сделали две программы? Или что, если ваша программа выйдет из строя до того, как у нее появится возможность показать ее?   -  person Raymond Chen    schedule 21.03.2012
comment
Сбой программы @RaymondChen перед раскрытием - определенно проблема с этим подходом. Возможно, вы поможете найти более чистый способ сделать это, включенный в ОС? Как я указал в комментарии непосредственно над вашим, у меня нет возможности покрыть весь экран одним окном.   -  person Waylon Flinn    schedule 21.03.2012
comment
Единственный вариант - создание полноэкранного окна. Разве вы не можете просто выделить рабочий поток, чтобы создать фиктивное полноэкранное окно?   -  person Raymond Chen    schedule 22.03.2012


Ответы (1)


Мне удалось собрать решение, которое не требовало перечисления всех потоков. Вот соответствующие части.

Если вы объявите FindWindowEx следующим образом

[DllImport("user32.dll")]
private static extern IntPtr FindWindowEx(
       IntPtr parentHwnd,
       IntPtr childAfterHwnd,
       IntPtr className,
       string windowText);

Затем вы можете получить доступ к ручке окна для начальной сферы следующим образом:

IntPtr hwndOrb = FindWindowEx(IntPtr.Zero, IntPtr.Zero, (IntPtr)0xC017, null);

и отключите Start Orb следующим образом:

ShowWindow(hwndOrb, SW_HIDE);

Ключом к этому методу является то, что мы используем тип IntPtr для переменной className вместо строки в функции FindWindowEx. Это позволяет нам использовать часть этой функции, которая принимает тип ATOM, а не string. Я смог определить, что конкретный ATOM для использования находится на 0xC017 из этого сообщения: Скрыть стартовую сферу Vista

Надеюсь, эта упрощенная версия поможет некоторым людям.

ОБНОВЛЕНИЕ: я создал эту новую страницу проекта кода, чтобы задокументировать этот процесс.

person Waylon Flinn    schedule 22.07.2009