Есть чужая прога у которой один из пунктов меню недоступен. Надо его включить.
Делаю так:
procedure TForm1.Button1Click(Sender: TObject);
var
wnd: HWND;
hMen:HMenu;
i:integer;
begin
wnd:=FindWindow(nil,'Form1');
hMen:=GetMenu(wnd);
for i:=0 to 10 do begin
EnableMenuItem(hMen,GetMenuItemID(hMen,i),MF_BYCOMMAND or MFS_ENABLED);
SendMessage(wnd,wm_Command,i,0);
end;
end;
Пункт меню включается, но не срабатывает событие(команда) на этом пункте. Кто сталкивался с подобным, ткните пальцем в функцию? плз..
Мож кто копался в исходниках TMainMenu? Я там совсем заплутал — где точка в которой под NT можно активизировать пункт меню??
PS: Если дизаблить пункт в рантайме(EnableMenuItem(hMen,GetMenuItemID(hMen,i),MF_BYCOMMAND or MF_DISABLED or MF_GRAYED);
), то потом EnableMenuItem(hMen,GetMenuItemID(hMen,i),MF_BYCOMMAND or MFS_ENABLED);
функция проходит на ура и событие срабатывает, если же в дизайнтайме, то только подсветка включается
"mighty" <27517@users.rsdn.ru> wrote in message news:1327908@news.rsdn.ru... > Есть чужая прога у которой один из пунктов меню недоступен. Надо его включить. > Пункт меню включается, но не срабатывает событие(команда) на этом пункте. Кто сталкивался с подобным, ткните пальцем в функцию? плз..
А может в этой чужой проге, просто проверяется некий внутренний фланг в MenuItem.OnClick:
if CanDoThisOperation then
begin
...
end
и от флага CanDoThisOperation зависит состояние пункта меню. Раздизаблив его, ты убираешь следствие, но оставляешь причину.
Здравствуйте, wellwell, Вы писали:
W>А может в этой чужой проге, просто проверяется некий внутренний фланг в MenuItem.OnClick:
Речь идет о Delphi. Я сам создал приложение (Form1) на нем расопложил меню и сделал недоступным один из его пунктов(в его обработчике выдаю сообщение showmessage('Готово')) и запустил его.А потом создал второе приложение с кнопкой, событие по которой я привел. Все как будто нормально, и пункт подсвечивается, будто активным становится, но событие не срабатывает, сообщение не появляется..Больше того, я сделал меню и во втором приложении, даже в нем, если я ищу его через чистый API (wnd:=FindWindow(nil,'Form2')) происходит тоже самое.
Здравствуйте, mighty, Вы писали:
M>Здравствуйте, wellwell, Вы писали:
W>>А может в этой чужой проге, просто проверяется некий внутренний фланг в MenuItem.OnClick: M>Речь идет о Delphi. Я сам создал приложение (Form1) на нем расопложил меню и сделал недоступным один из его пунктов(в его обработчике выдаю сообщение showmessage('Готово')) и запустил его.А потом создал второе приложение с кнопкой, событие по которой я привел. Все как будто нормально, и пункт подсвечивается, будто активным становится, но событие не срабатывает, сообщение не появляется..Больше того, я сделал меню и во втором приложении, даже в нем, если я ищу его через чистый API (wnd:=FindWindow(nil,'Form2')) происходит тоже самое.
Для программы на Дельфи через WinAPI так не сделать. Нужно внедриться в адресное пространство процесса, получить там указатель на объект TMenuItem, соответствующий нужному пункту меню, и вызвать TMenuItem.SetEnabled (опять же, как-то определив адрес этой процедуры). Имхо, требуемые для этого усилия явно не стоят того, чтобы заниматься этим со своими программами — проще реализовать некий собственный механизм изменения пунктов меню.
Спасибо за разъяснения но..
>Для программы на Дельфи через WinAPI так не сделать.
На каком языке программирования это можно написать без проблем, всмысле чтобы не писать на низком уровне "внедрение" в область процесса? Я понять не могу почему не срабатывает обычное API?? А на CBuilder или VisualStudio эти функции API сработают как надо?
>чтобы заниматься этим со своими программами
Нет программа не своя, это я для примера написал свою, чтобы люди попробовать могли, понять что я хочу. Реально надо у чужой проги открыть пункт меню.