Мониторинг/Управление PopUpMenu другого приложения
От: Mielofon  
Дата: 09.12.05 13:28
Оценка:
Добрый день.

Вот висит у меня приложение. Причем висит оно только иконкой в трее.
Мне нужно сэмулировать нажатие правой кнопкой мыши на ем, что бы выскачило PopUpMenu и считать значения пунктов этого меню..
Это звонилка в инет (ну не совсем инет — спутник SkyDSL и у них свой софт). Мне нужно будет в зависимости от того какие пункты в меню активны и их значение "SkyDSL Off" или "SkyDSL On" нажимать на эти пункты или нет..
Ну и пункты Surfing и Download выбирать один из них...

Ну нажимать то пункты меню посылкой
res := SendMessage(hWnd, WM_COMMAND,24057, 0);
я могу — проблем нет.
Но вот как имея Handler главного окна:
1. получить информацию о иконке в трее (что на ней сейчас изображено — там иконка меняется и мне просто знать какое состояние ее сейчас — только что бы не распознавать образ )
2. и о содержимом PopUpMenu...

Второе интересней...
Re: Мониторинг/Управление PopUpMenu другого приложения
От: Leonid Troyanovsky  
Дата: 09.12.05 14:17
Оценка: +1
Здравствуйте, Mielofon, Вы писали:

M>Вот висит у меня приложение. Причем висит оно только иконкой в трее.


С повисшими приложениями работать весьма трудно.
Хотя, если только иконкой, можно попробывать.

M>1. получить информацию о иконке в трее (что на ней сейчас изображено — там иконка меняется и мне просто знать какое состояние ее сейчас — только что бы не распознавать образ )


Для того чтобы знать о изменениях, происходящих с иконками нужно установить хук
на Explorer и отлавливать WM_COPYDATA в окно ShellTray_Wnd.
При Shell_NotifyIcon окну ShellTray_Wnd будет SendMessage(.., WM_COPYDATA, ..)
c dwID = $34753423

В качестве структуры данных можно испытать изложенное в

http://groups.google.com/group/fido7.su.win32.prog/msg/d966e07f9ad4c70e

Все остальное (нажатия, считывание пунктов меню и др.) делается
собс-ручно и записывается на бумажке, бо состояний у оной иконки —
конечное множество, а интересны лишь значение WM_COMMAND LOWORD(wParam)
— WinSight32, Spy.

--
Regards, LVT.
--
С уважением, LVT
Re[2]: Мониторинг/Управление PopUpMenu другого приложения
От: Mielofon  
Дата: 09.12.05 15:57
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, Mielofon, Вы писали:


M>>Вот висит у меня приложение. Причем висит оно только иконкой в трее.


LT> С повисшими приложениями работать весьма трудно.

LT> Хотя, если только иконкой, можно попробывать.
Висит в смысле в трее, а не в смысле не работает

M>>1. получить информацию о иконке в трее (что на ней сейчас изображено — там иконка меняется и мне просто знать какое состояние ее сейчас — только что бы не распознавать образ )


LT> Для того чтобы знать о изменениях, происходящих с иконками нужно установить хук

LT> на Explorer и отлавливать WM_COPYDATA в окно ShellTray_Wnd.
LT> При Shell_NotifyIcon окну ShellTray_Wnd будет SendMessage(.., WM_COPYDATA, ..)
LT> c dwID = $34753423

LT>В качестве структуры данных можно испытать изложенное в


LT>http://groups.google.com/group/fido7.su.win32.prog/msg/d966e07f9ad4c70e

С этим понятно..


LT> Все остальное (нажатия, считывание пунктов меню и др.) делается

LT> собс-ручно и записывается на бумажке, бо состояний у оной иконки -
LT> конечное множество, а интересны лишь значение WM_COMMAND LOWORD(wParam)
LT> — WinSight32, Spy.
как раз WM_COMMAND-ы мы то уже узнали (Spy++ помог), но вот один из пунктов PopUpMenu меняет свой Caption динамически в процессе работы и в зависимости от состояния прилоения и соответственно то что он делает.
Как добраться до Caption MenuItem-ов у PopUpMenu?

