Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.18;
Скачать: CL | DM;

Вниз

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 вся ветка

Текущий архив: 2002.07.18;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.01 c
6-58237
Vlad___
2002-05-08 11:20
2002.07.18
HTTP Proxy + собственный протокол


3-58020
Элизабет
2002-06-26 18:31
2002.07.18
Продолжительность в отчете


1-58169
Valeris
2002-07-05 11:32
2002.07.18
Цвет кнопки


1-58191
^Sanya
2002-07-06 01:19
2002.07.18
Дизайн приложения: реализация


14-58265
Igor_thief
2002-06-20 14:59
2002.07.18
Try2hack