Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

PostMessage


Alexandr ©   (2002-05-18 10:34:00) 

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


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

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


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

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

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


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

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

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


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

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


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

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


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

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


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

По крайней мере, форма реагирует на 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:10:00) [8]

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


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


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 12:27:00) [10]

ну так вот, я пока не стал заморачиваться с другим приложением, а решил попробовать в собственном.
Создал меню, повесил на пункт меню 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 12:22:00) [11]

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


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

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

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


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

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


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

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

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


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


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

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


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

вот как делаю

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 как узнать можно? Или только перебором - практикой


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

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


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

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


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

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


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

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо