使用 Windows API 在外部最大化 Delphi (VCL) 应用程序

问题描述 投票:0回答:1

我尝试使用以下代码在我的 C# 应用程序中启动另一个用 Delphi 编写的应用程序:

Process process = new Process();
process.StartInfo.FileName="app.exe";
process.Start();

用户有时会最小化另一个应用程序。因此,有时我想将该窗口从最小化状态变为最大化状态,并显示在我的 C# 应用程序之上。当我尝试使用 Windows API 调用最大化它时:

 ShowWindow(process.MainWindowHandle, SW_MAXIMIZED); -- SW_MAXIMIZED=3

它向我显示黑屏而不是应用程序:

我猜这是由于 VCL 应用程序的工作方式所致。 我尝试了不同的方法(SW_RESTORE、SW_SHOW),然后尝试 SetForeGroundWindow (也没有帮助 - 它仅在窗口未最小化时有效)。

更重要的是,在使用

ShowWindow
最大化它之后,我仍然可以从任务栏最大化该外部应用程序窗口,并且它可以工作。但是,当我最小化它时,黑色窗口也会最小化。

如果我关闭那个黑色窗口,外部 Delphi 应用程序也会被关闭。

今天浪费了一些时间,我发现使用

SendKeys
类发送 alt+tab 是有效的。 然而,这是一个非常幼稚的想法,我不接受它作为解决方案,因为用户之前可以打开任何其他窗口(不仅仅是外部应用程序),所以另一个窗口将位于顶部。

有什么想法如何处理这个问题,或者实际发生了什么?

我尝试深入研究 VCL 文档,但找不到有关正在发生的事情的正确解释。

c# delphi pinvoke showwindow
1个回答
0
投票

根据 Process.MainWindowHandle Property 文档,您应该提前调用

Process.Refresh
,以保证您将检索当前值。

主窗口是当前有进程打开的窗口 焦点(顶级表单)。您必须使用刷新方法 刷新 Process 对象以获得最新的主窗口 如果发生变化则进行处理。一般来说,因为窗口句柄是 缓存,请事先使用刷新以确保您将检索到 当前句柄。

© www.soinside.com 2019 - 2024. All rights reserved.