【问题标题】:WIn32 SwitchToThisWindow, ShowWindow, and SetActiveWindowWIN32 SwitchToThisWindow、ShowWindow 和 SetActiveWindow
【发布时间】:2011-01-20 05:07:24
【问题描述】:

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

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

【问题讨论】:

    标签: .net vb6 winapi pinvoke user32


    【解决方案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 编码到目标应用程序中,然后从您的应用程序中发送焦点向您的第二个应用发送消息

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-01-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多