PS Вывести PopUpMenu послав сообщение тоже что и ShellTray_Wnd посылает у нас получилось..
Re[3]: Мониторинг/Управление PopUpMenu другого приложения
От: Leonid Troyanovsky  
Дата: 09.12.05 16:50
Оценка:
Здравствуйте, Mielofon, Вы писали:

M>PS Вывести PopUpMenu послав сообщение тоже что и ShellTray_Wnd посылает у нас получилось..


Ну, получить GetForegroundWindow (FindWindow), убедится, что это меню (класс #32768),
и GetMenuItemInfo, ориентируясь по menu item identifier (т.е., по тому, что
LOWORD (wParam)).
--
С уважением, LVT
Re[4]: Мониторинг/Управление PopUpMenu другого приложения
От: Mielofon  
Дата: 12.12.05 07:47
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

M>>PS Вывести PopUpMenu послав сообщение тоже что и ShellTray_Wnd посылает у нас получилось..


LT> Ну, получить GetForegroundWindow (FindWindow), убедится, что это меню (класс #32768),

LT> и GetMenuItemInfo, ориентируясь по menu item identifier (т.е., по тому, что
LT> LOWORD (wParam)).

Так. Handle окна с класс #32768 мы получили, только не через GetForegroundWindow, а через WindowFromPoint (благо, что PopUpMenu выводится рядом с курсрором

но GetMenuItemInfo трпбуется hMenu и наш полученый hWindow ей не нравится..
GetMenu у этого окна по нулям..

Вопрос: как у окна с классом #32768 получить hMenu?
Re[5]: Мониторинг/Управление PopUpMenu другого приложения
От: Leonid Troyanovsky  
Дата: 12.12.05 09:06
Оценка:
Здравствуйте, Mielofon, Вы писали:

M>Вопрос: как у окна с классом #32768 получить hMenu?


Попробывать поймать WM_INITMENUPOPUP, установив хук
на то самое приложение (окну которого шлются WM_COMMAND).

Само окно меню, здесь, на самом деле, ни причем.
Пятница, вечер Sorry.
--
С уважением, LVT
Re: Мониторинг/Управление PopUpMenu другого приложения
От: alexey_ma Израиль  
Дата: 12.12.05 09:07
Оценка:
Здравствуйте, Mielofon, Вы писали:

M>Добрый день.


M>Вот висит у меня приложение. Причем висит оно только иконкой в трее.

M>Мне нужно сэмулировать нажатие правой кнопкой мыши на ем, что бы выскачило PopUpMenu и считать значения пунктов этого меню..
M>Это звонилка в инет (ну не совсем инет — спутник SkyDSL и у них свой софт). Мне нужно будет в зависимости от того какие пункты в меню активны и их значение "SkyDSL Off" или "SkyDSL On" нажимать на эти пункты или нет..
M>Ну и пункты Surfing и Download выбирать один из них...

M>Ну нажимать то пункты меню посылкой

M> res := SendMessage(hWnd, WM_COMMAND,24057, 0);
M>я могу — проблем нет.
M>Но вот как имея Handler главного окна:
M>1. получить информацию о иконке в трее (что на ней сейчас изображено — там иконка меняется и мне просто знать какое состояние ее сейчас — только что бы не распознавать образ )
M>2. и о содержимом PopUpMenu...

M>Второе интересней...


Посмотри в MSDN IAccessible и SetWinEventHook. Попробуй исследовать эту аппликацию утилиткой accexplorer32.exe (находиться в ..\Microsoft SDK\Bin\). Может быть будет удобнее работать через IAccessible а не через WinAPI
Re[6]: Мониторинг/Управление PopUpMenu другого приложения
От: Mielofon  
Дата: 21.12.05 17:07
Оценка:
Здравствуйте, Leonid Troyanovsky, Вы писали:

LT>Здравствуйте, Mielofon, Вы писали:


M>>Вопрос: как у окна с классом #32768 получить hMenu?


LT>Попробывать поймать WM_INITMENUPOPUP, установив хук

LT>на то самое приложение (окну которого шлются WM_COMMAND).

Это понятно. Только вот не вышло — ни один хук не поймал WM_INITMENUPOPUP
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.