Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Перехват сообщения кнопки мыши Delphi 6


Автор: Aehn 25.7.2008, 12:38
Надо перехватить сообщение при нажатии на правую кнопку мыши

Пытаюсь делать такую вещь:

Код

private
.......
    procedure WMRBUTTONDOWN(var a:TWMRBUTTONDOWN); message WM_RButtonDown;
........
implementation
........

 procedure TFom11.WMRBUTTONDOWN(var a:TWMRBUTTONDOWN);
 begin
   showmessage('!!!');
   inherited;
 end;


Вещь компилируется, работает, но при нажатии на правую кнопку делает все как и делала до написания этой процедуры. Никакого сообщения не показывает.

Что я делаю не так?

Автор: Rennigth 25.7.2008, 12:54
Aehn, значит кто-то раньше перехватывает WM_RBUTTONDOWN. Что у тебя еще в проекте используеться? Если код не брльшой, выкладывай.

Добавлено через 1 минуту и 53 секунды
у тебя на форме случаем ничего не лежит, может ты кликаешь по чему-то другому? 

Автор: Christoph 25.7.2008, 14:55
Сейчас подумаем....  smile 

Автор: Christoph 25.7.2008, 15:15
Сделал....Работает 

Код


type
  TForm1 = class(TForm)
      private
   procedure WMRBUTTONDOWN(var Msg:TWMMOUSE); message  WM_RButtonUp;
     public
  end;

var
  Form1: TForm1;

  implementation

{$R *.dfm}

procedure TForm1.WMRBUTTONDOWN(var Msg:TWMMOUSE);
 begin
   ShowMessage('Ура перехватил');
  end;

end.



ой та и твой код рабочий...если нажимаешь на форму...работает, а если клацнешь на компонент правой кнопкой, то ничего не будет обрабатываться

Автор: THandle 26.7.2008, 05:37
Можно попробовать подменить WindowProc...

Пример:

Код


unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    FOldWndProc : TWndMethod;
    { Private declarations }
  public
    procedure NewWndProc(var Message : TMessage);
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin
  FOldWndProc := WindowProc;
  WindowProc := NewWndProc;
end;

procedure TForm1.NewWndProc(var Message: TMessage);
begin
  if (Message.Msg = WM_RBUTTONDOWN) then
    //код, который будет работать при нажатии правой кнопки мыши...
    ShowMessage('');
  FOldWndProc(Message);
end;

end.

Автор: Arigato 27.7.2008, 18:51
Я извиняюсь, а почему просто не использовать события формы OnMouseDown или OnMouseUp?

Автор: Aehn 28.7.2008, 08:34
Проблема в том, что на правой кнопке висит PopupMenu. Была идея отрубить PopupMenu на время выполнения обработчика и вызывать его в конце процедуры обработчика, но как это сделать? Ведь у Popup menu четко прописана кнопка по которой оно вызывается (Свойство TrckButton). Либо правая, либо левая тертьего не дано, чтобы оно просто было в памяти и вызывалось когда ей прикажут. Код уже приличный, тащить его сюда - себе дороже.

OnMouseDown, OnMouseUp отрабатывают интересным образом, вначале вызывается popupmenu а уж потом все, что мне нужно. Положение Inherited (после/до того, что мне нужно) для правой кнопки не срабатывает, только для левой. Короче,  вся надежда на свой обработчик, который пока тоже не срабатывает до вызова этого чертового popupmenu.

Нужно, чтобы когда мы нажимали правую кнопку мыши у меня отрабатывалась моя процедура, потом выпадало меню, пункты которого работают для выделенного узла TreeView.

Автор: VICTAR 28.7.2008, 13:44
Цитата(Aehn @  28.7.2008,  09:34 Найти цитируемый пост)
Была идея отрубить PopupMenu на время выполнения обработчика и вызывать его в конце процедуры обработчика, но как это сделать? 

Ну отрубить понятно как  smile , а вызвать
Код

PopupMenu1.Popup(X, Y);

Автор: Aehn 28.7.2008, 14:16
Как раз непонятно как отрубить. А эта штука PopupMenu1.Popup(X, Y); вызывается для левой кнопки нормально, для правой при задании X,Y  Попап меню все равно непосредственно под курсором.
А как ее отрубить?

Автор: VICTAR 28.7.2008, 14:25
Как отрубить? В инспекторе объектов убрать PopupMenu. Или я чего-то не понимаю?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)