【问题标题】:can I resize a program window in Windows to be arbitrarily large?我可以在 Windows 中将程序窗口的大小调整为任意大吗?
【发布时间】:2011-10-07 07:31:39
【问题描述】:

似乎是窗口的大小,例如打开的浏览器,根据屏幕大小或屏幕分辨率或类似的东西来设置上限。有没有办法绕过这个,让窗户任意高?

【问题讨论】:

    标签: windows screen-scraping screen-resolution autoit


    【解决方案1】:

    是的,有。您必须覆盖 WM_GETMINMAXINFO。在您的钩子程序中,您可以设置最大 x/y:

    MINMAXINFO* pmmi = (MINMAXINFO*)lParam;
    pmmi->ptMaxTrackSize.x = desiredY;
    pmmi->ptMaxTrackSize.y = desiredX;
    

    要在另一个进程上执行此操作,您可以使用 SetWindowsHookEx() 和 WH_GETMESSAGE。

    【讨论】:

      【解决方案2】:
      #include <GUIConstantsEx.au3>
      #include <WindowsConstants.au3>
      
      $hGUI = GUICreate("", 250, 100, -1, -1, BitOR($GUI_SS_DEFAULT_GUI, $WS_THICKFRAME))
      GUICtrlCreateLabel("", 0, 0, 250, 100, -1, $GUI_WS_EX_PARENTDRAG)
      
      GUISetState(@SW_SHOW)
      
      GUIRegisterMsg($WM_GETMINMAXINFO, "WM_GETMINMAXINFO")
      
      While 1
          $nMsg = GUIGetMsg()
          Switch $nMsg
              Case $GUI_EVENT_CLOSE
                  GUIRegisterMsg($WM_GETMINMAXINFO, "")
                  Exit
          EndSwitch
      WEnd
      
      Func WM_GETMINMAXINFO($hWnd, $Msg, $wParam, $lParam)
          #forceref $hWnd, $Msg, $wParam, $lParam
          Local $minmaxinfo = DllStructCreate("int;int;int;int;int;int;int;int;int;int", $lParam)
          DllStructSetData($minmaxinfo, 7, 250) ; min width
          DllStructSetData($minmaxinfo, 8, 100) ; min height
          DllStructSetData($minmaxinfo, 9, 3000) ; max width
          DllStructSetData($minmaxinfo, 10, 3000) ; max height
          Return "GUI_RUNDEFMSG"
      EndFunc   ;==>WM_GETMINMAXINFO
      

      【讨论】:

        【解决方案3】:

        如果您谈论的是您自己的应用程序,您可能最多可以渲染用于 GDI 大小调整的 16 位坐标。对 WM_GETMINMAXINFO 等做出适当的回应。

        如果您在谈论其他人的作品,则无法保证他们的渲染会比屏幕更大,因为将他们的绘画剪辑到可见的地方是明智的,并且他们可能会受到其他因素的进一步限制(例如大小小于 GDI 限制的 DirectX 表面)。

        如果您正在抓取,您最好使用 MSAA 或 UIA 从外部操作窗口并获取其文本。

        马丁

        【讨论】:

        • Martyn,您能否详细说明“MSAA 或 UIA”位?最初的问题现在似乎已经解决了,但是对于我和这里的其他读者来说,“知识是好的”:)
        • MSAA(旧版)和 UIA(新版)是 Windows 提供的两个可访问性 API,可用于访问和修改屏幕上的 UI 的可访问性工具(屏幕阅读器等)。这使得它们在其他方面非常有用,例如测试、屏幕抓取等。它们在 MSDN 上有详细记录,对于 hwnd UI,一切都以 WM_GETOBJECT 开头。
        【解决方案4】:

        将(部分)回答我自己的问题。事实证明,对于我自己的 WinForms 应用程序的具体情况,只需将 Form.MaximumSize 设置为足够大的值,然后增加 Form.ClientSize。我猜这个 MaximumSize 属性是其他答案中提到的 WM_GETMINMAXINFO 钩子的包装器。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-10-24
          • 2023-03-03
          • 1970-01-01
          • 2011-09-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-16
          相关资源
          最近更新 更多