在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 multiprocessing:在退出父进程后运行进程