andygo Posted March 2, 2011 Share Posted March 2, 2011 Hello, hope someone can help. This is the situation on windows7 64bit: I have a gui: $wsoIE = ObjCreate("Shell.Explorer.2") $wshGUI = GUICreate("", $Width, $Height) $wsGUIActiveX = GUICtrlCreateObj ($wsoIE, 0, 0, $Width, $Height + 50) now i navigate to a url, and move the complete gui outside of the desktop-coordinates. with active aero-style i can now perform "_WinAPI_GetDC" and save it as a picturefile. when aero is disabled and windows-basic style active, then i get only a black image. is there a way to fix this? thank you. @ UEZ: Vielleicht findet ja hier jemand eine lösung transl.: mabye someone here has a solution. Link to comment Share on other sites More sharing options...
UEZ Posted March 3, 2011 Share Posted March 3, 2011 Here some more background information: the idea was to make screenshots from web site using a GUI with embedded IE engine whereas the GUI shouldn't be visible. First step is to render the web site and get the height of the created window. Second step is to create a GUI with fixed width and rendered height from step 1 whereas the GUI is only visible by 1 pixel otherwise _WinAPI_GetWindowDC($hGUI) will create only a black screen. When Aero is enabled you can get the content of the GUI and take a screenshot. When Aero is disabled you see only a black screen. Here the code: expandcollapse popup#include <Clipboard.au3> #include <IE.au3> #include <WinAPI.au3> #include <WindowsConstants.au3> ;Coded by UEZ 2011 - beta version If @OSBuild < 6000 Then Exit MsgBox(16, "Error!", "Script is running properly only on Vista+ os!", 10) Global Const $hDwmApiDll = DllOpen("dwmapi.dll") Global $sChkAero = DllStructCreate("int;") DllCall($hDwmApiDll, "int", "DwmIsCompositionEnabled", "ptr", DllStructGetPtr($sChkAero)) Global $aero = DllStructGetData($sChkAero, 1) If Not $aero Then Exit MsgBox(16, "Error", "Aero must be enabled to grab web sites properly!", 20) $sChkAero = 0 Global $URL, $btn, $msg, $hWnd, $input, $i $hWnd = GUICreate("Save Web Page as an image", 320, 120) $input = GUICtrlCreateInput("http://www.autoitscript.com/forum/", 10, 5, 300, 20) $btn = GUICtrlCreateButton("Ok", 40, 35, 240, 70) ControlFocus($hWnd, "", $btn) GUISetState() While $msg <> -3 $msg = GUIGetMsg() Select Case $msg = $btn Start() Case $msg = -3 GUIDelete($hWnd) Exit EndSelect WEnd Func Start() $URL = GUICtrlRead($input) SplashTextOn("Screenshooting Web Site", "Please wait while taking screenshot", 300, 40, -1, -1, 1 + 2 + 4 + 32, "") AdlibRegister("Wait", 300) Web_Screenshot($URL) AdlibUnRegister("Wait") SplashOff() MsgBox(0, "Information", "Web Site Image copied to clipboard!", 10) EndFunc Func Web_Screenshot($url) Local $oIE, $GUIActiveX, $oDocument, $oBody, $BodyWidth, $BodyHeight Local $hGUI, $hWin, $aWin $oIE = ObjCreate("Shell.Explorer.2") #region render web site to get height $hGUI = GUICreate("", 1, 1, -1, -1, $WS_POPUP) $GUIActiveX = GUICtrlCreateObj ($oIE, 0, 0, 1024, 256) With $oIE .Silent = True .TheaterMode = False .FullScreen = True .Resizable = False .Navigate($URL) While .ReadyState <> 4 Sleep(50) WEnd EndWith $oDocument = $oIE.document $oBody = $odocument.body $oBody.scroll = "no" $oBody.style.borderStyle = "none" $BodyWidth = $oBody.scrollWidth $BodyHeight = $oBody.scrollHeight GUIDelete($hGUI) #endregion $GUIActiveX = 0 $hGUI = GUICreate("", $BodyWidth, $BodyHeight, -1, 0, BitOR($WS_CLIPCHILDREN, $WS_POPUP), Default, WinGetHandle(AutoItWinGetTitle())) $GUIActiveX = GUICtrlCreateObj ($oIE, 0, 0, $BodyWidth, $BodyHeight + 50) With $oIE .Silent = True .TheaterMode = False .FullScreen = True .Resizable = False .Navigate($URL) While .ReadyState <> 4 Sleep(50) WEnd EndWith $oDocument = $oIE.document $oBody =$odocument.body $oHtml = $odocument.documentElement $oBody.scroll = "no" $oBody.style.borderStyle = "none" $oHtml.style.overflow = 'hidden' $hWin = WinGetHandle("Program Manager") $aWin = WinGetPos($hWin) WinMove($hGUI, "", $aWin[0] - $BodyWidth + 1, $aWin[1] - $BodyHeight + 1) ;hide window GUISetState(@SW_SHOWNA) ;Show GUI Local $hDC = _WinAPI_GetWindowDC($hGUI) Local $hDC_Dummy = _WinAPI_GetWindowDC(0) Local $hMemDC = _WinAPI_CreateCompatibleDC($hDC_Dummy) Local $hBitmap = _WinAPI_CreateCompatibleBitmap($hDC_Dummy, $BodyWidth, $BodyHeight) _WinAPI_SelectObject($hMemDC, $hBitmap) _WinAPI_BitBlt($hMemDC, 0, 0, $BodyWidth, $BodyHeight, $hDC, 0, 0, $SRCCOPY) _WinAPI_DeleteDC($hMemDC) _WinAPI_ReleaseDC($hGUI, $hDC) _WinAPI_ReleaseDC(0, $hDC_Dummy) _WinAPI_ReleaseDC(0, $hDC) _ClipBoard_Open(0) _ClipBoard_Empty() _ClipBoard_SetDataEx($hBitmap, $CF_BITMAP) _ClipBoard_Close() _WinAPI_DeleteObject ($hBitmap) $GUIActiveX = 0 $oIE = 0 GUIDelete($hGUI) _ReduceMemory() EndFunc Func Wait() Switch Mod($i, 4) Case 0 ControlSetText("Screenshooting Web Site", "", "Static1", "Please wait while taking screenshot") Case 1 ControlSetText("Screenshooting Web Site", "", "Static1", "Please wait while taking screenshot .") Case 2 ControlSetText("Screenshooting Web Site", "", "Static1", "Please wait while taking screenshot ..") Case 3 ControlSetText("Screenshooting Web Site", "", "Static1", "Please wait while taking screenshot ...") EndSwitch $i += 1 EndFunc Func _ReduceMemory($ProcID = 0) If $ProcID = 0 or ProcessExists($ProcID) = 0 Then ; No process id specified or process doesn't exist - use current process instead. Local $ai_GetCurrentProcess = DllCall('kernel32.dll', 'ptr', 'GetCurrentProcess') Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'ptr', $ai_GetCurrentProcess[0]) Return $ai_Return[0] EndIf Local $ai_Handle = DllCall("kernel32.dll", 'ptr', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $ProcID) Local $ai_Return = DllCall("psapi.dll", 'int', 'EmptyWorkingSet', 'ptr', $ai_Handle[0]) DllCall('kernel32.dll', 'int', 'CloseHandle', 'ptr', $ai_Handle[0]) Return $ai_Return[0] EndFunc Br, UEZ Please don't send me any personal message and ask for support! I will not reply! Selection of finest graphical examples at Codepen.io The own fart smells best! ✌Her 'sikim hıyar' diyene bir avuç tuz alıp koşma!¯\_(ツ)_/¯ ٩(●̮̮̃•̃)۶ ٩(-̮̮̃-̃)۶ૐ Link to comment Share on other sites More sharing options...
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now