Прячем кнопку Пуск, панель задач, часики

в 10:01, , рубрики: windows api, Программирование, метки: ,

С помощью нескольких функций Windows API можно скрыть кнопку Пуск, панель задач или отдельные ее элементы. Я это делал раньше с помощью Visual Basic 6.0, Delphi, C++, Visual Basic.NET на Windows 98/Me/XP. Попробуем теперь это сделать с помощью C# на Windows 7. Практической ценности данный пример не имеет, может только ради шутки. Но тем не менее, пример может послужить неплохой демонстрацией возможностей, которые скрывают системные функции Windows.

Немного теории. Очень часто программисты хотят получить доступ к стандартным элементам интерфейса Рабочего стола Windows. Для начинающих программистов будет интересно узнать, что панель задач и кнопка Пуск являются окнами (собственно отсюда и название операционной системы). Поэтому, все, что нам нужно, это получить описатель нужного окна, а затем при помощи соответствующих функций скрыть или показать это окно.

Чтобы получить описатель окна, нужно знать имя класса.

Для панели задач это класс Shell_TrayWnd
для кнопки Пуск — Button
для области уведомлений — TrayNotifyWnd
для области системных часов — TrayClockWClass

Нам понадобятся все несколько функций для такой грандиозной задачи.

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

[DllImport("user32.dll")]
private static extern IntPtr FindWindowEx(
    IntPtr hwndParent, IntPtr hwndChildAfter,
    string className, string windowName);

[DllImport("user32.dll")]
private static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);

[DllImport("user32.dll")]
[return: MarshalAs(UnmanagedType.Bool)]
static extern bool SetWindowPos(
    IntPtr hWnd, 
    IntPtr hWndInsertAfter, 
    int X, int Y, int cx, int cy, 
    SetWindowPosFlags uFlags);

Теперь объявим несколько переменных для каждого элемента.


private IntPtr TaskbarHWnd;  // Описатель панели задач
private IntPtr StartButtonHWnd; // Описатель кнопки Пуск
private IntPtr TrayNotifyHWnd; // Описатель области уведомлений
private IntPtr ClockHwnd; // Описатель области системных часов

Предварительные приготовления готовы. Можно приступать к скрытию/показу элементов панели задач

Панель задач

Чтобы скрыть панель задач, нужно найти его описатель и скрыть окно при помощи функции ShowWindow.

// Прячем только панель задач. Кнопка Пуск остается видна
// Получим дескриптор панели задач            
TaskbarHWnd = FindWindow("Shell_TrayWnd", null);

//  Прячем/показываем панель задач
if (TaskbarHWnd != IntPtr.Zero)
{
    ShowWindow(TaskbarHWnd, show ? SW_SHOW : SW_HIDE);
}
show = !show;

Кнопка Пуск

Стоит отметить, что предыдущий код прячем только панель задач, а кнопка ПУСК при этом остается видимой. Хотя раньше в Windows 98/XP кнопка ПУСК была частью панели задач и скрывалась вместе с ней (если вы помните, это действительно была прямоугольная кнопка). Чтобы скрыть и саму кнопку, придется еще раз вызывать пару функций:

StartButtonHWnd = FindWindow("Button", null);

if (StartButtonHWnd != IntPtr.Zero)
{
    //ShowWindow(StartButtonHWnd, show ? SW_SHOW : SW_HIDE); // работала в Windows XP
    SetWindowPos(StartButtonHWnd, IntPtr.Zero, 0, 0, 0, 0, 
        show ? SetWindowPosFlags.SWP_SHOWWINDOW : SetWindowPosFlags.SWP_HIDEWINDOW);
}

Как видите, на этот раз для скрытия кнопки мы используем другую функцию — SetWindowPos, так как ShowWindow теперь не скрывает ее, как это было раньше. Стоит отметить, что при повторном щелчке кнопка ПУСК не появляется самостоятельно на экране. Необходимо подвести указатель мыши к тому месту, где находится ПУСК, и кнопка снова отрисуется. Вероятно, можно вызвать какую-нибудь функцию, которая принудительно заставила бы отрисовать кнопку на экране, но я не стал этим заморачиваться. Если найдете решение, то пришлите его мне.

Соответственно, можно прятать только кнопку ПУСК, не трогая саму панель задач.
Область уведомлений

Область уведомлений прячется по такому же принципу, как и панель задач.


TaskbarHWnd = FindWindow("Shell_TrayWnd", null);

TrayNotifyHWnd = FindWindowEx(TaskbarHWnd, IntPtr.Zero, "TrayNotifyWnd", null);

// Прячем область уведомлений
ShowWindow(TrayNotifyHWnd, show ? SW_HIDE : SW_SHOW);
show = !show;

Часики

В предыдущем примере мы скрывали область уведомлений вместе с часиками. Чтобы скрыть только часики, не трогая область уведомлений, нужно немного постараться. Сначала мы находим описатель области уведомлений, а затем находим его дочернее окно TrayClockWClass

TaskbarHWnd = FindWindow("Shell_TrayWnd", null);
TrayNotifyHWnd = FindWindowEx(TaskbarHWnd, IntPtr.Zero, "TrayNotifyWnd", null);

// Описатель системных часов
ClockHwnd = FindWindowEx(TrayNotifyHWnd, IntPtr.Zero, "TrayClockWClass", null);
// Прячем системные часы
ShowWindow(ClockHwnd, show ? SW_HIDE : SW_SHOW);
show = !show;

image

Автор: vladiheg

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js