![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
|||
|
|||
|
Увожаемые может ктонить подсказать каким образом добавить свой пункт в контекстное меню вызываемое в Edit'e другой программы?
Вот собственно код того что я делаю... Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Menus;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WinMSG(var Msg:TMsg;var Handled:Boolean);
procedure DoWhatEver;
Function EnumProc(h:HWND):BOOL; stdcall;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
//**********************Моё*********************//
const
ItemID=99;
Procedure TForm1.WinMSG(var Msg:TMsg;var Handled:Boolean);
begin
if
Msg.message=WM_SYSCOMMAND then
if Msg.wParam = ItemID then
DoWhatEver;
end;
//*******************************************//
//***********EnProc**********///
Function TForm1.EnumProc(h:HWND):BOOL;stdcall;
begin
Application.OnMessage:=WinMSG;
AppendMenu(GetSystemMenu(h,false),MF_SEPARATOR,0,'');
AppendMenu(GetSystemMenu(h,False),MF_BYPOSITION,ItemID,'My Menu');
EnumProc:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
EnumWindows(@EnumProc, 0); //<--- вот здесь возникает не ясная ошибка
end;
procedure TForm1.DoWhatEver;
begin
ShowMessage('00000');
end;
end.lmikle: Хде теги?!! Незнаю правильно ли я делаю проверить пока не удалось ![]() Последний раз редактировалось Erl, 10.04.2009 в 11:02. |
|
#2
|
|||
|
|||
|
Уберите callback-функцию EnumProc из списка методов формы. Когда это будет обычная функция, а не метод, ошибка должна исчезнуть. =)
И еще. Цитата:
P.S. Причем тут Edit в чужой программе, мне непонятно. Новый пункт меню вы добавляете в системное меню. Последний раз редактировалось Nyctos Kasignete, 10.04.2009 в 15:18. |
|
#3
|
|||
|
|||
|
Цитата:
Собственно мне нужно добавить свой пункт контекстного меню которое всплывает по щелчку по эдиту. Приведённый выше код добовляет пункт в контекстное меню для всех открытых окон(т.к. я столкунлся с ошибкой код не был доведён до ума ибо проверить правильность я не мог.) Ну и сооответственно я пологаю для того чтобы встроить свой пункт в меню всплывающем при нажатии на Edit мне нужно найти будет дочернии окна определённого типа... Возможно я ошибаюсь. |
|
#4
|
|||
|
|||
|
Цитата:
удалил stdcall; но проблемма не исчезла ![]() Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs,Menus;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
procedure WinMSG(var Msg:TMsg;var Handled:Boolean);
procedure DoWhatEver;
Function EnumProc(h:HWND):BOOL;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
const
ItemID=99;
Procedure TForm1.WinMSG(var Msg:TMsg;var Handled:Boolean);
begin
if
Msg.message=WM_SYSCOMMAND then
if Msg.wParam = ItemID then
DoWhatEver;
end;
Function TForm1.EnumProc(h:HWND):BOOL;
begin
Application.OnMessage:=WinMSG;
AppendMenu(GetSystemMenu(h,false),MF_SEPARATOR,0,'');
AppendMenu(GetSystemMenu(h,False),MF_BYPOSITION,ItemID,'My Menu');
EnumProc:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
EnumWindows(@EnumProc,0);//<---ошибка тут не исчезла
end;
procedure TForm1.DoWhatEver;
begin
ShowMessage('00000');
end;
end.вот собственно ошибки которые возникают при компиляции: [Error] Unit1.pas(58): Variable required [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas' |
|
#5
|
|||
|
|||
|
Цитата:
Цитата:
Код:
......................
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;
......................Цитата:
Если нужно добраться именно до контекстного меню Edit'а, то, очевидно, нужно брать handle не функцией GetSystemMenu, а какой — не знаю, если честно... И, конечно, нужно перебирать дочерние окна. Для этого из функции EnumProc нужно вызывать функцию EnumChildWindows, указывая ей в качестве параметра адрес еще одной callback-функции, в которой и нужно выполнять модификацию меню. |
|
#6
|
|||
|
|||
|
Благодарю за совет.
|