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

时间:2015-05-26 23:58:49

标签: delphi window

我正在寻找一个解决方案,我的应用程序将使用其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;

这很好用。但是,目前,我正在使用timer事件触发每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;

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

对于我想要达到的目标,是否有更好的方法?或者,是否有任何合理的理由可能导致这种情况无法正常工作?

THX。

1 个答案:

答案 0 :(得分:3)

这种任务可以使用CBT Hook完成。要实现这种类型的钩子,请遵循以下步骤。

  1. 使用SetWindowsHookEx函数安装全局CBT挂钩。 (为了安装全局挂钩,您应该从dll调用此方法和回调过程,请查看MSDN文档以获取详细信息)

  2. 在CBTProc回调函数中检查HCBT_MINMAX代码。

  3. CBTProc callback functionLParam将包含展示窗口值(SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE等)

  4. 从您的应用程序使用LoadLibrary方法加载带有全局钩子实现的dll(您可以从dll导出方法以启用或禁用钩子)。

  5. 要与dll通信您的应用,您可以使用共享内存块(CreateFileMappingMapViewOfFile)和自定义消息(RegisterWindowMessage)。

    < / LI>