Форум: "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.01 c