![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Эмуляция выбора пункта меню в чужом приложении
Хинт © (2005-07-06 11:44:00)Есть некое приложение. Необходимо автоматизировать очень часто выполняемую операцию. Так как приложение не поддерживает никаких макросов, то приходится управлять им на уровне WinAPI. Одно из действий, которое необходимо выполнить, заключается в эмуляции выхова одного из пунктов меню. Аналогично тому, чтобы щелкнуть в блокноте "Файл\Открыть". Но в отличии от блокнота приложение не использует "горячие клавиши".
Конечно можно просто послать приложению комвинацию клавиш: "ALT"->"Стрелка вниз"->"Стрелка вниз"->"Enter", но по-моему этого является далеко не лучшем решением проблемы...
alpet (2005-07-06 22:33:00) [1]Поправка - сообщения начинаюся с TB_, например TB_GETBUTTONTEXT
alpet (2005-07-06 22:31:00) [2]1. Определи на какое сообщение сам тулбар откликается. Искать следует среди сообщений TBM_*. Это позволит получить все его кнопки, и даже возможно их текст.
2. Закрепленные подменю у кнопок могут и отстутствовать - они могут показываться динамически по WM_CONTEXTMENU на кнопке.
Хинт (2005-07-06 21:53:00) [3]Насколько я понимаю самый простой вариант описан в первом посте...
"ALT"->"Стрелка вниз"->"Стрелка вниз"->"Enter" :(
Не хотелось бы делать так...
Хинт (2005-07-06 21:51:00) [4]Как класс пишет "Afx:00400000:8:00010011:00000000:00000000"
Получить HWND этого ToolBar'a не проблема. Проблема в том, чтобы эмулировать вызов элемента меню из подменюэтого ToolBar'a
Помогите
alpet (2005-07-06 20:58:00) [5]1. У этих приложений нет меню.
2. Оно заменяется как правило тулбаром (class=ToolbarWindow32, или msoCommandBar), который от других тулбаров отделить еще надо по каким то признакам (один из вариантов - позиция по отношению к родительскому окну).
Хинт (2005-07-06 19:24:00) [6]Мастера! Очень надеюсь на вашу помощь! Уже часа 4 ломаю голову над этой проблемой... решение все ещё не найдено :(((
KosilkA (2005-07-06 17:59:00) [7]
> GetMenu не работает с меню типа OfficeXP
присоединяюсь к вопросу, примерно такие-же грабли, только с эксплорером-)
Хинт (2005-07-06 14:24:00) [8]Так работает:
var
Men:HMenu;
idMen:integer;
begin
WWND:=FindWindow(nil,'Безымянный - Блокнот');
Men:=GetMenu(WWND);
Men:=GetSubMenu(Men,0);
idMen:=GetMenuItemID(Men,1);
if idMen<>0 then PostMessage(WWND,WM_COMMAND,idMen,0);
end;
Но если вместо 'Безымянный - Блокнот' написать 'Документ1 - Microsoft Word', то уже не работает =( Т.е. GetMenu не работает с меню типа OfficeXP. Как можно поступить аналогично в этом случае?
Хинт (2005-07-06 13:59:00) [9]Проблема в том, что это не просто меню окна, а панель в стиле OfficeXP... GetMenu и GetSubMenu не работают =(
Digitman (2005-07-06 13:47:00) [10]
> этого является далеко не лучшем решением проблемы
да, разумная мысль.
такой подход м.б. оправдан (ибо будет чуть ли единственно возможным) лишь в случае "рисованого меню" и невозможности инф.обмена с целевым приложением как с олей/СОМ-сервером автоматизации
> Как узнать этот самый wID?
GetMenuItemID
Игорь Шевченко (2005-07-06 13:47:00) [11]
> Как узнать этот самый wID?
Spy++ или WinSight помогают
Хинт (2005-07-06 13:33:00) [12]WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
Прочитал справку по этим сообщениям и понял, что это как раз то, что мне нужно. Только я никак не могу понять как пользоваться ими? Как узнать этот самый wID?
VMcL (2005-07-06 11:58:00) [13]WM_COMMAND, WM_MENUCOMMAND
?