【问题标题】:Capture Minimize event for Firemonkey form?捕获 Firemonkey 表单的最小化事件?
【发布时间】: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


【解决方案1】:

用下面的代码让它工作。 查找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);

【讨论】:

    猜你喜欢
    • 2014-03-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多