Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
ВнизЭмуляция выбора пункта меню в чужом приложении Найти похожие ветки
← →
Хинт © (2005-07-06 11:44) [0]Есть некое приложение. Необходимо автоматизировать очень часто выполняемую операцию. Так как приложение не поддерживает никаких макросов, то приходится управлять им на уровне WinAPI. Одно из действий, которое необходимо выполнить, заключается в эмуляции выхова одного из пунктов меню. Аналогично тому, чтобы щелкнуть в блокноте "Файл\Открыть". Но в отличии от блокнота приложение не использует "горячие клавиши".
Конечно можно просто послать приложению комвинацию клавиш: "ALT"->"Стрелка вниз"->"Стрелка вниз"->"Enter", но по-моему этого является далеко не лучшем решением проблемы...
← →
VMcL © (2005-07-06 11:58) [1]WM_COMMAND, WM_MENUCOMMAND
?
← →
Хинт © (2005-07-06 13:33) [2]WM_COMMAND
wNotifyCode = HIWORD(wParam); // notification code
wID = LOWORD(wParam); // item, control, or accelerator identifier
hwndCtl = (HWND) lParam; // handle of control
Прочитал справку по этим сообщениям и понял, что это как раз то, что мне нужно. Только я никак не могу понять как пользоваться ими? Как узнать этот самый wID?
← →
Digitman © (2005-07-06 13:47) [3]
> этого является далеко не лучшем решением проблемы
да, разумная мысль.
такой подход м.б. оправдан (ибо будет чуть ли единственно возможным) лишь в случае "рисованого меню" и невозможности инф.обмена с целевым приложением как с олей/СОМ-сервером автоматизации
> Как узнать этот самый wID?
GetMenuItemID
← →
Игорь Шевченко © (2005-07-06 13:47) [4]
> Как узнать этот самый wID?
Spy++ или WinSight помогают
← →
Хинт © (2005-07-06 13:59) [5]Проблема в том, что это не просто меню окна, а панель в стиле OfficeXP... GetMenu и GetSubMenu не работают =(
← →
Хинт © (2005-07-06 14:24) [6]Так работает:
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. Как можно поступить аналогично в этом случае?
← →
KosilkA © (2005-07-06 17:59) [7]
> GetMenu не работает с меню типа OfficeXP
присоединяюсь к вопросу, примерно такие-же грабли, только с эксплорером-)
← →
Хинт © (2005-07-06 19:24) [8]Мастера! Очень надеюсь на вашу помощь! Уже часа 4 ломаю голову над этой проблемой... решение все ещё не найдено :(((
← →
alpet © (2005-07-06 20:58) [9]1. У этих приложений нет меню.
2. Оно заменяется как правило тулбаром (class=ToolbarWindow32, или msoCommandBar), который от других тулбаров отделить еще надо по каким то признакам (один из вариантов - позиция по отношению к родительскому окну).
← →
Хинт © (2005-07-06 21:51) [10]Как класс пишет "Afx:00400000:8:00010011:00000000:00000000"
Получить HWND этого ToolBar"a не проблема. Проблема в том, чтобы эмулировать вызов элемента меню из подменю этого ToolBar"a
Помогите
← →
Хинт © (2005-07-06 21:53) [11]Насколько я понимаю самый простой вариант описан в первом посте...
"ALT"->"Стрелка вниз"->"Стрелка вниз"->"Enter" :(
Не хотелось бы делать так...
← →
alpet © (2005-07-06 22:31) [12]1. Определи на какое сообщение сам тулбар откликается. Искать следует среди сообщений TBM_*. Это позволит получить все его кнопки, и даже возможно их текст.
2. Закрепленные подменю у кнопок могут и отстутствовать - они могут показываться динамически по WM_CONTEXTMENU на кнопке.
← →
alpet © (2005-07-06 22:33) [13]Поправка - сообщения начинаюся с TB_, например TB_GETBUTTONTEXT
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2005.08.28;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.041 c