在VB6中等待进程退出后恢复窗口

Posted

技术标签:

【中文标题】在VB6中等待进程退出后恢复窗口【英文标题】:Restoring a window after waiting for a process to exit in VB6 【发布时间】:2012-09-25 05:43:23 【问题描述】:

我在 win7 64 位操作系统中使用 VB6。这个应用是从xp迁移过来的。。

Me.WindowState = vbMinimized
WaitForProcess Shell(launchapp, vbNormalFocus)
Me.WindowState = vbNormal

在启动启动应用程序之前,我的代码会最小化主应用程序并将启动一个 exe。用户关闭 exe 后,我的主应用程序必须从最小化状态恢复正常。这在 xp 中运行良好,但在 win 7 中,我最小化的主应用程序只是闪烁并再次回到最小化状态。

有什么想法吗?

谢谢。

【问题讨论】:

类似于***.com/questions/10832022/…,但不完全相同 【参考方案1】:

Windows 7 将不允许应用使用 SetForegroundWindow 获取焦点,如 documentation 中所述。见备注。

一种解决方法是暂时AttachThreadInput 到具有焦点的线程,给自己焦点,然后再次分离。 Karl E Peterson 提供了一个drop-in module 来执行此操作here 并附有magazine article。

免责声明:Windows 专家 Raymond Chen 指出,这种解决方法can cause your program to stop responding 在某些情况下。但是,我自己从未遇到过这些错误。 YMMV。

【讨论】:

【参考方案2】:

我们正在使用 Win32 API 函数 SetForegroundWindow 来解决类似的问题(一些窗口,尤其是进程外窗口,将保留在 W7 上我们的主应用程序窗口之后)。

Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long

这是API声明,用google搜索一下。这里有一些信息:VBA interaction with Internet Explorer。如果您需要在不同的进程中控制窗口,您还需要另一个 API - AllowSetForegroundWindow。

【讨论】:

嗨,我确实尝试过使用 SetForegroundWindow API。但应用程序仍然只是闪烁并返回到最小化状态。我什至尝试过 SetFocus API,但没有用。 嗯,这是不同的问题。如果您在设置窗口状态之前/之后编写 DoEvents(以及可选的等待,1 秒左右),那会改变什么吗?它在 W7/64 中的调试器下是否有这种行为? 在 Windows 7 及更高版本(和 Vista AFAICR)中,允许应用程序使用 SetForegroundWindow 获取焦点的时间存在限制。如documentation 中所述。如果您已经对另一个应用程序进行了炮击,并为其赋予了焦点,那么您可能已经放弃了将焦点收回的能力。 Windows 不允许任何旧程序出现在前面并抓住焦点。 您好 Arvo,DoEvents 为我完成了工作。但是调用 DoEvents 并将控制权交给操作系统,会不会导致任何问题,在 vb6 中调试时有没有办法跳过 DoEvents? 不应该有任何区别,至少对于你的情况。

以上是关于在VB6中等待进程退出后恢复窗口的主要内容,如果未能解决你的问题,请参考以下文章

启动进程并等待退出代码而不冻结

Python多处理:在父进程退出后运行进程

Python multiprocessing:在退出父进程后运行进程

PyQt5 窗口在运行几秒钟后自动关闭 - “进程以退出代码 -1073741819 (0xC0000005) 完成”

linux线程的创建、退出、等待、取消、分离

nohup命令执行推出后进程退出