Я ищу способ захватить глобальную горячую клавишу в приложении firemonkey (только для окон, по крайней мере пока). После некоторого разочарования и погуглить это должно работать: регистр горячих клавиш с WinAPI называютfiremonkey и глобальная горячая клавиша?
RegisterHotKey(FmxHandleToHWND(form1.Handle), 0 , MOD_CONTROL, $41);
он возвращает истину.
, а затем поймать горячую клавишу в процедуре, сформировавшийся
procedure WMHotKey(var Msg: TWMHotKey); message WM_HOTKEY;
, но это один никогда не вызывается. Раньше я делал это в приложениях vcl, поэтому думаю, что firemonkey обрабатывает сообщения по-разному. Итак, вопрос в следующем: как я могу использовать глобальные горячие клавиши в приложении firemonkey?
Редактирование: некоторые примеры применения этого решения. Я создал блок с небольшим классом
unit fire_hotkey;
interface
uses windows, messages,allocatehwnd;
type
TMsgHandler = procedure (var Msg: TMessage) of object;
THotClass = class(TObject)
fMsgHandlerHWND : HWND;
proc:TMsgHandler;
constructor Create;
procedure init;
destructor Destroy; override;
end;
implementation
{ hotClass }
constructor THotClass.Create;
begin
inherited;
end;
destructor THotClass.Destroy;
begin
ThreadDeallocateHWnd(fMsgHandlerHWND);
inherited;
end;
procedure THotClass.init;
begin
fMsgHandlerHWND := ThreadAllocateHWnd(proc,true);
end;
end.
тогда моя главная форма имеет порядок обработки горячих клавиш событий:
procedure TformEditor.WMHotKey(var Msg: TMessage);
begin
if Msg.Msg = WM_HOTKEY then
begin
//call lua function or sth
//...
end
else
Msg.Result := DefWindowProc(hotkeyGrabber.fMsgHandlerHWND, Msg.Msg, Msg.wParam, Msg.lParam);
end;
и есть глобальная hotkeyGrabber: THotClass; что инициализируется в форме создание:
hotkeyGrabber:=THotClass.Create;
hotkeyGrabber.proc:=WMHotKey;
hotkeyGrabber.init;
после этого вы должны зарегистрировать горячие клавиши, как в обычном приложении VCL, и они будут Cought http://www.swissdelphicenter.ch/torry/showcode.php?id=147 надеется, что это имеет смысл
Кто-то помог мне на самом деле использовать это решение, поэтому я добавил его на вопрос – laggyluk