WIN32 SwitchToThisWindow、ShowWindow 和 SetActiveWindow
Posted
技术标签:
【中文标题】WIN32 SwitchToThisWindow、ShowWindow 和 SetActiveWindow【英文标题】:WIn32 SwitchToThisWindow, ShowWindow, and SetActiveWindow 【发布时间】:2011-01-20 05:07:24 【问题描述】:我有一个 VB 6 MDI 应用程序。它响应已弃用的 SwitchToThisWindow 函数,但不响应 ShowWindow 和 SetActiveWindow 函数。我知道 ShowWindow 和 SetActiveWindow 声明正确,因为我可以将它们与任何其他应用程序一起使用。
编辑:我的目标不是使用这些功能,将焦点从我的应用程序切换到 VB 6 应用程序很简单。因此,如果您有任何替代方法,我会全力以赴。
【问题讨论】:
【参考方案1】:SetActiveWindow
仅适用于附加到当前线程的窗口,因此您不能使用它来激活另一个应用程序。
您可以使用SetForegroundWindow
将另一个应用程序中的窗口置于前台。这仅在您的应用程序当前处于前台时才有效,但从您的问题来看,情况似乎是这样。
【讨论】:
这让我回到了与 SwitchToThisWindow 相同的位置。但是当窗口最小化时就不起作用了。【参考方案2】:激活父窗口后,您必须发送WM_MDIACTIVATE message 以激活特定的 MDI 子窗口。掌握 MDI 子窗口句柄应该具有挑战性。
【讨论】:
谢谢,但我只要打开父窗口就足够了。 使用 SetForegroundWindow() 代替。【参考方案3】:您可以通过IsIconic(hWnd)
检测窗口是否被最小化,然后发送ShowWindow(hWnd, SW_RESTORE)
来恢复最小化的窗口。最后使用SetForegroundWindow(hWnd)
将窗口带到前面。
这里有一些 excellent VB6 由 Karl Peterson 为您完成。
【讨论】:
【参考方案4】:您可以在这里使用我的回答中的一些代码: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。
替代您可以使用某种进程间通信系统(关键字:.net 远程处理)并将焦点 sn-p 编码到目标应用程序中,然后从您的应用程序中发送焦点向您的第二个应用发送消息
【讨论】:
以上是关于WIN32 SwitchToThisWindow、ShowWindow 和 SetActiveWindow的主要内容,如果未能解决你的问题,请参考以下文章