Впервые со времён Windows 95 решил убрать кнопку Пуск
Не, ну накой она нужна? Если все рабочие приложения на панели задач, как на маке, какой от неё толк? Речь о Win10, так как Win11 ставить неохота, для тестов своих скриптов и 10 хватает.
Кота за яйца тянуть не будем. Вот код на C++ main.cpp:
#include <windows.h>
#include <iostream>
#include <tlhelp32.h>
int main() {
// ШАГ 1. Проверяем, работает ли уже копия программы
DWORD currentPid = GetCurrentProcessId();
WCHAR currentExeName[MAX_PATH];
GetModuleFileNameW(NULL, currentExeName, MAX_PATH);
// Вырезаем только имя файла из полного пути
WCHAR* exeName = wcsrchr(currentExeName, L'\\');
if (exeName) exeName++; else exeName = currentExeName;
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (hSnapshot == INVALID_HANDLE_VALUE) return false;
PROCESSENTRY32W pe;
pe.dwSize = sizeof(PROCESSENTRY32W);
bool found = false;
if (Process32FirstW(hSnapshot, &pe)) {
do {
// Если имя процесса совпадает, но это НЕ наш текущий процесс
if (wcscmp(pe.szExeFile, exeName) == 0 && pe.th32ProcessID != currentPid) {
HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, pe.th32ProcessID);
if (hProcess) {
// Закрываем фоновый процесс
TerminateProcess(hProcess, 0);
CloseHandle(hProcess);
// 1. Находим главное окно Панели задач
HWND hTrayWnd = FindWindowW(L"Shell_TrayWnd", NULL);
if (hTrayWnd != NULL) {
// 2. Находим кнопку Пуск
HWND hStartBtn = FindWindowExW(hTrayWnd, NULL, L"Button", NULL);
if (hStartBtn == NULL) hStartBtn = FindWindowExW(hTrayWnd, NULL, L"Start", NULL);
// 3. Находим блок с иконками программ (ReBarWindow32)
HWND hReBar = FindWindowExW(hTrayWnd, NULL, L"ReBarWindow32", NULL);
if (hStartBtn != NULL && hReBar != NULL) {
// Узнаем текущие размеры блока с программами
RECT reBarRect;
GetWindowRect(hReBar, &reBarRect);
// Переводим глобальные координаты экрана в локальные координаты внутри Панели задач
POINT pt = { reBarRect.left, reBarRect.top };
ScreenToClient(hTrayWnd, &pt);
int width = reBarRect.right - reBarRect.left;
int height = reBarRect.bottom - reBarRect.top;
// Показываем кнопку Пуск
ShowWindow(hStartBtn, SW_SHOW);
// Возвращаем блок с программами на его законное место (X = 48 пикселя от края - 2 пикселя левой рамки)
// Уменьшаем ширину обратно
MoveWindow(hReBar, 48 - 2, pt.y, width - 51, height, TRUE);
// Принудительно приказываем Панели задач перерисоваться
InvalidateRect(hTrayWnd, NULL, TRUE);
UpdateWindow(hTrayWnd);
std::cout << "Restored to default" << std::endl;
}
}
found = true;
}
}
} while (Process32NextW(hSnapshot, &pe));
}
CloseHandle(hSnapshot);
if (found) {
return 0;
}
// ШАГ 2. Если это первый запуск, уходим в бесконечный цикл контролирования панели задач
while (true) {
// 1. Находим главное окно Панели задач
HWND hTrayWnd = FindWindowW(L"Shell_TrayWnd", NULL);
if (hTrayWnd != NULL) {
// 2. Находим кнопку Пуск
HWND hStartBtn = FindWindowExW(hTrayWnd, NULL, L"Button", NULL);
if (hStartBtn == NULL) hStartBtn = FindWindowExW(hTrayWnd, NULL, L"Start", NULL);
// 3. Находим блок с иконками программ (ReBarWindow32)
HWND hReBar = FindWindowExW(hTrayWnd, NULL, L"ReBarWindow32", NULL);
if (hStartBtn != NULL && hReBar != NULL) {
// Узнаем текущие размеры блока с программами
RECT reBarRect;
GetWindowRect(hReBar, &reBarRect);
// Переводим глобальные координаты экрана в локальные координаты внутри Панели задач
POINT pt = { reBarRect.left, reBarRect.top };
ScreenToClient(hTrayWnd, &pt);
int width = reBarRect.right - reBarRect.left;
int height = reBarRect.bottom - reBarRect.top;
// Сдвигаем блок с программами, если кнопка всё еще видима ИЛИ если координаты блока сбросились (не равны -3)
if (IsWindowVisible(hStartBtn) || pt.x != -3) {
// Скрываем кнопку Пуск
ShowWindow(hStartBtn, SW_HIDE);
// Двигаем блок с программами в самый левый край (X = -3)
// И увеличиваем его ширину на 51 пикселей (48 размер кнопки Пуск + 3 отступ), чтобы иконки не сжались
MoveWindow(hReBar, -3, pt.y, width + 51, height, TRUE);
// Принудительно приказываем Панели задач перерисоваться
InvalidateRect(hTrayWnd, NULL, TRUE);
UpdateWindow(hTrayWnd);
std::cout << "Hidden and shifted" << std::endl;
}
} else {
std::cout << "Elements not found" << std::endl;
return 1;
}
} else {
std::cout << "Tray not found" << std::endl;
return 1;
}
// Засыпаем на 100 миллисекунд
// Благодаря этому программа потребляет 0% процессора и 0.5 МБ оперативной памяти
Sleep(100);
}
return 0;
}
Следуем советам нейронки и ставим компилятор через MSYS2: