EnableMenuItem
От: mighty  
Дата: 15.08.05 19:23
Оценка:
Есть чужая прога у которой один из пунктов меню недоступен. Надо его включить.

Делаю так:
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);
функция проходит на ура и событие срабатывает, если же в дизайнтайме, то только подсветка включается
Re: EnableMenuItem
От: wellwell Австралия https://www.softperfect.com
Дата: 15.08.05 19:29
Оценка:
"mighty" <27517@users.rsdn.ru> wrote in message news:1327908@news.rsdn.ru...
> Есть чужая прога у которой один из пунктов меню недоступен. Надо его включить.
> Пункт меню включается, но не срабатывает событие(команда) на этом пункте. Кто сталкивался с подобным, ткните пальцем в функцию? плз..

А может в этой чужой проге, просто проверяется некий внутренний фланг в MenuItem.OnClick:
if CanDoThisOperation then
begin
...
end

и от флага CanDoThisOperation зависит состояние пункта меню. Раздизаблив его, ты убираешь следствие, но оставляешь причину.
Posted via RSDN NNTP Server 1.9
Re[2]: EnableMenuItem
От: mighty  
Дата: 15.08.05 19:45
Оценка:
Здравствуйте, wellwell, Вы писали:

W>А может в этой чужой проге, просто проверяется некий внутренний фланг в MenuItem.OnClick:

Речь идет о Delphi. Я сам создал приложение (Form1) на нем расопложил меню и сделал недоступным один из его пунктов(в его обработчике выдаю сообщение showmessage('Готово')) и запустил его.А потом создал второе приложение с кнопкой, событие по которой я привел. Все как будто нормально, и пункт подсвечивается, будто активным становится, но событие не срабатывает, сообщение не появляется..Больше того, я сделал меню и во втором приложении, даже в нем, если я ищу его через чистый API (wnd:=FindWindow(nil,'Form2')) происходит тоже самое.
Re[3]: EnableMenuItem
От: Sergei I. Gorelkin Россия  
Дата: 16.08.05 05:40
Оценка:
Здравствуйте, mighty, Вы писали:

M>Здравствуйте, wellwell, Вы писали:


W>>А может в этой чужой проге, просто проверяется некий внутренний фланг в MenuItem.OnClick:

M>Речь идет о Delphi. Я сам создал приложение (Form1) на нем расопложил меню и сделал недоступным один из его пунктов(в его обработчике выдаю сообщение showmessage('Готово')) и запустил его.А потом создал второе приложение с кнопкой, событие по которой я привел. Все как будто нормально, и пункт подсвечивается, будто активным становится, но событие не срабатывает, сообщение не появляется..Больше того, я сделал меню и во втором приложении, даже в нем, если я ищу его через чистый API (wnd:=FindWindow(nil,'Form2')) происходит тоже самое.

Для программы на Дельфи через WinAPI так не сделать. Нужно внедриться в адресное пространство процесса, получить там указатель на объект TMenuItem, соответствующий нужному пункту меню, и вызвать TMenuItem.SetEnabled (опять же, как-то определив адрес этой процедуры). Имхо, требуемые для этого усилия явно не стоят того, чтобы заниматься этим со своими программами — проще реализовать некий собственный механизм изменения пунктов меню.
Re[4]: EnableMenuItem
От: mighty  
Дата: 16.08.05 15:44
Оценка:
Здравствуйте, Sergei I. Gorelkin, Вы писали:

Спасибо за разъяснения но..

>Для программы на Дельфи через WinAPI так не сделать.

На каком языке программирования это можно написать без проблем, всмысле чтобы не писать на низком уровне "внедрение" в область процесса? Я понять не могу почему не срабатывает обычное API?? А на CBuilder или VisualStudio эти функции API сработают как надо?

>чтобы заниматься этим со своими программами

Нет программа не своя, это я для примера написал свою, чтобы люди попробовать могли, понять что я хочу. Реально надо у чужой проги открыть пункт меню.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.