【发布时间】:2016-05-03 01:58:39
【问题描述】:
我正在尝试做一个非常简单的任务...检测我的表单何时被最小化。
但似乎 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;
【问题讨论】:
-
消息不会发送到您分配的那个窗口。它们被发送到表单后面的窗口。据我所知,您将需要挂钩该窗口的窗口过程。我重新标记了这个问题,因为您显然只针对 Windows。
-
@DavidHeffernan 如果我执行
SetWindowLongPtr(WindowHandleToPlatform(Handle).Wnd, GWL_WNDPROC, IntPtr(MakeObjectInstance(WndProcHandler)));,我可以收到消息,但是表单不会更新,因为原始 WndProc 没有被调用......不知道该怎么做 -
要做的就是钩住窗口过程。使用
WH_CALLWNDPROCRET钩子。 -
我相信这里已经回答了这个问题:stackoverflow.com/questions/20195547/…
-
@DavidHeffernan 尝试使用 Hwnd 和 Application Hwnd 形式的
SetWindowsHookEx(WH_CALLWNDPROCRET, @HookProc, ApplicationHwnd,0);,HookProc 永远不会被调用...我正在研究涉及WM_WINDOWPOSCHANGING的解决方案。 @Matta 用于 VCL
标签: windows delphi firemonkey delphi-xe8