Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/mongodb/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 德尔福-拥有外部';s应用程序最小化以触发另一个应用程序最小化过程_Delphi_Window - Fatal编程技术网

Delphi 德尔福-拥有外部';s应用程序最小化以触发另一个应用程序最小化过程

Delphi 德尔福-拥有外部';s应用程序最小化以触发另一个应用程序最小化过程,delphi,window,Delphi,Window,我正在寻找一个解决方案,我的应用程序将跟随另一个外部应用程序的WindowsState 基本想法是,我将对下一个更改采取行动: 规范化外部应用程序时:将我的表单移动到特定坐标 当外部应用程序最大化时:将我的表单移动到特定坐标 最小化外部应用程序时:将我的表单最小化到任务栏 如上所述,我希望我的应用程序看起来和行为都像是某个外部应用程序的实际部分 到目前为止,我的情况如下: 我的外窗把手没问题。使用下一个函数案例,我得到如下结果: case WindowPlacement.showCmd of

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

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

如上所述,我希望我的应用程序看起来和行为都像是某个外部应用程序的实际部分

到目前为止,我的情况如下:

我的外窗把手没问题。使用下一个函数案例,我得到如下结果:

  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;
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;
这个很好用。但是,目前,我正在使用计时器事件每100mS触发一次,它将获得此函数结果,然后采取如下操作:

  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;
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.

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

  • 使用该功能安装全局挂钩。(为了安装全局钩子,您应该从dll调用此方法和回调过程,请查看MSDN文档以了解详细信息)

  • 在CBTProc回调函数中,检查
    HCBT_MINMAX
    代码

  • LParam
    将包含一个显示窗口值(SW_HIDE、SW_MAXIMIZE、SW_MINIMIZE等)

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

  • 要将应用程序与dll通信,可以使用共享内存块(,)和自定义消息()


  • 或者,您可以改为使用接收特定线程的特定事件(
    事件对象对象对象对象对象显示
    /
    隐藏
    事件对象对象位置更改
    事件对象对象状态更改
    ,等等),该线程拥有您感兴趣的窗口。与全局CBT钩子相比,不需要DLL,过滤更少,开销更少。@RemyLebeau听起来应该是它自己的答案!小点:你在哪里调用SetWindowsHookEx并不重要。我第一次使用钩子来检查鼠标点击,所以我现在看起来很熟悉(是的…)。尽管如此,我还是没有弄清楚我应该在哪里设置我正在“收听”哪一个应用程序来进行MinMax活动。。。。?