我正在寻找一种在 firemonkey 应用程序中缓存全局热键的方法(仅限 Windows,至少目前如此)。经过一些挫折和谷歌搜索后,这应该可以工作:用winapi调用注册热键
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 应用程序中一样注册热键,它们将被咳嗽 http://www.swissdelphicenter.ch/torry/showcode.php?id=147 希望它有意义