Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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.273 c
5-1093642947
Sphinx
2004-08-28 01:42
2005.08.28
Перекрытие свойств компонента


14-1123326323
Джо
2005-08-06 15:05
2005.08.28
Осторожно, Акунин :)


4-1120111271
Nyuk
2005-06-30 10:01
2005.08.28
Что в корзине?


14-1123143302
kblc
2005-08-04 12:15
2005.08.28
Debug


8-1113919174
MAXIMUM666
2005-04-19 17:59
2005.08.28
Зацикливание





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский