BM_SETSTATE и Пуск

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 2:55

Доброго времени суток!
В общем пытаюсь показать и скрыть главное меню. Показываю с помощью
Код: Выделить всё
SendMessage hwndButton, BM_SETSTATE, 1, 0

Всё нормально.
Но вот отжать её таким же способом не получается, то есть
Код: Выделить всё
SendMessage hwndButton, BM_SETSTATE, 0, 0
меню как было так и осталось, и кнопка осталась в нажатом состоянии.
В чем дело и что не так?
Заранее спасибо
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 3:13

Всё так. Мышкой попробуй то же самое сделать.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 3:32

Попробовал. Посмотрел в Spy++ что пуску шлется и что шлется у меня.
Вот логи:
<00001> 0003004C S ........................................BM_SETSTATE fState:True
<00002> 0003004C R ........................................BM_SETSTATE
<00003> 0003004C S .........................................BM_SETSTATE fState:False
<00004> 0003004C R .........................................BM_SETSTATE
<00005> 0003004C S ........................................BM_GETSTATE
<00006> 0003004C R ........................................BM_GETSTATE fState:0000 | BST_PUSHED | BST_FOCUS | 0200
<00007> 0003004C S ..........................................BM_SETSTATE fState:False
<00008> 0003004C R ..........................................BM_SETSTATE
<00009> 0003004C S .....................................................BM_SETSTATE fState:False
<00010> 0003004C R .....................................................BM_SETSTATE
<00011> 0003004C S .....................................................BM_SETSTATE fState:False
<00012> 0003004C R .....................................................BM_SETSTATE

Это мышкой.
<00001> 0003004C S ........................................BM_SETSTATE fState:True
<00002> 0003004C R ........................................BM_SETSTATE
<00003> 0003004C S ........................................BM_GETSTATE
<00004> 0003004C R ........................................BM_GETSTATE fState:0000 | BST_PUSHED
<00005> 0003004C S ........................................BM_SETSTATE fState:False
<00006> 0003004C R ........................................BM_SETSTATE
<00007> 0003004C S ........................................BM_SETSTATE fState:False
<00008> 0003004C R ........................................BM_SETSTATE
<00009> 0003004C S ........................................BM_SETSTATE fState:False
<00010> 0003004C R ........................................BM_SETSTATE
<00011> 0003004C S ........................................BM_SETSTATE fState:False
<00012> 0003004C R ........................................BM_SETSTATE

Это из программы
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 3:33

Можешь ещё раз сказать, какое поведение ты ожидаешь и какое поведение наблюдаешь?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 3:37

Ожидаю что при получении BM_SETSTATE, 0, 0 пуск отожмется и главное меню исчезнет. С обычными кнопками так и происходит (в смысле они переходят в ненажатое состояние). А пуск почему-то не хочет.
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 3:44

А, что, когда мы отпускаем кнопку мышки, меню пропадает и кнопка отжимается?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 3:53

Нет, но если второй раз нажать на кнопку пуск, так оно и будет. Собственно это мне и надо. По идее при получении BM_SETSTATE с wParam = 0 кнопка должна перейти в ненажатое состояние, а она не переходит.
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 3:54

Откуда такое умозаключение?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 4:05

Сделал примерчик, как это работает с кнопкой в программе.
Хочется чтобы и с пуском было так же...
Вложения
test.rar
(1.34 Кб) Скачиваний: 74
Подпись проходит рефакторинг

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 4:08

Может мы о разных вещах говорим?
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 4:13

Да понял я.

Только с чего ты взял, что кнопка Пуск будет/должна вести себя как обычная кнопка? С чего ты взял, что кнопка Пуск вообще будет сделана из обычной кнопки?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 4:22

Я и не утверждал ничего, наоборот пришёл за советом/помощью/пинком в нужном направлении.
Почему кнопка? Потому что класс "Button", да и стиль BS_PUSHBUTTON. Видимо так.
Я конечно могу и ошибаться. Если это так - поправьте пожалуйста.
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 4:26

Почему кнопка? Потому что класс "Button", да и стиль BS_PUSHBUTTON. Видимо так.

Где в официальной документации это написано?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 4:30

http://msdn.microsoft.com/ru-ru/library/tf9hd91s.aspx
BS_PUSHBUTTON Creates a pushbutton that posts a WM_COMMAND message to the owner window when the user selects the button.
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 4:32

Нет :)

Где в официальной документации сказано, что зелёный квадратик в левом нижнем углу, на котором написано "Start"/"Пуск" --- это окно класса BUTTON, понимающее все стандартные BM-сообщния?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 4:37

