TApplication.MainFormOnTaskbar
システム全体のホットキーにはまったく影響しません。確かに確認できます。WM_HOTKEY
何が設定されていても、アプリがフォーカスされているかどうかに関係なく、メッセージを受信できますMainFormOnTaskbar
。したがって、表示されているものは、あなたが思っていることではありません。
ほとんどの場合、フォームHandle
は、電話をかけた後、単に背中の後ろで再作成されているため、メッセージを受信するフォームRegisterHotKey()
が失われます。イベントを使用する代わりに、フォームとメソッドをオーバーライドして、フォームに何が起こってもホットキーが常にフォームの現在の値に登録されるようにする必要があります(フォームに何らかのデータを関連付けるときは常にそれを行う必要があります)、例えば:HWND
WM_HOTKEY
OnCreate
CreateWindowHandle()
DestroyWindowHandle()
HWND
Handle
type
TForm1 = class(TForm)
private
HotKey_xyz: WORD;
procedure WMHotKey(var Message: TMessage); message WM_HOTKEY;
protected
procedure CreateWindowHandle(const Params: TCreateParams); override;
procedure DestroyWindowHandle; override;
end;
procedure TForm1.CreateWindowHandle(const Params: TCreateParams);
begin
inherited;
HotKey_xyz := GlobalAddAtom('Hotkey_xyz');
if HotKey_xyz <> 0 then
RegisterHotKey(Self.Handle, HotKey_xyz, MOD_CONTROL, VK_F12);
end;
procedure TForm1.DestroyWindowHandle(const Params: TCreateParams);
begin
if HotKey_xyz <> 0 then
begin
UnregisterHotKey(Self.Handle, HotKey_xyz);
GlobalDeleteAtom(HotKey_xyz);
HotKey_xyz := 0;
end;
inherited;
end;
procedure TForm1.WMHotKey(var Message: TMessage);
begin
...
end;
より良いオプションは、ホットキーメッセージを処理するためだけにAllocateHWnd()
専用の別のを割り当てるために使用することです(その後、およびイベントを再度使用できます)。例:HWND
OnCreate
OnDestroy
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
HotKey_xyz: WORD;
HotKeyWnd: HWND;
procedure HotKeyWndProc(var Message: TMessage);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
HotKeyWnd := AllocateHwnd(HotKeyWndProc);
HotKey_xyz := GlobalAddAtom('Hotkey_xyz');
if HotKey_xyz <> 0 then
RegisterHotKey(HotKeyWnd, HotKey_xyz, MOD_CONTROL, VK_F12);
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
if HotKey_xyz <> 0 then
begin
UnregisterHotKey(HotKeyWnd, HotKey_xyz);
GlobalDeleteAtom(HotKey_xyz);
HotKey_xyz := 0;
end;
if HotKeyWnd <> 0 then
begin
DeallocateHWnd(HotKeyWnd);
HotKeyWnd := 0;
end;
end;
procedure TForm1.HotKeyWndProc(var Message: TMessage);
begin
if Message.Msg = WM_HOTKEY then
begin
...
end else
Message.Result := DefWindowProc(HotKeyWnd, Message.Msg, Message.WParam, Message.LParam);
end;