我有一个 VB 6 MDI 应用程序。它响应已弃用的 SwitchToThisWindow 函数,但不响应 ShowWindow 和 SetActiveWindow 函数。我知道 ShowWindow 和 SetActiveWindow 声明正确,因为我可以将它们与任何其他应用程序一起使用。
编辑:我的目标不是使用这些功能,将焦点从我的应用程序切换到 VB 6 应用程序很简单。因此,如果您有任何替代方法,我会全力以赴。
SetActiveWindow
仅适用于附加到当前线程的窗口,因此您不能使用它来激活另一个应用程序。
您可以使用 将另一个应用程序中的窗口置于前台SetForegroundWindow
。这仅在您的应用程序当前处于前台时才有效,但从您的问题来看,情况似乎如此。
使用 可以检测窗口是否被最小化IsIconic(hWnd)
,然后发送ShowWindow(hWnd, SW_RESTORE)
恢复最小化的窗口。最后用于SetForegroundWindow(hWnd)
将窗口带到前面。
这是Karl Peterson编写的一些出色的 VB6 ,可以为您完成所有工作。
激活父窗口后,您必须发送WM_MDIACTIVATE 消息来激活特定的 MDI 子窗口。获得 MDI 子窗口句柄应该是具有挑战性的。
您可以在这里使用我的答案中的一些代码:正确的方式(在.NET中)将焦点切换到另一个应用程序,只需将设置活动窗口声明更改为设置前台窗口功能,您也可以尝试使用不同的枚举显示窗口函数。
Visual Basic 6 定义
Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Long) As Long
Visual Basic .NET 定义
Declare Function SetForegroundWindow Lib "user32.dll" (ByVal hwnd As Integer) As Integer
C# 定义
[DllImport("user32.dll")] public static extern int SetForegroundWindow(int hwnd)
如果您的目标不是使用 user32.dll 导入,那么您就搞砸了,因为您的应用程序无法访问目标应用程序以使其成为焦点,您将需要使用 windows。
或者,您可以使用某种进程间通信系统(关键词:.net remoting)并将焦点片段编码到目标应用程序中,然后从您的应用程序中将焦点消息发送到您的第二个应用程序