我有一个经典的Win32-API(C++)应用程序,需要检测窗口是否停靠在屏幕的左/右一半。

问题的背景是,窗口仅以网格步长大小,例如32像素。在全屏模式下,程序会检测到该状态,允许大小与全屏匹配,并填充多余的空间。在Windows 8和更高版本中,我想做同样的事情,而不是当前保留边框(因为大小会捕捉到32像素的倍数)。

最佳答案

除了IInspectable已经提到的内容外,还有另一种方法可以确定此信息并采取相应的措施。

  • 等待 WM_WINDOWPOSCHANGED 消息,并从x中存储的 y 指针中读取其cxcyWINDOWPOSlParam值。
  • 通过调用 MonitorFromWindow 来获取放置窗口的当前监视器的句柄。
  • 创建一个 MONITORINFO 变量,并将其cbSize字段设置为sizeof(MONITORINFO)
  • 使用监视器句柄和MONITORINFO变量的地址来调用 GetMonitorInfo
  • rcWork变量中读取MONITORINFO值。
  • rcWork.top == WINDOWPOS.y && rcWork.bottom == (WINDOWPOS.y + WINDOWPOS.cx) && rcWork.left == WINDOWPOS.x-窗口“停靠”在左侧
  • rcWork.top == WINDOWPOS.y && rcWork.bottom == (WINDOWPOS.y + WINDOWPOS.cx) && rcwork.right == (WINDOWPOS.x + WINDOWPOS.cx)-窗口“停靠”在右侧
  • rcWork.top == WINDOWPOS.y && rcWork.left == WINDOWPOS.x && rcWork.right == (WINDOWPOS.x + WINDOWPOS.cx)-窗口“停靠”到顶部
  • rcWork.top == (WINDOWPOS.y + WINDOWPOS.cy) && rcWork.left == WINDOWPOS.x && rcWork.right == (WINDOWPOS.x + WINDOWPOS.cx)-窗口“停靠”到底部

  • 您说您已经具有确定窗口是全屏的逻辑(您是指全屏还是最大化?),但是如果使用left == x && top == y && right == x + cx && bottom == y + cy,则可以确定有效的最大化。

    Here is an MSDN example of something similar.

    请注意,可能更需要缓存MONITORINFO值,这样就不必在每次重新定位窗口时都调用它。

    如果只希望在用户不手动调整窗口大小时应用此方法,则以下是一个可能的方法示例:
    LRESULT CALLBACK windowProc(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
    {
      static bool userSizing = false;
    
      switch (msg)
      {
      // could also catch WM_ENTERSIZEMOVE here, but this will trigger on
      // moves as well as sizes
      case WM_SIZING:
        userSizing = true;
        break;
    
      case WM_EXITSIZEMOVE:
        userSizing = false;
        break;
    
      case WM_WINDOWPOSCHANGED:
        if (userSizing)
        {
          break;
        }
    
        // do logic to check to see if the window is sized in a "docked"
        // manner here
        break;
    
      // handle other window messages ...
    
      }
    }
    

    关于c++ - Win32检测窗口是否最大化/停靠到半屏(Win键+左/右),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47888651/

    10-10 02:22