Как отключить кнопку «Пуск» (но не панель задач) в Windows 7?

В Windows XP можно было отключить кнопку «Пуск» с помощью следующего кода:

hTray = FindWindow (TEXT("Shell_TrayWnd"), NULL);
if (hTray)
{
    hStartButton = FindWindowEx(hTray, NULL, TEXT("Button"), NULL);
    if (hStartButton) ShowWindow(hStartButton, FALSE);
}

Для конфигурации компьютера с общедоступным доступом мне нужно иметь возможность сделать это в Windows 7. Кнопка «Пуск» должна быть отключена (а не просто скрыта), а остальная часть панели задач должна быть видимой и пригодной для использования. Скрытие панели задач вместе с кнопкой «Пуск» не вариант. Запуск в полноэкранном режиме не вариант. Использование «Start Killer» не будет работать, потому что оно на самом деле не отключает кнопку «Пуск», а просто скрывает ее (пользователи по-прежнему могут использовать горячие клавиши для вызова меню «Пуск»).

Я уже пробовал метод, который использует FindWindowEx с 0xC017 в качестве третьего параметра, а затем пытается отключить это окно. Это не работает. Этот метод работает только в том случае, если вся панель задач сначала отключена. Что мне нужно, так это метод, который только отключает меню «Пуск», точно так же, как код, который я воспроизвел выше, делает это в XP.

Любая помощь приветствуется.


person Josh G.    schedule 09.02.2011    source источник
comment
Часто объекты групповой политики являются правильным решением для таких вещей.   -  person Justin Morgan    schedule 09.02.2011
comment
Нет параметра групповой политики, чтобы полностью отключить кнопку «Пуск».   -  person Josh G.    schedule 09.02.2011
comment
Вы хотите запустить киоск-приложение? Почему тогда вы используете оболочку проводника. Вы должны указать Windows запустить свою собственную оболочку, и тогда вы не столкнетесь со всей этой ерундой.   -  person David Heffernan    schedule 09.02.2011


Ответы (3)


«Правильная» версия для Windows 7 показана ниже:

HWND hStartBtn = FindWindowEx(NULL, NULL, MAKEINTATOM(0xC017), TEXT("Start"));
if (hStartBtn != NULL)
{
    ShowWindow(hStartBtn, FALSE);
}

Однако при этом отключается только кнопка, то есть вы не получите свечение или другие эффекты, наведя на нее курсор мыши. Вы по-прежнему можете щелкнуть область кнопки на панели задач, чтобы открыть меню. По-видимому, обработчик кликов теперь реализован в самом окне панели задач, а не как часть отдельной кнопки "Пуск". Вот почему вам нужно сначала отключить всю панель задач, и, следовательно, большинство решений, которые вы нашли в Интернете, делают именно это.

Однако похоже, что приложение "Start Killer" теперь имеет функции для отключения наиболее распространенных горячих клавиш, которые вызвать меню «Пуск», а именно Ctrl+Esc и . Вы найдете эти параметры, запустив программное обеспечение, щелкнув правой кнопкой мыши его значок на панели задач и выбрав «Параметры» в меню. Вы также можете изменить реестр, чтобы отключить ключ Windows, как описано в этой статье базы знаний. Если вы хотите реализовать ту же самую функциональность самостоятельно с помощью кода, единственным решением будет низкоуровневая ловушка клавиатуры, которая перехватывает ответственные события нажатия клавиш и отбрасывает их.

Такие недокументированные хаки, как этот, предназначены для взлома более новых версий Windows. Я думаю, что Раймонд Чен усмехнется и скажет что-то вроде " Я же говорил тебе". Взлом интерфейса Windows — дурацкая затея. Или, как вы несколько раз говорите в вопросе, «не вариант».

