Здравствуйте, Mielofon, Вы писали:
M>Вот висит у меня приложение. Причем висит оно только иконкой в трее.
С повисшими приложениями работать весьма трудно.
Хотя, если только иконкой, можно попробывать.
M>1. получить информацию о иконке в трее (что на ней сейчас изображено — там иконка меняется и мне просто знать какое состояние ее сейчас — только что бы не распознавать образ )
Для того чтобы знать о изменениях, происходящих с иконками нужно установить хук
на Explorer и отлавливать WM_COPYDATA в окно ShellTray_Wnd.
При Shell_NotifyIcon окну ShellTray_Wnd будет SendMessage(.., WM_COPYDATA, ..)
c dwID = $34753423
В качестве структуры данных можно испытать изложенное в
Все остальное (нажатия, считывание пунктов меню и др.) делается
собс-ручно и записывается на бумажке, бо состояний у оной иконки —
конечное множество, а интересны лишь значение WM_COMMAND LOWORD(wParam)
— WinSight32, Spy.
--
Regards, LVT.
--
С уважением, LVT
Мониторинг/Управление PopUpMenu другого приложения
Вот висит у меня приложение. Причем висит оно только иконкой в трее.
Мне нужно сэмулировать нажатие правой кнопкой мыши на ем, что бы выскачило PopUpMenu и считать значения пунктов этого меню..
Это звонилка в инет (ну не совсем инет — спутник SkyDSL и у них свой софт). Мне нужно будет в зависимости от того какие пункты в меню активны и их значение "SkyDSL Off" или "SkyDSL On" нажимать на эти пункты или нет..
Ну и пункты Surfing и Download выбирать один из них...
Ну нажимать то пункты меню посылкой
res := SendMessage(hWnd, WM_COMMAND,24057, 0);
я могу — проблем нет.
Но вот как имея Handler главного окна:
1. получить информацию о иконке в трее (что на ней сейчас изображено — там иконка меняется и мне просто знать какое состояние ее сейчас — только что бы не распознавать образ )
2. и о содержимом PopUpMenu...
Второе интересней...
Re[2]: Мониторинг/Управление PopUpMenu другого приложения
Здравствуйте, 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 другого приложения
Здравствуйте, Mielofon, Вы писали:
M>PS Вывести PopUpMenu послав сообщение тоже что и ShellTray_Wnd посылает у нас получилось..
Ну, получить GetForegroundWindow (FindWindow), убедится, что это меню (класс #32768),
и GetMenuItemInfo, ориентируясь по menu item identifier (т.е., по тому, что
LOWORD (wParam)).
--
С уважением, LVT
Re[4]: Мониторинг/Управление PopUpMenu другого приложения
Здравствуйте, 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 другого приложения
Здравствуйте, 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 другого приложения
Здравствуйте, Leonid Troyanovsky, Вы писали:
LT>Здравствуйте, Mielofon, Вы писали:
M>>Вопрос: как у окна с классом #32768 получить hMenu?
LT>Попробывать поймать WM_INITMENUPOPUP, установив хук LT>на то самое приложение (окну которого шлются WM_COMMAND).
Это понятно. Только вот не вышло — ни один хук не поймал WM_INITMENUPOPUP