Delphi Windows - 确定关闭请求源

Delphi Windows - determine close request source

是否可以确定 Windows 应用程序 (Delphi) 中关闭请求的来源?

后台:我可以选择路由关闭请求以最小化 window 以保持应用程序 运行“在后台”。

procedure TfrmMain.FormCloseQuery(Sender: TObject; var CanClose: Boolean);
begin
    ...  different checking stuff e.g. unsaved changes
    // Redirect Close to minimize but allow close if requested from minimized state
    if FMinimize and (WindowState <> wsMinimized) then
    begin
        logger.debug('... closing main form redirected to minimize');
        WindowState := wsMinimized;
        CanClose := false;
        exit;
    end;
end;

这很好用,如果已经最小化,允许通过右键单击任务栏关闭 window。作为锦上添花,我想确定关闭请求是否来自右键单击任务栏图标以立即关闭,即使 window 尚未最小化。有没有办法确定关闭请求的来源?

通过 top-right 角的 X 按钮关闭 window 与 right-click 菜单上的 Close window 选项没有区别window 的任务栏按钮,与 ALT-F4 击键相比。它们都代表相同的关闭命令。如果调用这些选项中的任何一个,window 将收到一个 WM_SYSCOMMAND(SC_CLOSE) 消息,如果传递给 DefWindowProc() 将生成一个 WM_CLOSE 消息,该消息将触发表单的 OnCloseQuery 事件。所以不,没有办法区分初始 WM_SYSCOMMAND 消息的来源。只有用户希望 window 关闭。

也就是说,您可以尝试让您的表单拦截 WM_NCHITTESTWM_SYSKEYDOWN 消息以检测用户何时单击 X 按钮或按下 ALT-F4 在键盘上。您可以使用这些消息来设置您的 OnCloseQuery 事件可以查看的标志。这是我现在能想到的区分任务栏和 non-Taskbar 闭包的唯一方法。