Как стать автором
Обновить

Комментарии 31

"(попытка изменить в коде слово Start на Пуск успеха не имела)"
Помнится, был код на Win32API, который открывал/закрывал лоток дисковода, и суть его была в отправке сообщения open/close через mciSendString. В каком-то русском сборнике рецептов по дельфи (или это VB был, не помню), был описан этот метод. Фишка в том, что из-за того что переводчики перевели и сообщения на открыть/закрыть, пример работать перестал.

К чему это я… Помнится, в старом апи была функция, перечисляющая всех детей некого окна по hwnd. Поищите, может у вас-таки получится найти правильный hwnd для манипуляции пуском?
hwnd по идее правильный. проблема в названии. как условный вариант/идея — слово Пуск написано в кодировке Win-1251, а я подсовываю ему Unicode. по хорошему, надо утилиту типа Spy+ натравить на кнопку и узнать, что там написано.
EnumChildWindows Function ()
The EnumChildWindows function enumerates the child windows that belong to the specified parent window by passing
Такая?
Боюсь уже не вспомню, я лет 5 назад последний раз Win32API трогал.
В данном случае проще использовать FindWindowEx
да такая, и в msdn даже есть «плохой» пример на неё =) msdn.microsoft.com/en-us/library/ms632598(VS.85).aspx
Всё-таки Win32 API он и в Африке Win32 API. Вот правда, не в обиду, если поменять «C#» на «Делфи» в вашем примере ничего не изменится. ;-)
А почему я должен обижаться?
загуглил IntPtr
Заголовок из выдачи: «IntPtr — what is this!?!?»
Один в один моя эмоция!
))). Гугл крут. попробуйте набрать pigs can't fly и посмотрите на подсказку. twitpic.com/etim5
Не сочтите за оскорбление или грубость, но что-то сильно Фленовым попахивает…
не счел
здесь должен быть комментарий от Флёнова ;)
а почему Фленовым попахивает?
Вы точно-точно уверены, что это работает?
// Получим дескриптор кнопки ПУСК      
  IntPtr startWnd = FindWindow(«Button», null);

Как утверждает MSDN, FindWindow ищет только среди окон верхнего уровня. Элементарная проверка с помощью Spy++ показывает, что кнопка «Start» является дочерним окном Shell_TrayWnd — то есть FindWindow её не найдёт.

Spy++

А если бы даже FindWindow искала по всем окнам — результат был бы непредсказуем: Button — очень распространённый оконный класс, к нему относятся практически все кнопки в системе, не только «Пуск».
Кроме того, часть кода, который «если работает, то написан Александром Климовым», удивительно похожа на код примера для Win7, который у Вас «не заработал».
Этот кусок не просто похож, а взят оттуда. Если вы внимательно читали статью, то там есть ссылка на нее. Я специально заменил свой код на код из CodeProject, чтобы было легче понять проблему с кнопкой.
Упс. Вы правы. Это копировал кусок из CodeProject, пытаясь решить проблему с кнопкой в Win7 и забыл вернуть свой прежний код. Вечером вернусь к примеру и поправлю. Спасибо, глаз замылен и не увидел подвоха.
Упс. Вы правы. Это копировал кусок из CodeProject, пытаясь решить проблему с кнопкой в Win7 и забыл вернуть свой прежний код. Вечером вернусь к примеру и поправлю. Спасибо, глаз замылен и не увидел подвоха.
Вы ввели меня в заблуждение. Ваша картинка относится к WinXP, где Пуск действительно является дочерним окном Shell_TrayWnd. Но в Vista/7 кнопка уже не является дочерним окном и поэтому мой код правильный.
Вы правы, картинка относится к WinXP. Однако, не могу согласится с Вашей претензией: в заблуждение Вы ввели себя сами.

Сначала Вы пишете:
… Я решил показать проект, позволяющий скрывать кнопку Пуск и панель задач в Windows XP/Vista/7.
Потом приводите (чужой) код для Vista/7.
Потом (upd ещё не было) пишете:
В Windows 98/XP скрыть кнопку можно было без проблем. В Windows Vista… изменилось ее поведение. Она уже не является дочерним окном панели задач. И приведенный здесь код работает наполовину. [...] Скрыть Пуск, но оставить панель задач не получается. [...]
В поисках решения проблемы я набрел на парочку статей на CodeProject [...]Но, к сожалению, у меня эти примеры не заработали.


Иными словами: сначала Вы утверждаете, что пример универсален, и приводите код для Висты/7; затем говорите, что он без проблем работал для XP, а в Vista только наполовину. И как финальный аккорд — утверждаете, что пример для Vista (код которого Вы и привели) — у Вас не заработал.
Сворачивая всё это: Вы утверждаете, что приведённый Вами код у Вас же и не заработал, — что звучит несколько странно :)

Нелогичность текста исчезнет, если нынешний код примера (для Vista/7) заменить на код для XP (т.е. с учётом дочерности кнопки). Ну, или перелопатить весь текст, чтобы он соответствовал коду.
да, я не слишком аккуратно обошелся с текстом, так как писал глубокой ночью. претензий к вам нет. наоборот, даже благодарен ))).
Практическая ценность может появиться тогда, когда понадобится сделать приложение в котором действия клиента очень ограничены, для библиотек например, всяких там справочных…
Вот бы еще был хороший способ при crash-е программы обратно все это хозяйство показывать.
Теоретически, достаточно через Task Manager прибить процесс explorer.exe (не путать с iexplore.exe), а затем запустить его снова.
А у кнопки пуск разве есть hWnd?
А, прошу прощения. Есть.
А интересно, почему вы решили сначала, что у кнопки нет hWnd?
слишком долго пытался достучаться до кнопок на тулбарах )
а о чём сообственно статья?
О том, что у Windows есть well-known window classes? или о том, что такое p/Invoke?
Чтобы понять, о чём статья, неплохо бы её прочитать.
В правильно составленных статьях достаточно прочесть введение.
В данном случае — название и первый абзац. Не осилили?
Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации

Истории