我正在寻找一个解决方案,我的应用程序将使用其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。
答案 0 :(得分:3)
这种任务可以使用CBT Hook完成。要实现这种类型的钩子,请遵循以下步骤。
使用SetWindowsHookEx
函数安装全局CBT挂钩。 (为了安装全局挂钩,您应该从dll调用此方法和回调过程,请查看MSDN文档以获取详细信息)
在CBTProc回调函数中检查HCBT_MINMAX
代码。
CBTProc callback function
的LParam
将包含展示窗口值(SW_HIDE,SW_MAXIMIZE,SW_MINIMIZE等)
从您的应用程序使用LoadLibrary
方法加载带有全局钩子实现的dll(您可以从dll导出方法以启用或禁用钩子)。
要与dll通信您的应用,您可以使用共享内存块(CreateFileMapping,MapViewOfFile)和自定义消息(RegisterWindowMessage)。
< / LI> 醇>