WIn32 SwitchToThisWindow,ShowWindow和SetActiveWindow

时间:2010-02-23 18:30:00

标签: .net vb6 winapi pinvoke user32

我有一个VB 6 MDI应用程序。它响应已弃用的SwitchToThisWindow函数,但不响应ShowWindow和SetActiveWindow函数。我知道ShowWindow和SetActiveWindow被正确声明,因为我可以将它们与任何其他应用程序一起使用。

编辑:我的目标不是使用这些功能,将焦点从我的应用程序切换到VB 6应用程序很简单。所以,如果你有任何替代方法,我都会听到。

4 个答案:

答案 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远程处理)并将焦点片段编码到目标应用程序中,然后从您的应用程序发送焦点消息你的第二个应用