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的主要内容,如果未能解决你的问题,请参考以下文章

一些窗口API函数,比如SetForegroundWindow,SwitchToThisWindow

什么叫win32?

win32 是啥病毒?

win32com安装

win32是啥

win32编辑框设置提示文字