Показать сообщение отдельно
  #5  
Старый 11.04.2009, 11:31
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Цитата:
Сообщение от Erl
удалил stdcall; но проблемма не исчезла
Причем тут stdcall? Я же вам, кажется, по-русски сказала:
Цитата:
Сообщение от Nyctos Kasignete
Уберите callback-функцию EnumProc из списка методов формы.
В общем, вот:
Код:
......................
type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  procedure WinMSG(var Msg:TMsg;var Handled:Boolean);
  procedure DoWhatEver;

  end;

var
  Form1: TForm1;
  Function EnumProc(h:HWND):BOOL; stdcall; // <-- Обычная функция, а не метод объекта формы!!

......................

Function EnumProc(h:HWND):BOOL; stdcall;
begin
Application.OnMessage:=Form1.WinMSG;
AppendMenu(GetSystemMenu(h,false),MF_SEPARATOR,0,'');
AppendMenu(GetSystemMenu(h,False),MF_BYPOSITION,ItemID,'My Menu');
EnumProc:=true;
end;

......................
_________________

Цитата:
Приведённый выше код добовляет пункт в контекстное меню для всех открытых окон
Еще раз повторю, что не в контекстное меню, а в системное — то, которое открывается по нажатии Alt+Space.
Если нужно добраться именно до контекстного меню Edit'а, то, очевидно, нужно брать handle не функцией GetSystemMenu, а какой — не знаю, если честно...
И, конечно, нужно перебирать дочерние окна. Для этого из функции EnumProc нужно вызывать функцию EnumChildWindows, указывая ей в качестве параметра адрес еще одной callback-функции, в которой и нужно выполнять модификацию меню.
Ответить с цитированием