【发布时间】:2011-10-07 07:31:39
【问题描述】:
似乎是窗口的大小,例如打开的浏览器,根据屏幕大小或屏幕分辨率或类似的东西来设置上限。有没有办法绕过这个,让窗户任意高?
【问题讨论】:
标签: windows screen-scraping screen-resolution autoit
似乎是窗口的大小,例如打开的浏览器,根据屏幕大小或屏幕分辨率或类似的东西来设置上限。有没有办法绕过这个,让窗户任意高?
【问题讨论】:
标签: windows screen-scraping screen-resolution autoit
是的,有。您必须覆盖 WM_GETMINMAXINFO。在您的钩子程序中,您可以设置最大 x/y:
MINMAXINFO* pmmi = (MINMAXINFO*)lParam;
pmmi->ptMaxTrackSize.x = desiredY;
pmmi->ptMaxTrackSize.y = desiredX;
要在另一个进程上执行此操作,您可以使用 SetWindowsHookEx() 和 WH_GETMESSAGE。
【讨论】:
#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
【讨论】:
如果您谈论的是您自己的应用程序,您可能最多可以渲染用于 GDI 大小调整的 16 位坐标。对 WM_GETMINMAXINFO 等做出适当的回应。
如果您在谈论其他人的作品,则无法保证他们的渲染会比屏幕更大,因为将他们的绘画剪辑到可见的地方是明智的,并且他们可能会受到其他因素的进一步限制(例如大小小于 GDI 限制的 DirectX 表面)。
如果您正在抓取,您最好使用 MSAA 或 UIA 从外部操作窗口并获取其文本。
马丁
【讨论】:
将(部分)回答我自己的问题。事实证明,对于我自己的 WinForms 应用程序的具体情况,只需将 Form.MaximumSize 设置为足够大的值,然后增加 Form.ClientSize。我猜这个 MaximumSize 属性是其他答案中提到的 WM_GETMINMAXINFO 钩子的包装器。
【讨论】: