我有一个VB 6 MDI应用程序。它响应已弃用的SwitchToThisWindow函数,但不响应ShowWindow和SetActiveWindow函数。我知道ShowWindow和SetActiveWindow被正确声明,因为我可以将它们与任何其他应用程序一起使用。
编辑:我的目标不是使用这些功能,将焦点从我的应用程序切换到VB 6应用程序很简单。所以,如果你有任何替代方法,我都会听到。
答案 0 :(得分:1)
SetActiveWindow
仅适用于附加到当前线程的窗口,因此您无法使用它来激活其他应用程序。
您可以使用SetForegroundWindow
将其他应用程序的窗口带到前台。这只有在您的应用程序当前处于前台时才有效,但从您的问题来看似乎就是这种情况。
答案 1 :(得分:1)
激活父级后,您必须发送WM_MDIACTIVATE message以激活特定的MDI子窗口。亲自操作MDI子窗口句柄应该具有挑战性。
答案 2 :(得分:1)
您可以使用IsIconic(hWnd)
检测窗口是否已最小化,然后发送ShowWindow(hWnd, SW_RESTORE)
以恢复最小化窗口。最后使用SetForegroundWindow(hWnd)
将窗口置于前面。
Karl Peterson的一些excellent VB6为你做了一切。
答案 3 :(得分:0)
您可以使用我的答案中的一些代码:Correct way (in .NET) to switch the focus to another application,只需将设置的活动窗口声明更改为设置前景窗口功能,您也可以尝试使用ShowWindow函数的不同枚举。
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。
ALTERNATIVELY 您可以使用某种进程间通信系统(关键字:.net远程处理)并将焦点片段编码到目标应用程序中,然后从您的应用程序发送焦点消息你的第二个应用