person Cody Gray    schedule 09.02.2011
comment
Как было сказано выше, я уже пробовал метод 0xC017, и он не сработал. Меня не особенно волнует мнение Рэймонда Чена по этому вопросу, и если Microsoft не хочет, чтобы люди, использующие недокументированные хаки, отключали кнопку «Пуск», то они должны предоставить документированный способ сделать это с помощью групповой политики. - person Josh G.; 09.02.2011
comment
@Josh: я вижу, вы недостаточно заинтересованы в решении, чтобы прочитать весь мой ответ. Особенно выделенные жирным шрифтом разделы. Метод работает просто отлично. Я даже попробовал это на своей машине для пинков. Но это не полное решение, потому что полное решение невозможно. Причина, по которой я отсылаю вас к г-ну Чену, не личная фантазия, а то, что он работает в команде Windows Shell, ответственной за реализацию этих функций. Microsoft не особенно заботится о том, используете ли вы недокументированные хаки, они просто не гарантируют, что они продолжат работать. Это именно то, что вас делает, кажется, волнует. - person Cody Gray; 09.02.2011
comment
Как указано в исходном сообщении, я попытался использовать описанный вами метод (используя FindWindowEx с 0xC017 в качестве третьего параметра, а затем отключив это окно), и это не сработало. Я уже видел, что это предлагалось в другом месте. Возможно, ваши настройки отличались от моих? Я использовал режим Windows Aero с настроенной панелью задач, как в XP (без группировки, маленькие значки с метками). - person Josh G.; 09.02.2011
comment
@Josh: Вы все еще забываете либо четвертый параметр, либо тот факт, что он отключает только кнопку, а не возможность щелкнуть регион и открыть панель задач. Как я уже говорил в своем ответе, это решение не не помешает пользователю открыть меню «Пуск»; единственный способ сделать это — объединить описанный выше метод с полным отключением панели задач, чего вы не хотите делать. Я никогда не думал, что будет так сложно объяснить ответ, что это невозможно. - person Cody Gray; 09.02.2011
comment
Что ж, в этом случае мне, возможно, придется прибегнуть к использованию Start Killer, а также полностью отключить клавишу Windows (что, я думаю, можно сделать с помощью групповой политики) и использовать AutoHotKey для отключения Ctrl + Esc. Надеюсь, это должно предотвратить их попадание в беду. (В любом случае, как Start Killer полностью скрывает кнопку и заставляет все остальное перемещаться влево? Даже метод, который я использовал в XP, оставляет пустое место там, где была кнопка «Пуск».) - person Josh G.; 09.02.2011
comment
@Josh: При дальнейшем рассмотрении кажется, что Start Killer делает именно то, что вы хотите. Есть даже встроенная возможность полностью отключить меню «Пуск» (а не просто удалить шар), если щелкнуть правой кнопкой мыши значок запуска в области уведомлений и выбрать «Настройки». Вам, вероятно, даже не понадобится AutoHotKey. У меня на клавиатуре нет клавиши Win, поэтому я не могу проверить, отключает ли она ее, но эта статья базы знаний описывает, как отключить его через реестр. - person Cody Gray; 09.02.2011
comment
Что касается того, как работает Start Killer, я, честно говоря, не знаю. Но теперь мне как-то любопытно. Я пытался декомпилировать EXE, но он явно написан на C/C++ или даже на каком-то низкоуровневом ассемблере. Судя по тому, что я нарыл в сети, автор не слишком торопится раскрывать свои секреты. Я предполагаю, что он динамически исправляет или изменяет ресурсы в explorer.exe. Однако это потенциально пугающая мысль; Я, конечно, не стал бы запускать его постоянно на своем ПК. - person Cody Gray; 09.02.2011

Есть ли что-то конкретное в меню «Пуск», которое нужно отключить? Вы можете сделать то же самое с помощью настроек политики или других прав доступа к файлам.

person Boofhead    schedule 09.02.2011
comment
да. Все меню «Пуск» должно быть отключено. Пользователи системы должны открывать приложения с помощью утилиты киоска, размер которой изменяется так, чтобы он занимал весь экран, кроме панели задач. У них должен быть доступ к панели задач, чтобы, если у них одновременно открыто несколько программ, они могли переключаться между ними обычным способом. Мне известно о групповой политике для отключения определенных элементов в меню «Пуск», но, похоже, не существует параметра политики для полного отключения меню «Пуск». Вот почему мне нужно использовать функции API, чтобы отключить кнопку «Пуск». - person Josh G.; 09.02.2011
comment
Если у ваших пользователей есть доступ к веб-браузеру (или любому другому диалоговому окну открытия/сохранения файлов в любой программе), они могут запустить любое приложение! - person Anders; 09.02.2011

Используйте одну из доступных групповых политик, перечисленных здесь. .

Вы не упомянули, почему хотите отключить кнопку запуска. Если вы подумаете о том, чего именно вы не хотите, чтобы ваши пользователи делали вместо того, чтобы сообщать нам решение, которое вы выбрали для этого (например, «отключить кнопку запуска»), вы можете найти гораздо лучшее решение.

Например, если вы хотите запретить пользователям изменять определенные настройки, заблокируйте это, а не кнопку запуска! Или, если вы не хотите, чтобы они видели все установленные приложения, скройте эти приложения вместо кнопки «Пуск»! Или...

(Надеюсь, вы понимаете мою мысль здесь).

person Stefan    schedule 09.02.2011
comment
Так что, если его цель состоит в том, чтобы помешать пользователю сделать около 40% всего, что даже отдаленно можно вообразить, по вашей логике ему придется потратить свои следующие 10 жизней, блокируя каждое из них. Убить кнопку «Старт» — хорошее решение для него. - person uSeRnAmEhAhAhAhAhA; 11.11.2013