2011-11-08 2 views
4

С Delphi Win32 (VCL) Я использую:FireMonkey эквивалентен Application.OnMessage?

Application.OnMessage := MyAppMessage; 

Что такое эквивалент в FireMonkey?

У меня есть обычная программа, которая должна захватывать все события клавиатуры и мыши в приложении (на всех активных элементах формы) и обрабатывать их.

+6

Обработка сообщений Windows не будет перекрестной платформой. Что вы пытаетесь достичь? –

+0

Я отредактировал ваш вопрос, чтобы включить то, что вы пытаетесь сделать, скопировав свой комментарий ниже и дал ответ. –

ответ

5

Я не знаю способа в FireMonkey для захвата событий мыши и клавиатуры на уровне приложений агностическим способом платформы. Я не думаю, что это было реализовано еще, начиная с Delphi XE 2 Update 2.

Однако по умолчанию формы FireMonkey получают все события MouseDown и KeyDown до того, как будут выполнены действия элементов управления.

Если вы просто переопределите события MouseDown и KeyDown в своей форме, вы выполните одно и то же.

type 
    TForm1 = class(TForm) 
    Button1: TButton; 
    Edit1: TEdit; 
    private 
    { Private declarations } 
    public 
    { Public declarations } 
    procedure MouseDown(Button: TMouseButton; Shift: TShiftState; X, Y: Single); override; 
    procedure KeyDown(var Key: Word; var KeyChar: System.WideChar; Shift: TShiftState); override; 
    end; 

{ TForm1 } 

procedure TForm1.KeyDown(var Key: Word; var KeyChar: System.WideChar; 
    Shift: TShiftState); 
begin 
    // Do what you need to do here 
    ShowMessage('Key Down'); 
    // Let it pass on to the form and control 
    inherited; 
end; 

procedure TForm1.MouseDown(Button: TMouseButton; Shift: TShiftState; X, 
    Y: Single); 
begin 
    // Do what you need to do here 
    ShowMessage('Mouse Down'); 
    // Let it pass on to the form and control 
    inherited; 
end; 

Если вы хотите, вы можете продолжать идти с MouseMove, MouseUp, MouseWheel, MouseLeave, KeyUp, DragEnter, DragOver, DragDrop и DragLeave.

+0

Благодарю вас, ваша рутина может решить мою проблему. Я вижу, что формы FireMonkey, отличные от форм VCL, получают по умолчанию все события MouseDown и KeyDown до того, как это делают элементы управления. – DelphiFM

+0

+1 Хорошо для вас Маркус. Это теперь совсем другой вопрос, который заставляет мой ответ выглядеть немного неуместным, но это прекрасно, вы помогли ассеру. –

+0

Это не работает, когда вы нажимаете на элемент управления, который имеет DragMode = dmAutomatic.Пробовал это с помощью MouseUp. – Domus

6

FireMonkey - это кроссплатформенная платформа и работает под управлением Windows, Mac OSX, iOS и, без сомнения, многих других платформ со временем. Поэтому нет сообщений Windows, открытых FireMonkey.

Что бы вы ни делали с OnMessage в VCL, скорее всего, имеет эквивалент в FireMonkey. Именно то, что этот эквивалент сильно зависит от того, чего пытается достичь ваш обработчик OnMessage.

+0

Хороший ответ, Дэвид. То, что я попытался сказать более кратко в своем комментарии. –

+1

@ Маркус Да, я знаю, что я просто повторял ваш комментарий. Это было достойно ответа. Если никто не отвечает, я думаю, что это может выглядеть плохо. –

+0

OnMessage, да? Возможно, он использует какой-то IPC через сообщения - и используя OnMessage для обнаружения прибытия сообщения ... –

0

Эти ответы подходят для открытых событий, но для других неясных системных событий это более сложно. На момент написания эта ссылка не ответил:

capturing-usb-plug-unplug-events-in-firemonkey

, но это поможет решить общую проблему.


Я бы разместил это как комментарий, а не ответ, но предыдущие ответы не принимали дальнейших комментариев.