2011-07-17 87 views

回答

1

如果您正在討論您自己的應用程序,則可能最多可呈現用於GDI大小調整的16位座標。對WM_GETMINMAXINFO等進行適當的響應。

如果你在談論別人的作品,他們沒有承諾他們會呈現比屏幕大的作品,因爲明智地將他們的作品剪輯爲可見的作品,而且他們可能會受到其他因素(如DirectX表面的大小小於GDI限制)。

可能如果你在刮你會更好地使用MSAA或UIA從外部操縱窗口並獲取其文本。

馬丁

+0

馬丁,請您詳細說明「MSAA或UIA」位?原來的問題似乎現在已經解決了,但「知識很好」,對我和其他讀者來說都是這樣:) – EndangeringSpecies

+0

MSAA(舊版)和UIA(新版)是Windows爲輔助工具(屏幕閱讀器等)提供的兩種可訪問性API )在屏幕上查看和修改UI。這使得它們對於其他事情非常有用,例如測試,屏幕抓取等。它們在MSDN上有詳細記錄,對於hwnd UI,所有內容都以WM_GETOBJECT開頭。 –

2

是的。您必須重寫WM_GETMINMAXINFO。在你的鉤子過程中,您可以設置最大X/Y:

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

要做到這一點對另一個進程可以用WH_GETMESSAGE使用和SetWindowsHookEx()。

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 
1

會(部分)回答我的問題。事實證明,對於我自己的WinForms應用程序的具體情況,它只是將Form.MaximumSize設置爲足夠大的值,然後增加Form.ClientSize。我猜這個MaximumSize屬性是其他答案中提到的WM_GETMINMAXINFO掛鉤的一個包裝。