捕获 Firemonkey 表单的最小化事件?
Capture Minimize event for Firemonkey form?
我正在尝试执行一项非常简单的任务...检测我的表单何时被最小化。
但似乎 Firemonkey 完全没有办法处理这个问题。
我尝试使用 AllocateHWnd
拦截 WM_SYSCOMMAND
消息,但我得到的只是 WM_ACTIVATEAPP
消息,没有别的。
创建表单:
AllocateHWnd(WndProcHandler);
WndProcHandler:
procedure TfrmMain.WndProcHandler(var Message: TMessage);
begin
if Message.msg = WM_SYSCOMMAND then
OutputDebugStringA('got command');
end;
使用以下代码可以正常工作。
查找 WM_SIZE
命令和 SIZE_MINIMIZED
参数以检测所有最小化事件。
uses
Winapi.Windows, Winapi.Messages;
var
WndProcHook: THandle;
function WndProc(Code: integer; WParam, LParam: LongInt): LRESULT; stdcall;
var
msg: TCWPRetStruct;
begin;
if (Code >= HC_ACTION) and (LParam > 0) then begin
msg := PCWPRetStruct(LParam)^;
if (msg.Message = WM_SIZE) and (msg.WParam = SIZE_MINIMIZED) then begin
// Application has been minimized
// Check msg.wnd = WindowHandleToPlatform(Form1.Handle).wnd if necessary
end;
end;
result := CallNextHookEx(WndProcHook, Code, WParam, LParam)
end;
initialization
WndProcHook := SetWindowsHookEx(WH_CALLWNDPROCRET, @WndProc, 0, GetCurrentThreadId);
finalization
UnhookWindowsHookEx(WndProcHook);
我正在尝试执行一项非常简单的任务...检测我的表单何时被最小化。
但似乎 Firemonkey 完全没有办法处理这个问题。
我尝试使用 AllocateHWnd
拦截 WM_SYSCOMMAND
消息,但我得到的只是 WM_ACTIVATEAPP
消息,没有别的。
创建表单:
AllocateHWnd(WndProcHandler);
WndProcHandler:
procedure TfrmMain.WndProcHandler(var Message: TMessage);
begin
if Message.msg = WM_SYSCOMMAND then
OutputDebugStringA('got command');
end;
使用以下代码可以正常工作。
查找 WM_SIZE
命令和 SIZE_MINIMIZED
参数以检测所有最小化事件。
uses
Winapi.Windows, Winapi.Messages;
var
WndProcHook: THandle;
function WndProc(Code: integer; WParam, LParam: LongInt): LRESULT; stdcall;
var
msg: TCWPRetStruct;
begin;
if (Code >= HC_ACTION) and (LParam > 0) then begin
msg := PCWPRetStruct(LParam)^;
if (msg.Message = WM_SIZE) and (msg.WParam = SIZE_MINIMIZED) then begin
// Application has been minimized
// Check msg.wnd = WindowHandleToPlatform(Form1.Handle).wnd if necessary
end;
end;
result := CallNextHookEx(WndProcHook, Code, WParam, LParam)
end;
initialization
WndProcHook := SetWindowsHookEx(WH_CALLWNDPROCRET, @WndProc, 0, GetCurrentThreadId);
finalization
UnhookWindowsHookEx(WndProcHook);