Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];

Вниз

PostMessage   Найти похожие ветки 

 
Alexandr   (2002-05-18 10:34) [0]

Как с помощью PostMessage можно вызвать определенный пункт главного меню другого приложения?


 
Song   (2002-05-18 10:45) [1]

Какой именно?


 
Alexandr   (2002-05-18 10:46) [2]

ну дык любой заданный


 
Romkin   (2002-05-18 10:52) [3]

Может пройти просто WM_MENUSELECT
а menu handle можно получить функцией GetMenu.
Системное меню - WM_SYSCOMMAND


 
Alexandr   (2002-05-18 10:54) [4]

2Romkin: Спасибо, щас буду пробовать.
А работающего примера под рукой нету?


 
Alexandr   (2002-05-18 11:26) [5]

вот как делаю

h:=FindWindow("TfrmMain",nil);
h1:=GetMenu(h);
SendMessage(h, WM_SYSCOMMAND, SC_HOTKEY, h);
SendMessage(h,WM_MENUSELECT,StrToInt(Edit1.Text),h1);


где в Edit1 пункт меню. Никакой реакции...
хэндл есть и h и h1 может еще getSubMenu заюзать надо?
а MenuIndex как узнать можно? Или только перебором - практикой


 
Romkin   (2002-05-18 11:49) [6]

Если события на этот пункт меню нет, то ничего и не будет. Здесь ты получил только hendle самого меню. GetSubMenu надо
GetMenuItemInfo, GetMenuItemID ...


 
Alexandr   (2002-05-18 11:55) [7]

есть событие
уже дошел до такого

h1:=GetMenu(h);
h2:=GetSubMenu(h1,0);
Edit1.Text:=IntToStr(GetMenuItemCount(h2));
PostMessage(h,WM_MENUSELECT,2,h2);


она мне показывает количество пунктов в меню и подменю, потом
PostMessage я шлю нажатие, но ничего не нажимается.
в субменю 3 пункта, я нажимаю последний (счет с нуля)
Правильно ли я делаю?


 
Romkin   (2002-05-18 12:11) [8]

Проверь - сделай проект, в нем меню. В другом процессе получи handle этого меню, и сравни - одинаковые ли значения, или menu handle зависит от процесса? :-))


 
Alexandr   (2002-05-18 12:20) [9]

что ты этим хочешь проверить?
Я что, ни к тому меню (окну), по-твоему, обращаюсь?

Ладно, сейчас попробую


 
Romkin   (2002-05-18 12:22) [10]

Проверил уже, menu handle не зависит от процесса, получаешь тот, что нужно


 
Alexandr   (2002-05-18 12:27) [11]

ну так вот, я пока не стал заморачиваться с другим приложением, а решил попробовать в собственном.
Создал меню, повесил на пункт меню ShowMessage и вперед.
Хэндл формы Form1.handle , остальное как и раньше

h:=Form1.Handle;
h1:=GetMenu(h);
h2:=GetSubMenu(h1,0);
SendMessage(h,WM_MENUSELECT,$7FFF0000,h2);

не совсем понятно, что писать там где $7FFF0000, но пробовал и 0 и это - эффект одинаковый.

Как запустить инстукцию GetMenuItemInfo и как с помощью ее узнать caption пункта меню - для самопроверки?




 
Romkin   (2002-05-18 13:01) [12]


procedure TForm2.Button1Click(Sender: TObject);
var
MenuWnd: HWND;
MenuHandle: HMENU;
ItemHandle: HMENU;
ItemID: Word;
ItemInfo: TMenuItemInfo;
s: string;
begin
MenuWnd := FindWindow(nil, "MenuForm");
if MenuWnd = 0 then
begin
ShowMessage("Window not found");
Exit;
end;
MenuHandle := GetMenu(MenuWnd);
ShowMessage("Menu handle is " + IntToHex(MenuHandle,8));
ItemID := GetMenuItemID(MenuHandle,0);
SetLength(s, 100);
ZeroMemory(@ItemInfo, SizeOf(ItemInfo));
//Вырезал из menus.pas
with ItemInfo do
begin
cbSize := 44; // Required for Windows 95
fMask := MIIM_TYPE;
dwTypeData := PChar(s);
cch := Length(s);
end;

