gpt4 book ai didi

Delphi - 让外部应用程序最小化以触发另一个应用程序最小化过程

转载 作者:行者123 更新时间:2023-12-03 19:40:15 25 4
gpt4 key购买 nike

我正在寻找一个解决方案,我的应用程序将使用它的 WindowState 跟随另一个外部应用程序。

基本思想是,我将对下一次更改采取行动:
当外部应用程序标准化时:将我的表单移动到特定坐标
最大化外部应用程序时:将我的表单移动到特定坐标
当外部应用程序最小化时:将我的表单最小化到任务栏。

这么说,我希望我的应用程序看起来和行为就像它是某个外部应用程序的实际部分。

到目前为止,这就是我所拥有的:

我得到了外部窗口句柄。使用下一个函数案例,我得到如下结果:

  case WindowPlacement.showCmd of
SW_HIDE: Result := 0; // hidden
SW_SHOWNORMAL: Result := 1; // show normal
SW_SHOWMINIMIZED: Result := 2; // minimized
SW_SHOWMAXIMIZED: Result := 3; // maximized
end;

这工作正常。但是,目前,我正在使用计时器事件每 100mS 触发一次,它会获取此函数结果,然后执行如下操作:
procedure TPre2.Timer1Timer(Sender: TObject);
var t: integer;
begin
t:= CheckWindowState(AvoHandle);
case t of
0: Application.Minimize;
1: Application.MainForm.WindowState:=wsNormal; // add position later
2: Application.Minimize;
3: Application.MainForm.WindowState:=wsNormal; // add position later
end;

这会让事情随机工作与否。几次它会按应有的方式最小化和恢复,然后在外部应用程序最小化后的下一刻,我的应用程序保持可见而不是隐藏。定时器仍在循环。
单击任务栏中的应用程序图标会使其立即最小化。

有没有更好的方法来实现我想要实现的目标?或者,是否有任何合理的理由可能导致这并不总是有效?

谢谢。

最佳答案

这种任务可以使用 CBT Hook 来完成。要实现这种类型的钩子(Hook),请按照以下步骤操作。

  • 使用 SetWindowsHookEx 安装全局CBT的功能钩。 (要安装全局 Hook ,您应该从 dll 调用此方法和回调过程,请查看 MSDN 文档了解详细信息)
  • 在 CBTProc 回调函数中检查 HCBT_MINMAX代码。
  • LParam CBTProc callback function 将包含一个显示窗口值(SW_HIDE、SW_MAXIMIZE、SW_MINIMIZE 等)
  • 从您的应用程序中使用 LoadLibrary使用全局钩子(Hook)实现加载 dll 的方法(您可以从 dll 中导出一个方法来启用或禁用钩子(Hook))。
  • 要将您的应用程序与 dll 通信,您可以使用共享内存块 ( CreateFileMappingMapViewOfFile ) 和自定义消息 ( RegisterWindowMessage )。
  • 关于Delphi - 让外部应用程序最小化以触发另一个应用程序最小化过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30470970/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com