Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 10.04.2009, 09:12
Erl Erl вне форума
Прохожий
 
Регистрация: 01.04.2009
Сообщения: 6
Репутация: 10
По умолчанию Вызов контекстного меню в Edit'e другой программы

Увожаемые может ктонить подсказать каким образом добавить свой пункт в контекстное меню вызываемое в 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  
Старый 10.04.2009, 15:09
Nyctos Kasignete Nyctos Kasignete вне форума
Активный
 
Регистрация: 29.03.2009
Сообщения: 300
Репутация: 94
По умолчанию

Уберите callback-функцию EnumProc из списка методов формы. Когда это будет обычная функция, а не метод, ошибка должна исчезнуть. =)

И еще.
Цитата:
Сообщение от Erl
AppendMenu(GetSystemMenu(h,False),MF_BYPOSITION,It emID,'My Menu');
Пробел лишний уберите.

P.S. Причем тут Edit в чужой программе, мне непонятно. Новый пункт меню вы добавляете в системное меню.

Последний раз редактировалось Nyctos Kasignete, 10.04.2009 в 15:18.
Ответить с цитированием
  #3  
Старый 11.04.2009, 05:46
Erl Erl вне форума
Прохожий
 
Регистрация: 01.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Nyctos Kasignete
P.S. Причем тут Edit в чужой программе, мне непонятно. Новый пункт меню вы добавляете в системное меню.

Собственно мне нужно добавить свой пункт контекстного меню которое всплывает по щелчку по эдиту.

Приведённый выше код добовляет пункт в контекстное меню для всех открытых окон(т.к. я столкунлся с ошибкой код не был доведён до ума ибо проверить правильность я не мог.)
Ну и сооответственно я пологаю для того чтобы встроить свой пункт в меню всплывающем при нажатии на Edit мне нужно найти будет дочернии окна определённого типа...

Возможно я ошибаюсь.
Ответить с цитированием
  #4  
Старый 11.04.2009, 06:02
Erl Erl вне форума
Прохожий
 
Регистрация: 01.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Цитата:
Сообщение от Nyctos Kasignete
Уберите callback-функцию EnumProc из списка методов формы. Когда это будет обычная функция, а не метод, ошибка должна исчезнуть. =)

удалил 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  
Старый 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-функции, в которой и нужно выполнять модификацию меню.
Ответить с цитированием
  #6  
Старый 11.04.2009, 11:38
Erl Erl вне форума
Прохожий
 
Регистрация: 01.04.2009
Сообщения: 6
Репутация: 10
По умолчанию

Благодарю за совет.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 22:25.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter