私はfiremonkeyアプリでグローバルホットキーを取得する方法を探しています(少なくとも今のところ、Windowsのみ)。いくつかの欲求不満とグーグルの後、これはうまくいくはずです:winapi呼び出しでホットキーを登録してください
RegisterHotKey(FmxHandleToHWND(form1.Handle), 0 , MOD_CONTROL, $41);
trueを返します。
次に、フォームの手順でホットキーをキャッチします
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アプリのようにホットキーを登録する必要があり、それらは http://www.swissdelphicenter.ch/torry/showcode.php?id=147 それが理にかなっていることを願って検索されます