看起来窗口的大小,例如打开的浏览器窗口,受限于屏幕大小或屏幕分辨率等因素。有没有办法绕过这个限制,使窗口任意高?
看起来窗口的大小,例如打开的浏览器窗口,受限于屏幕大小或屏幕分辨率等因素。有没有办法绕过这个限制,使窗口任意高?
#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
是的,有一种方法。您需要覆盖 WM_GETMINMAXINFO。在您的钩子过程中,您可以设置最大值 x/y:
MINMAXINFO* pmmi = (MINMAXINFO*)lParam;
pmmi->ptMaxTrackSize.x = desiredY;
pmmi->ptMaxTrackSize.y = desiredX;
如果要在另一个进程中执行此操作,可以使用SetWindowsHookEx()和WH_GETMESSAGE。
如果您正在谈论自己的应用程序,您可能可以呈现用于GDI大小调整的16位坐标。请适当响应WM_GETMINMAXINFO和其他消息。
如果您在谈论别人的应用程序,则不能保证它们会呈现大于屏幕的内容,因为将其绘制到可见区域内是明智的,而且它们可能受到其他因素(例如小于GDI限制的DirectX表面的大小)的限制。
如果您正在进行爬取,则最好使用MSAA或UIA从外部操作窗口并获取其文本。
Martyn
我将(部分地)回答自己的问题。事实证明,对于我自己的WinForms应用程序的特定情况,只需要将Form.MaximumSize设置为足够大的值,然后增加Form.ClientSize即可。我猜测这个MaximumSize属性是其他答案中提到的WM_GETMINMAXINFO钩子的包装器。