我能否在Windows中任意调整程序窗口的大小?

3

看起来窗口的大小,例如打开的浏览器窗口,受限于屏幕大小或屏幕分辨率等因素。有没有办法绕过这个限制,使窗口任意高?

4个回答

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

2

是的,有一种方法。您需要覆盖 WM_GETMINMAXINFO。在您的钩子过程中,您可以设置最大值 x/y:

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

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


1

如果您正在谈论自己的应用程序,您可能可以呈现用于GDI大小调整的16位坐标。请适当响应WM_GETMINMAXINFO和其他消息。

如果您在谈论别人的应用程序,则不能保证它们会呈现大于屏幕的内容,因为将其绘制到可见区域内是明智的,而且它们可能受到其他因素(例如小于GDI限制的DirectX表面的大小)的限制。

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

Martyn


Martyn,您能否详细说明一下“MSAA或UIA”这一点吗?原始问题似乎已经解决了,但是“知识是好的”,对于我和其他读者来说都是如此 :) - EndangeringSpecies
MSAA(较旧)和UIA(较新)是Windows提供的两个辅助功能API,用于辅助工具(屏幕阅读器等)获取并修改屏幕上的用户界面。这使它们非常适用于其他事情,如测试、屏幕抓取等。它们在MSDN上有很好的文档支持,对于hwnd UIs,一切都始于WM_GETOBJECT。 - Martyn Lovell

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接