1

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

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

4

4 回答 4

1

SetActiveWindow仅适用于附加到当前线程的窗口,因此您不能使用它来激活另一个应用程序。

您可以使用 将另一个应用程序中的窗口置于前台SetForegroundWindow。这仅在您的应用程序当前处于前台时才有效,但从您的问题来看,情况似乎如此。

于 2010-02-23T18:48:02.037 回答
1

使用 可以检测窗口是否被最小化IsIconic(hWnd),然后发送ShowWindow(hWnd, SW_RESTORE)恢复最小化的窗口。最后用于SetForegroundWindow(hWnd)将窗口带到前面。

这是Karl Peterson编写的一些出色的 VB6 ,可以为您完成所有工作。

于 2010-02-24T09:51:57.263 回答
1

激活父窗口后,您必须发送WM_MDIACTIVATE 消息来激活特定的 MDI 子窗口。获得 MDI 子窗口句柄应该是具有挑战性的。

于 2010-02-23T18:51:30.713 回答
0

您可以在这里使用我的答案中的一些代码:正确的方式(在.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)并将焦点片段编码到目标应用程序中,然后从您的应用程序中将焦点消息发送到您的第二个应用程序

于 2010-02-25T21:20:51.323 回答