if GetMenuItemInfo(MenuHandle, 0, True, ItemInfo) then
begin
SetLength(s, ItemInfo.cch);
ShowMessage("Item info "+ s); // имя пункта
end;
HiliteMenuItem(MenuWnd, MenuHandle, 0, MF_BYPOSITION or MF_HILITE); //Подсветка
sleep(200);
// К сожалению, никакого эффекта на событие Ж-((
SendMessage(MenuWnd, WM_MENUSELECT,
(MF_MOUSESELECT shl 16) or ItemID, MenuHandle);

HiliteMenuItem(MenuWnd, MenuHandle, 0, MF_BYPOSITION or MF_UNHILITE); //убрать подсветку
end;


 
Alexandr   (2002-05-18 13:10) [13]

вот и у меня никакого эффекта на событие :)
А ПОЧЕМУ?



 
Romkin   (2002-05-18 13:14) [14]

По крайней мере, форма реагирует на WM_COMMAND:

procedure TForm2.Button1Click(Sender: TObject);
var
MenuWnd: HWND;
MenuHandle: HMENU;
ItemHandle: HMENU;
ItemID: Word;
ItemInfo: TMenuItemInfo;
s: string;
begin
MenuWnd := FindWindow(nil, "MenuForm");
if MenuWnd = 0 then
begin
ShowMessage("Window not found");
Exit;
end;
MenuHandle := GetMenu(MenuWnd);
ShowMessage("Menu handle is " + IntToHex(MenuHandle,8));
ItemID := GetMenuItemID(MenuHandle,0);
SetLength(s, 100);
ZeroMemory(@ItemInfo, SizeOf(ItemInfo));
with ItemInfo do
begin
cbSize := 44; // Required for Windows 95
fMask := MIIM_TYPE;
dwTypeData := PChar(s);
cch := Length(s);
end;

if GetMenuItemInfo(MenuHandle, 0, True, ItemInfo) then
begin
SetLength(s, ItemInfo.cch);
ShowMessage("Item info "+ s);
end;
HiliteMenuItem(MenuWnd, MenuHandle, 0, MF_BYPOSITION or MF_HILITE);
sleep(200);
//Click item & wait
SendMessage(MenuWnd, WM_COMMAND,ItemID, 0); //Yess!!!

HiliteMenuItem(MenuWnd, MenuHandle, 0, MF_BYPOSITION or MF_UNHILITE);
end;


 
Alexandr   (2002-05-18 13:21) [15]

ага, но пункт меню-то не вызывается...


 
Romkin   (2002-05-18 13:26) [16]

Что значит не вызывается? у меня на этом пункте ShowMessage, сразу показывает. А для нажатия на нужный пункт надо найти его (GetSubMenu/GetMenuItemID), потом нажать


 
Alexandr   (2002-05-18 13:33) [17]

будь добр, скинь весь проект на мыло.
У меня-то тоже ShowMessage на OnClick написано, а caption и handle из твоего примера у меня показывается...
То ли я чего-то не так делаю, то-ли одно из двух...


 
Alexandr   (2002-05-18 13:36) [18]

уже получилось, просто если есть субменю, то в основном пункте OnClick не вызывается, а я его заставлял, убрал субменю, и OnClick в основном пункте прошел!

Моя благодарность не знает границ.


 
Alexandr   (2002-05-18 13:39) [19]

вообщем, проблема считается полностью закрытой. Все работает.

Еще раз спасибо.


 
Romkin   (2002-05-18 13:42) [20]

Ушло все на alexandr@dan.omsknet.ru



Страницы: 1 вся ветка

Форум: "WinAPI";
Текущий архив: 2002.07.18;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.005 c
1-58079
Stuart
2002-07-05 15:20
2002.07.18
Изменить ресурсы в exe-файле


1-58101
ИгорьК
2002-07-08 14:09
2002.07.18
Показать форму из трэя!


1-58181
star
2002-07-05 13:12
2002.07.18
Как плавно прорисовать форму ?


4-58372
Vovas
2002-05-18 12:47
2002.07.18
Не обновляются обои на рабочем столе под win2000.


8-58235
anod
2002-03-12 00:39
2002.07.18
Скины





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский