【问题标题】:Maximize/Minimize window from another thread从另一个线程最大化/最小化窗口
【发布时间】:2023-12-11 19:14:01
【问题描述】:

我正在尝试找出最小化/最大化另一个线程拥有的窗口的正确方法。我的目标窗口可以是全屏或不全屏(无论其状态如何,我都应该能够最小化和最大化它)。我已经尝试了 ShowWindow SW_MINIMIZE、SW_MAXIMIZE、SW_FORCEMINIMIZE 等的各种组合......但我能够实现的唯一结果是在它被最小化并使用ShowWindow(hWnd, SW_RESTORE) 全屏时恢复它(最大化)。

这是我用来检索我的句柄的代码:

#include <Windows.h>
#include <iostream>

// I'm a console application
int main(int argc, char* argv[]) {
    HWND hWnd = FindWindow(TEXT("MyWindowClass"), NULL);
    if(IsWindow(hWnd)) {
        std::cout << "Window found!" << std::endl;
        SetForegroundWindow(hWnd); // I'll give focus to my window. This is always working.
        if(IsIconic(hWnd))
            ShowWindow(hWnd, SW_RESTORE); // This is working only if the window is minimized while in fullscreen mode
        Sleep(3000);
        ShowWindow(hWnd, SW_MINIMIZE); // Not working. SW_FORCEMINIMIZE, SW_HIDE etc are not working either.
    }
    return 0;
}

【问题讨论】:

    标签: c++ winapi fullscreen minimize maximize


    【解决方案1】:

    经过一整天的努力,我找到了一个解决方案,无论其状态如何,都可以最小化和最大化窗口:Post/SendMessage

    最大化它:

    PostMessage(hWnd, WM_SYSCOMMAND, SC_RESTORE, 0);
    

    最小化它:

    PostMessage(hWnd, WM_SYSCOMMAND, SC_MINIMIZE, 0);
    

    【讨论】:

      【解决方案2】:

      先试试ShowWindow,再拨打SetForegroundWindow

      void show_and_setforeground(HWND hwnd)
      {
          WINDOWPLACEMENT place;
          memset(&place, 0, sizeof(WINDOWPLACEMENT));
          place.length = sizeof(WINDOWPLACEMENT);
          GetWindowPlacement(hwnd, &place);
      
          switch (place.showCmd)
          {
          case SW_SHOWMAXIMIZED:
              ShowWindow(hwnd, SW_SHOWMAXIMIZED);
              break;
          case SW_SHOWMINIMIZED:
              ShowWindow(hwnd, SW_RESTORE);
              break;
          default:
              ShowWindow(hwnd, SW_NORMAL);
              break;
          }
      
          SetForegroundWindow(hwnd);
      }
      

      除了IsWindow(hWnd),您可能还想使用IsWindowVisible(hWnd),因为有些程序使用了不应该使用的不可见窗口。

      hwnd = FindWindow(TEXT("MyWindowClass"), NULL);
      if (IsWindow(hwnd))
      {
          if(IsWindowVisible(hwnd))//optional
          {
              show_and_setforeground(hwnd);
              ...
          }
      }
      

      【讨论】:

      • 谢谢,但它仅在窗口全屏时有效。当它窗口化时,正在调用 ShowWindow(hWnd, SW_RESTORE) 但没有任何反应。