![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]Какой именно?