То есть ты имеешь в виду, что таким способом задача нереализуема? Надо искать другой подход?
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 4:49

То есть я имею в виду, что такой подход это нечто из книжки "Философия создания отвратительных программных продуктов". Никогда нельзя полагаться на внутренние детали реализации, которые тебе видны, но о которых ничего не говорится в документации.

То есть это наивный подход: думать, что раз класс окна Button, то и работать с окном можно как со стандартным Button-ом. Как минимум, в общем случае такой подход недопустим: класс окна ещё не говорит, что конкретно взятое окно будет обладать типичными свойствами данного класса. Потому что даже есть всем известный здесь механизм сабклассинга, который наделяет окно какого-то класса дополнительными свойствами. Я не знаю точно, но очень подозреваю, что кнопка пуск тоже сабклассится Проводником. И раз так, её реакция на сообщения может не соответствовать таковой для обычных нетронутых кнопок.

Более того, неправомерно вообще работать с кнопкой Пуск как с кнопкой. Это сейчас ты видишь в Spy++, что кнопка Пуск это действительно BUTTON. Теоретически нельзя отрицать, что в следующей версии Проводника кнопка Пуск перестанет быть обычной кнопкой класса BUTTON. (Особенно если учитывать, какие тенденции нынче наблюдаются в Microsoft по отношению к GUI...)

А значит, нельзя при создании приложения полгатаься на то, что кнопка Пуск это стандартная кнопка.

И даже то, что в проводниках Висты и Виены кнопка Пуск всё ещё обычная кнопка (хотя, я не в курсе, может быть уже и не кнопка, не видел), ничего не говорит и в расчёт браться не должно.

То есть даже доводы типа "Я пишу приложение исключительно для XP, а в проводнике XP кнопка Пуск пока ещё обычная кнопка" не катят. Завтра найдётся какая-нибудь мега-уязвимость, и логику работы этой кнопки перепишут. И те внутренние детали реализации, на которые ты положился, исчезнут.

И мы получим ещё одно отвратительное приложение, которое перестаёт работать после установки официального исправления.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 4:58

...
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 4:59

?
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Lumen
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 841
Зарегистрирован: 03.12.2005 (Сб) 16:09
Откуда: Брянск

Re: BM_SETSTATE и Пуск

Сообщение Lumen » 06.11.2009 (Пт) 5:06

Ясно. Можно было кстати сразу с этого начать, без демагогии. Ладно, придется отказаться от этой затеи.
Подпись проходит рефакторинг

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 5:12

Мне не нравится давать людям готовые ответы, мне нравится заставлять их мыслить в правильном направлении.

Что же касается данного случая, правильным будет найти в документации официальный, рекомендуемый, предпочтительный способ показать стартменю. И если такого не найдётся, хотя бы полагаться на аспекты, у которых вероятность изменить существенно меньше.

Например, кнопка Пуск может перестать быть кнопкой, но гораздо менее вероятно, что показ стартменю отвяжут от WinKey-а. Скорее сам Пуск уберёт из Windows, чем это произойдёт. Так что, например, можно думать в сторону эмуляции нажатия VK_LWIN.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: BM_SETSTATE и Пуск

Сообщение Antonariy » 06.11.2009 (Пт) 12:05

Хакер писал(а):Где в официальной документации сказано, что зелёный квадратик в левом нижнем углу, на котором написано "Start"/"Пуск" --- это окно класса BUTTON, понимающее все стандартные BM-сообщния?
Насчет сообщений не знаю, но оно неиллюзорно класса Button, Spy++ врать не обучен.
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 12:07

Antonary, ты не понял фишку: оно сейчас класса Button, но полагаться на это не стоит, так как никто не гарантирует, что завтра оно по прежнему будет так.

Кроме того, как я уже сказал, что classname="Button" ещё ни о чём не говорит в силу наличия таких вещей, как сабклассинг.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Re: BM_SETSTATE и Пуск

Сообщение Antonariy » 06.11.2009 (Пт) 12:09

Я думаю, что срок жизни пуска именно в этом виде превысит срок жизни любой программы, которая захочет на него нажать)
Лучший способ понять что-то самому — объяснить это другому.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 06.11.2009 (Пт) 12:13

Не факт.
И вообще это вредный порочный подход.

Плюс, автор не просто нажимает на кнопку, а лезет глубже: меняет статус нажатости. В то время как внутри сабкласснутой кнопки может быть свой собственный статус нажатости, который сбрасывается не отжатием кнопки мыши/клавиатуры, а потерей фокуса самой менюшки. Завтра эти "интимные подробности" могут измениться, даже при том, что кнопка останется стандартной кнопкой, и неизвестно к чему будет приводить попытка нажать кнопку старым спобосом.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: BM_SETSTATE и Пуск

Сообщение awl100Alex » 06.11.2009 (Пт) 13:15

Lumen писал(а):Ожидаю что... пуск отожмется и главное меню исчезнет. С обычными кнопками так и происходит (в смысле они переходят в ненажатое состояние). А пуск почему-то не хочет.

А если так?..
Код: Выделить всё
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Const WM_LBUTTONDBLCLK = &H203

Private Sub Command1_Click() ' Показать меню <Пуск>...
SendMessage GetDesktopWindow, WM_LBUTTONDBLCLK, 0&, ByVal 0&
End Sub

' Убрать меню <Пуск>... Любой клик в любом месте!


Или так... в автомате...
Код: Выделить всё
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByRef lParam As Any) As Long
Private Declare Function GetDesktopWindow Lib "user32" () As Long
Private Const WM_LBUTTONDBLCLK = &H203

Private Sub Command1_Click() ' Показать меню <Пуск>...
SendMessage GetDesktopWindow, WM_LBUTTONDBLCLK, 0&, ByVal 0&
End Sub

Private Sub Timer1_Timer() ' Убрать меню <Пуск>... (Timer.Interval = 10 сек...)
SendMessage GetDesktopWindow, WM_LBUTTONDBLCLK, 0&, ByVal 0&
End Sub


Хакер писал(а):Завтра эти "интимные подробности" могут измениться...

Завтра уже наступило! Этот код одинаково работает как в WinXP так и в Windows 7. :)

awl100Alex
Постоялец
Постоялец
 
Сообщения: 355
Зарегистрирован: 29.01.2008 (Вт) 15:19
Откуда: Украина

Re: BM_SETSTATE и Пуск

Сообщение awl100Alex » 06.11.2009 (Пт) 15:09

Вовсе не обязательно что либо посылать кнопке <Пуск>. Можно косвенным образом заставить саму систему делать то, что нам нужно – в этом и «секрет». :)

Денис
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2734
Зарегистрирован: 07.11.2006 (Вт) 13:55
Откуда: Ейск, Краснодарский край

Re: BM_SETSTATE и Пуск

Сообщение Денис » 07.11.2009 (Сб) 20:11

Lumen, а ты не пробовал послать SendMessage hwndButton, BM_SETSTATE, 1, 0 повторно и именно с параметром 1? Мне кажется это более соответствует поведению "кнопки" сейчас. (Однако же я полностью согласен с Хакером, что это сообщение является хаком и не гарантирует работоспособность в следующих версиях винды).
Программирование — богоизбранная дисциплина! Если бог и есть, то вселенную он скомпилировал, не иначе.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Re: BM_SETSTATE и Пуск

Сообщение alibek » 07.11.2009 (Сб) 21:27

Денис писал(а):(Однако же я полностью согласен с Хакером, что это сообщение является хаком и не гарантирует работоспособность в следующих версиях винды).

А ничего, что в Microsoft стараются не нарушать совместимость вплоть до того, что эмулируют некорректное поведение старых программ?
Я очень сомневаюсь, что в обозримом будущем кнопка «Пуск» перестанет вести себя, как кнопка.
Lasciate ogni speranza, voi ch'entrate.

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16489
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Re: BM_SETSTATE и Пуск

Сообщение Хакер » 07.11.2009 (Сб) 22:45

А ничего, что в Microsoft стараются не нарушать совместимость вплоть до того, что эмулируют некорректное поведение старых программ?
Старались когда-то. Сейчас же, как я уже сказал, у них совсем иные тенденции.
Можешь почитать статью Джоеля по этому поводу; вот с этого места:
В Microsoft есть два противостоящих лагеря, я их буду называть лагерь Реймонда Чена и лагерь журнала MSDN.

Реймонд Чен –-- разработчик в команде Windows с 1992 года. Его веблог The Old New Thing набит детальными техническими историями о порядке вещей в Windows, даже глупые вещи имеют под собой веские основания.

Больше всего на веблоге Реймонда впечатляет история о невероятных усилиях, приложенных командой разработки Windows для поддержания обратной совместимости.


Я очень сомневаюсь, что в обозримом будущем кнопка «Пуск» перестанет вести себя, как кнопка.

Она и сейчас-то так себя не ведёт. Я тоже сомневаюсь, что её поведение изменится, но надо представить себе то чувство досады, которые возникнет, если она всё же вдруг изменится.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 10

    TopList  
cron