Sign in to follow this  
Followers 0
Chimp

GDIPlus & a magnifying glass attempt. How to free memory?

6 posts in this topic

#1 ·  Posted (edited)

This lens snippet (assembled using other snippets from the forum and from the help file)  makes memory usage grow linearly, and never released till closed.
could someone tell me what should I change to make it do a regular use of memory?
thanks

This listing is debugged (Thanks to Danyfirex)

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>

Global Const $iWidth = 400, $iHeight = 200 ; lens dimensions
Global $Magnify = 2 ; zoom factor
Global $CapureCursor = False ; If True the cursor will be captured with the image
;
Global $g_hGUI, $g_hGfxCtxt, $g_hBitmap, $g_hGraphics
Global $Mouse[2], $CaptureX = $iWidth / ($Magnify * 2), $CaptureY = $iHeight / ($Magnify * 2)

Example()

Func Example()
    AutoItSetOption("GUIOnEventMode", 1)
    _GDIPlus_Startup() ;initialize GDI+

    $g_hGUI = GUICreate("Magnifier", $iWidth, $iHeight, -1, -1, $DS_MODALFRAME, $WS_EX_TOPMOST)
    GUISetState(@SW_SHOW)

    ;create buffered graphics frame set for smoother gfx object movements
    $g_hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle
    $g_hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $g_hGraphics)
    $g_hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($g_hBitmap)

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    local $g_hBitmap2 = 0
    Do
        $g_hBitmap2 = SnapShot()
        _GDIPlus_GraphicsClear($g_hGfxCtxt, 0xFF000000) ;clear bitmap for repaint
        _GDIPlus_GraphicsDrawImage($g_hGfxCtxt, $g_hBitmap2, 0, 0) ;draw bitmap to backbuffer
        _GDIPlus_GraphicsDrawImageRect($g_hGraphics, $g_hBitmap, 0, 0, $iWidth, $iHeight) ;copy drawn bitmap to graphics handle (GUI)
        _GDIPlus_BitmapDispose($g_hBitmap2)

    Until Not Sleep(10) ;sleep 10 ms to avoid high cpu usage


EndFunc   ;==>Example

Func SnapShot()
    $Mouse = MouseGetPos()
    ; Capture region (centered on mouse position; dimensions based on the $CaptureX and $CaptureY variables)
    $hHBITMAP = _ScreenCapture_Capture("", $Mouse[0] - $CaptureX, $Mouse[1] - $CaptureY, $Mouse[0] + $CaptureX, $Mouse[1] + $CaptureY, $CapureCursor)

    ; http://www.autoitscript.com/forum/topic/130856-enlargezoom-image-after-screencapture/?p=910694

    ; Create a Bitmap object from the bitmap handle
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBITMAP)

    ; Dispose of the original capture since we now have a bitmap image we can use with GDIPlus.
    _WinAPI_DeleteObject($hHBITMAP)

    ; Get the graphics context of the bitmap image.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)

    ; Creates a new Bitmap object based on the Graphic object with a new width and height.
    $hHBITMAP = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)

    ; Dispose of the Graphic context now we have a newly sized bitmap image as a canvas.
    _GDIPlus_GraphicsDispose($hGraphic)

    ; Get the graphics context of the newly sized bitmap image
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hHBITMAP)

    ; Draw the original image onto the newly sized image.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, $iWidth, $iHeight) ; 200, 200)

    ; Dispose of the Graphic context now we have drawn the original image to it.
    _GDIPlus_GraphicsDispose($hGraphic)

    ; Dispose of the original image.
    _GDIPlus_ImageDispose($hImage)

    Return($hHBITMAP)
EndFunc   ;==>SnapShot

Func _Exit()
    ;cleanup GDI+ resources
    _GDIPlus_GraphicsDispose($g_hGfxCtxt)
    _GDIPlus_GraphicsDispose($g_hGraphics)
    _GDIPlus_BitmapDispose($g_hBitmap)
    _GDIPlus_Shutdown()
    GUIDelete($g_hGUI)
    Exit
EndFunc   ;==>_Exit

Buggy version is in spoiler

 

#include <WindowsConstants.au3>
#include <GUIConstantsEx.au3>
#include <ScreenCapture.au3>

Global Const $iWidth = 400, $iHeight = 200 ; lens dimensions
Global $Magnify = 2 ; zoom factor
Global $CapureCursor = False ; If True the cursor will be captured with the image
;
Global $g_hGUI, $g_hGfxCtxt, $g_hBitmap, $g_hGraphics
Global $Mouse[2], $CaptureX = $iWidth / ($Magnify * 2), $CaptureY = $iHeight / ($Magnify * 2)

Example()

Func Example()
    AutoItSetOption("GUIOnEventMode", 1)
    _GDIPlus_Startup() ;initialize GDI+

    $g_hGUI = GUICreate("Magnifier", $iWidth, $iHeight, -1, -1, $DS_MODALFRAME,  $WS_EX_TOPMOST)
    GUISetState(@SW_SHOW)

    ;create buffered graphics frame set for smoother gfx object movements
    $g_hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle
    $g_hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $g_hGraphics)
    $g_hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($g_hBitmap)

    GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit")

    Do
        _GDIPlus_GraphicsClear($g_hGfxCtxt, 0xFF000000) ;clear bitmap for repaint
        _GDIPlus_GraphicsDrawImage($g_hGfxCtxt, SnapShot(), 0, 0) ;draw bitmap to backbuffer
        _GDIPlus_GraphicsDrawImageRect($g_hGraphics, $g_hBitmap, 0, 0, $iWidth, $iHeight) ;copy drawn bitmap to graphics handle (GUI)
    Until Not Sleep(10) ;sleep 10 ms to avoid high cpu usage
EndFunc   ;==>Example

Func SnapShot()
    $Mouse = MouseGetPos()
    ; Capture region (centered on mouse position; dimensions based on the $CaptureX and $CaptureY variables)
    $hHBITMAP = _ScreenCapture_Capture("", $Mouse[0] - $CaptureX, $Mouse[1] - $CaptureY, $Mouse[0] + $CaptureX, $Mouse[1] + $CaptureY, $CapureCursor)

    ; http://www.autoitscript.com/forum/topic/130856-enlargezoom-image-after-screencapture/?p=910694

    ; Create a Bitmap object from the bitmap handle
    $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBITMAP)

    ; Dispose of the original capture since we now have a bitmap image we can use with GDIPlus.
    _WinAPI_DeleteObject($hHBITMAP)

    ; Get the graphics context of the bitmap image.
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage)

    ; Creates a new Bitmap object based on the Graphic object with a new width and height.
    $hHBITMAP = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic)

    ; Dispose of the Graphic context now we have a newly sized bitmap image as a canvas.
    _GDIPlus_GraphicsDispose($hGraphic)

    ; Get the graphics context of the newly sized bitmap image
    $hGraphic = _GDIPlus_ImageGetGraphicsContext($hHBITMAP)

    ; Draw the original image onto the newly sized image.
    _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, $iWidth, $iHeight) ; 200, 200)

    ; Dispose of the Graphic context now we have drawn the original image to it.
    _GDIPlus_GraphicsDispose($hGraphic)

    ; Dispose of the original image.
     _GDIPlus_ImageDispose($hImage)

    Return ($hHBITMAP)
EndFunc   ;==>Shot

Func _Exit()
    ;cleanup GDI+ resources
    _GDIPlus_GraphicsDispose($g_hGfxCtxt)
    _GDIPlus_GraphicsDispose($g_hGraphics)
    _GDIPlus_BitmapDispose($g_hBitmap)
    _GDIPlus_Shutdown()
    GUIDelete($g_hGUI)
    Exit
EndFunc   ;==>_Exit

 

 

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Edit. I did nto read well.

Sleep 30.

Edit 2

Look:

Local $g_hBitmap2=0
    Do
         $g_hBitmap2= SnapShot()
        _GDIPlus_GraphicsClear($g_hGfxCtxt, 0xFF000000) ;clear bitmap for repaint
        _GDIPlus_GraphicsDrawImage($g_hGfxCtxt, $g_hBitmap2, 0, 0) ;draw bitmap to backbuffer
        _GDIPlus_GraphicsDrawImageRect($g_hGraphics, $g_hBitmap, 0, 0, $iWidth, $iHeight) ;copy drawn bitmap to graphics handle (GUI)
   _GDIPlus_BitmapDispose($g_hBitmap2)

    Until Not Sleep(10) ;sleep 10 ms to avoid high cpu usage

saludos

Edited by Danyfirex

 

venezuela.png Would you like to say thank to Danyfirex using a warmy way?  offer me a cup of coffee... coffee.png

autoit_scripter_blue_userbar.png

       AutoIt...

 

 

Share this post


Link to post
Share on other sites

#3 ·  Posted (edited)

Thanks Danyflex,

if I increase the sleeping time to 30 or even more, the memory usage grows slowly (of course), but it grows anyway.

edit:

I think I should release some resource somewhere, but don't know what

Edited by Chimp

small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

#4 ·  Posted (edited)

I changed my answer. look again  >here

Saludos

Edited by Danyfirex

 

venezuela.png Would you like to say thank to Danyfirex using a warmy way?  offer me a cup of coffee... coffee.png

autoit_scripter_blue_userbar.png

       AutoIt...

 

 

Share this post


Link to post
Share on other sites

It seems OK now,
Thanks a lot Danyfirex

Saludos


small minds discuss people average minds discuss events great minds discuss ideas.... and use AutoIt....

Share this post


Link to post
Share on other sites

You're welcome.

To keep the forum cleaner. you can mark the topic as answered.

Saludos


 

venezuela.png Would you like to say thank to Danyfirex using a warmy way?  offer me a cup of coffee... coffee.png

autoit_scripter_blue_userbar.png

       AutoIt...

 

 

Share this post


Link to post
Share on other sites

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 account

Sign in

Already have an account? Sign in here.


Sign In Now
Sign in to follow this  
Followers 0

  • Similar Content

    • clarinets101
      By clarinets101
      I know the rules, don't ask for people to write your script for you.. i just need a nudge in the right direction or just tell me if it's not possible.  Here's the skinny, I have an application that shows maps of different areas.  I need to have four areas displayed on the screen, the problem I have is the window isn't laid out well to manipulate the window(s) to easily display the maps.  My thoughts are if i can have each map where it can be seen then map out the coordinates to a "magnification tool" of some sort and re-display it in it's on GUI quartered out on the screen with the "screwed" up maps in the background as there is only one monitor hooked to these computers.  I have been unable to find much on something like this, except for an old post referring to an iGZoom which I think was from back in 2005 and I haven't been able to find anything else on it.  If have performed multiple search queries so I figured I would go ahead and ask the experts.

      Thank you
    • Chimp
      By Chimp
      I'm doing some tests with the ">Magnifier Functions udf" by Ascend4nt.
      Here is a draft for a magnifying glass.
       
       

      I have two problems:
      Issue 1)  When I start the script, sometimes it starts properly, while other times the lens shows only a black box instead of the magnified area. I saw that in those cases, interrupting the script by pressing esc and running it again several times solves this strange problem (ie, after several reboots of the script, it works correctly... (?))
      Problem 2) when the lens works well and you try to drag the lens, the image that is located inside the lens remains frozen until the lens is dropped. I wish that the content of the lens continues to update even while dragging. I tried to use the _WinAPI_SetTimer to update the contents of the lens even while dragging, but without success  (set the variable $b_Test_WinAPI_SetTimer = True at line 11 to see the unsuccessfully attempt)
      Any suggestions for achieve this purpose will be appreciated
      thanks
       
    • Chimp
      By Chimp
      I'm again on a script that simulates a lens on the screen, >here my previous effort that works quite well but only in one mode, that is: it magnifies the area around the mouse while you move it and it shows the zoomed area into the "lens" window that stays somewhere on the screen.

      In the new mode that I would like to achieve, should be magnifyed the area that lies behind the "lens" window and when you move that window it should magnify what's behind it.
      Unfortunately here arises the problem, the magnifier magnifies itself recursively, (because it capture the surface of the "lens" itself and not what's behind) with the unwanted result of a zoom area that seems empty.

      To see the unwanted effect, just change the value of the variable $bFollowMouse from True to False anf then move the "magnifier" window around.
      (the problem is that the function _ScreenCapture_Capture() should be able to capture behind a window)
      (I wish the function _ScreenCapture_Capture() where able to capture behind a window)

      My question is:
      Is there a way to read the content that lies behind the "lens" window? (hopefully avoiding ways like turn off the "lens" windows, make the SnapShot of what's behind, and turn on the "lens" window again, that should result in an ugly flickering effect)

      any advise is welcome,
      thanks
      Here the listing:
      #include <WindowsConstants.au3> #include <GUIConstantsEx.au3> #include <ScreenCapture.au3> #include <WinAPI.au3> Global Const $iWidth = 400, $iHeight = 200 ; lens (window) dimensions Global $iMagnify = 5 ; zoom factor Global $bCaptureCursor = False ; If True the cursor will be captured with the image Global $bFollowMouse = True ; If true, magnifies at mouse position by following it ; If false, magnifies portion of screen behind lens (behind the window) ; Global $g_hGUI, $g_hGfxCtxt, $g_hBitmap, $g_hGraphics Global $aLensDim[2], $aViewFinder[2], $CaptureX = $iWidth / ($iMagnify * 2), $CaptureY = $iHeight / ($iMagnify * 2) Example() Func Example() AutoItSetOption("GUIOnEventMode", 1) _GDIPlus_Startup() ;initialize GDI+ $g_hGUI = GUICreate("Magnifier", $iWidth, $iHeight, -1, -1, -1, $WS_EX_TOPMOST + $WS_EX_TOOLWINDOW) $aLensDim = WinGetClientSize($g_hGUI) $idPic = GUICtrlCreatePic("", 0, 0, $aLensDim[0], $aLensDim[1], -1, $GUI_WS_EX_PARENTDRAG) ; jast as background to allow drag by client area GUISetState(@SW_SHOW) ;create buffered graphics frame set for smoother gfx object movements $g_hGraphics = _GDIPlus_GraphicsCreateFromHWND($g_hGUI) ;create a graphics object from a window handle $g_hBitmap = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $g_hGraphics) $g_hGfxCtxt = _GDIPlus_ImageGetGraphicsContext($g_hBitmap) GUISetOnEvent($GUI_EVENT_CLOSE, "_Exit") Local $g_hBitmap2 = 0 Do $g_hBitmap2 = SnapShot() _GDIPlus_GraphicsClear($g_hGfxCtxt, 0xFF000000) ;clear bitmap for repaint _GDIPlus_GraphicsDrawImage($g_hGfxCtxt, $g_hBitmap2, 0, 0) ;draw bitmap to backbuffer _GDIPlus_GraphicsDrawImageRect($g_hGraphics, $g_hBitmap, 0, 0, $iWidth, $iHeight) ;copy drawn bitmap to graphics handle (GUI) _GDIPlus_BitmapDispose($g_hBitmap2) Until Not Sleep(10) ;sleep 10 ms to avoid high cpu usage EndFunc ;==>Example Func SnapShot() If $bFollowMouse Then ; take snapshot around the mouse $aViewFinder = MouseGetPos() Else ; take the snapshot behind the "lens" <-------------- this will capture the surface of the lens not what's behind <----------------- $aViewFinder = _WinAPI_GetClientScreenPos($g_hGUI) $aViewFinder[0] = $aViewFinder[0] + ($aLensDim[0] / 2) $aViewFinder[1] = $aViewFinder[1] + ($aLensDim[1] / 2) EndIf ; Capture region (at mouse position or behind the lens) $hHBITMAP = _ScreenCapture_Capture("", $aViewFinder[0] - $CaptureX, $aViewFinder[1] - $CaptureY, $aViewFinder[0] + $CaptureX, $aViewFinder[1] + $CaptureY, $bCaptureCursor) ; http://www.autoitscript.com/forum/topic/130856-enlargezoom-image-after-screencapture/?p=910694 ; Create a Bitmap object from the bitmap handle $hImage = _GDIPlus_BitmapCreateFromHBITMAP($hHBITMAP) ; Dispose of the original capture since we now have a bitmap image we can use with GDIPlus. _WinAPI_DeleteObject($hHBITMAP) ; Get the graphics context of the bitmap image. $hGraphic = _GDIPlus_ImageGetGraphicsContext($hImage) ; Creates a new Bitmap object based on the Graphic object with a new width and height. $hHBITMAP = _GDIPlus_BitmapCreateFromGraphics($iWidth, $iHeight, $hGraphic) ; Dispose of the Graphic context now we have a newly sized bitmap image as a canvas. _GDIPlus_GraphicsDispose($hGraphic) ; Get the graphics context of the newly sized bitmap image $hGraphic = _GDIPlus_ImageGetGraphicsContext($hHBITMAP) ; Draw the original image onto the newly sized image. _GDIPlus_GraphicsDrawImageRect($hGraphic, $hImage, 0, 0, $iWidth, $iHeight) ; 200, 200) ; Dispose of the Graphic context now we have drawn the original image to it. _GDIPlus_GraphicsDispose($hGraphic) ; Dispose of the original image. _GDIPlus_ImageDispose($hImage) Return ($hHBITMAP) EndFunc ;==>SnapShot Func _Exit() ;cleanup GDI+ resources _GDIPlus_GraphicsDispose($g_hGfxCtxt) _GDIPlus_GraphicsDispose($g_hGraphics) _GDIPlus_BitmapDispose($g_hBitmap) _GDIPlus_Shutdown() GUIDelete($g_hGUI) Exit EndFunc ;==>_Exit ; #FUNCTION# ==================================================================================================================== ; http://www.autoitscript.com/forum/topic/107966-window-space-position-size/?p=761415 ; Name...........: _WinAPI_GetClientScreenPos ; Description ...: Returns the onscreen x y of a client area of a window. ; Syntax.........: _WinAPI_GetClientScreenPos($hWindow) ; Parameters ....: $hWindow - Identifies an open handle to a window ; Return values .: Success - Array ; [0] x ; [2] y ; Failure - False ; Author ........: Nemcija ; Remarks .......: For minimized windows values wouldn't be correct! ; Related .......: _WinAPI_GetClientRect ; =============================================================================================================================== Func _WinAPI_GetClientScreenPos($hWindow) Local $tLocalClientRect, $tPoint, $aiReturnValue[2] $tLocalClientRect = _WinAPI_GetClientRect($hWindow) If @error Then Return SetError(@error, @extended, False) $tPoint = DllStructCreate("int X;int Y") DllStructSetData($tPoint, "X", DllStructGetData($tLocalClientRect, "Left")) DllStructSetData($tPoint, "Y", DllStructGetData($tLocalClientRect, "Top")) _WinAPI_ClientToScreen($hWindow, $tPoint) If @error Then Return SetError(@error, @extended, False) $aiReturnValue[0] = DllStructGetData($tPoint, "X") $aiReturnValue[1] = DllStructGetData($tPoint, "Y") Return $aiReturnValue EndFunc ;==>_WinAPI_GetClientScreenPos
    • Ascend4nt
      By Ascend4nt
      Magnifier Functions UDF

       
      That magnify tool in Windows since Vista? Yeah, pretty nice feature eh?  Well, turns out there's an API that is going unused around here! We've got to change that!
      MSDN Links:
      Magnification API Magnifier Functions Magnifier API Overview (includes examples) This UDF exposes most of the useful Magnifier API functions available since Windows Vista. The built-in Magnifier offers very easy screen magnification in the form of Magnifier controls or Full-screen magnification (since Windows 7).  It also allows altering the colors of the magnifier or in face the whole screen.
      With the Magnify API, you can do all sorts of neat things:
      Create a hardware-accelerated Magnifier control in any GUI (of any size) Resize any part of the screen by any factor (as a floating point value) Alter the colors (invert, grayscale, etc) Ignore certain windows (they become like invisible windows to the magnifier) Full-screen Color Effects (Win 7+ but official as of Win 8) Full-screen Magnify (Win 7+ but official as of Win 8) Windows 7 has 2 Full-screen Magnification API functions that are considered undocumented, but are nearly identical to their Windows 8 documented API counterparts.  Therefore, the UDF script takes care of calling the correct API function based on the O/S. The UDF functions are _MagnifierFullScreenSetScale() and _MagnifierFullScreenSetColorEffect().
      The only difference in these functions is SetMagnificationDesktopMagnification uses a double for its 1st parameter whereas MagSetFullscreenTransform uses a float.  Here's the Win7 undocumented to Win8 documented API mapping:
      SetMagnificationDesktopColorEffect - MagSetFullscreenColorEffect
      SetMagnificationDesktopMagnification - MagSetFullscreenTransform
      There are two examples included in the ZIP archive.  The 1st, MagnifierExperiments, shows all the wacky things that can be done using the Magnifier.  The 2nd is an example of Inverting screen colors via a Tray interface (both are below).
      Updates::



      Magnifier Experiments: Various Full-screen and Window magnifier effects tests:
      ; =========================================================================================================== ; <MagnifierExperiments.au3> ; ; Experiments with the Built-In Windows Magnification API (since Windows Vista) ; Uses <WinMagnifier.au3> ; ; NOTE: TRY to run this at the same bit-mode your O/S is running in, as the GUI can be funky at times ; when run in an incompatible bit mode.  So for 64-bit O/S's, run this as x64 only! ; ; Check out the Examples from 'Magnification API Overview', where much of the experiments thus far come from ; @ MSDN: http://msdn.microsoft.com/en-us/library/windows/desktop/ms692402%28v=vs.85%29.aspx ; ; Author: Ascend4nt ; =========================================================================================================== ;~ #AutoIt3Wrapper_UseX64=Y    ; Use when necessary #include "WinMagnifier.au3" #include <WinAPIGdi.au3>    ; _WinAPI_DwmIsCompositionEnabled() #Region MAGNIFIER_EXPERIMENTS ; ============================================================================= ; Func _MagnificationExperiments($nWidth, $nHeight, $iX1, $iY1, ;                                $fMagFactor = Default, $bInvertColors = 1, ;                                $bShowCursor = False) ; ; ; Author: Ascend4nt ; ============================================================================= Func _MagnificationExperiments($nWidth, $nHeight, $iX1, $iY1, $fMagFactor = Default, $bInvertColors = False, $bShowCursor = False)     Local $aTmp, $aColorFX, $hMagnifyGUI, $hMagnifyCtrl ;~     If Not _MagnifierInit() Then Return SetError(@error, 0, 0)     $aTmp = _MagnifierGUICreate($nWidth, $nHeight, $iX1, $iY1, $bInvertColors, $bShowCursor)     If @error Then Return SetError(@error, 0, 0)     $hMagnifyGUI = $aTmp[0]     $hMagnifyCtrl = $aTmp[1]     ; Optionally make the window Topmost ;~     WinSetOnTop($hMagnifyGUI, "", 0)     ; -------------------------     ; -- MAGNIFICATION SCALE --     If $fMagFactor <> Default Then         _MagnifierSetScale($hMagnifyCtrl, $fMagFactor)     EndIf     ; -------------------------     ; ------------------     ; -- SET SOURCE (on screen) -- ;~     _MagnifierSetSource($hMagnifyCtrl, 0, 0, 200, 100)     ; ------------------     ; ------------------     ; Exclude Windows!     _MagnifierSetWindowFilter($hMagnifyCtrl, WinGetHandle("[CLASS:SciTEWindow]"))     ; ------------------     ConsoleWrite("InvertColors flag (MS_INVERTCOLORS) set? = " & _MagnifierIsInvertColorsStyle($hMagnifyCtrl) & @LF)     ; ------------------     ; SHOW IT!     GUISetState(@SW_SHOW, $hMagnifyGUI)     MsgBox(0, "Normal Magnify", "Normal 2x scale")     ; Inverted Colors     Dim $aColorFX[5][5] = [ _         [-1.0,   0,    0,   0,   0], _         [  0, -1.0,    0,   0,   0], _         [  0,    0, -1.0,   0,   0], _         [  0,    0,    0, 1.0,   0], _         [1.0,  1.0,  1.0,   0, 1.0] ]     _MagnifierSetColorEffect($hMagnifyCtrl, $aColorFX)     MsgBox(0, "Inverted Colors via ColorFX", "Inverted Colors via ColorEffects") ;~     _MagnifierSetInvertColorsStyle($hMagnifyCtrl, True) ;~     MsgBox(0, "Inverse Color Style", "Inverse Effect Color Style (control style)")     ; ------------------ ;~     $aColorFX = _MagnifierGetColorEffect($hMagnifyCtrl) ;~     _ArrayDisplay($aColorFX, "Color Effects Matrix")     ; ------------------     ; -- CLEAR COLOR EFFECTS --     _MagnifierClearColorEffects($hMagnifyCtrl)     ; ------------------     ; Still set after Setting Color Effects to Identity Matrix (restored original colors) ;~     ConsoleWrite("InvertColors flag (MS_INVERTCOLORS) set? = " & _MagnifierIsInvertColorsStyle($hMagnifyCtrl) & @LF)     ; -------------------------     ; -- SET SOURCE AGAIN --     _MagnifierSetSource($hMagnifyCtrl, $iX1 + 100, $iY1 + 100, $iX1 + $nWidth, $iY1 + $nHeight)     MsgBox(0, "Source Change", "Moved Source & Cleared Effects")     ; ------------------     ; -- COLOR EFFECTS --     If 1 Then         _MagnifierSetColorEffect($hMagnifyCtrl, $COLOR_EFFECTS_GRAYSCALE_MATRIX)         MsgBox(0, "Grayscale", "Grayscale Color Effects")     EndIf     ; ------------------     GUIDelete($hMagnifyGUI)     Return 1 EndFunc #Region MAIN_CODE _WinMain() ; ------------------=  MAIN CODE =----------------------- Func _WinMain()     ; Force restart with AutoIt x64 if running on a 64-bit O/S     If @OSArch = "X64" And Not @AutoItX64 And Not _IsScriptCompiledToExe() Then         Exit ShellExecute(StringReplace(@AutoItExe, ".exe", "_x64.exe", -1),'/AutoIt3ExecuteScript "' & @ScriptFullPath & '"', @WorkingDir)     EndIf     ; Setting DWM off has these effects:     ; - Full-screen Magnifier Color Effects AND Magnification do NOT work     ; - Magnifier Control will not 'ignore' windows with _MagnifierSetWindowFilter()     ; - Magnified images tend to look blurry - possibly software-mode magnification?     ; Force DWM off so Full-screen Effect tests don't run     ;_WinAPI_DwmEnableComposition(False)     If Not _MagnifierInit() Then Exit @error     ; Magnifier Full-screen Effects Require DWM Composition to be enabled     If _WinAPI_DwmIsCompositionEnabled() Then         If _MagnifierFullScreenSetColorEffect($COLOR_EFFECTS_GRAYSCALE_MATRIX) Then             MsgBox(0, "Full-screen Magnify FX", "Gray-scale Color Effects!") ;~             $aColorFX = _MagnifierFullScreenGetColorEffect() ;~              _ArrayDisplay($aColorFX, "Full-screen matrix after Grayscale Transform")             _MagnifierFullScreenClearColorEffects()             MsgBox(0, "Full-screen Magnify FX", "Colors back to normal! Yay?")         EndIf         ; Full-screen Magnifier issues:         ; - Windows Vista: Not supported  ($g_nWinMagnifyAPILevel = 1)         ; - Windows 7: Uses negative numbers, not entirely sure of how these values are mapped just yet         ; - Windows 8: Works pretty much as expected (and documented) - use positive #'s indicating top-left of scaled screen         If $g_nWinMagnifyAPILevel >= 7 Then             Local $bRet             ; Difference in calculations for Win7 and Win8 - need a consistent mapping method!             If $g_nWinMagnifyAPILevel = 7 Then                 _MagnifierFullScreenSetScale(2.0, -1 * @DesktopWidth / 2, -1 * @DesktopHeight / 2)             Else    ; $g_nWinMagnifyAPILevel >= 8                 _MagnifierFullScreenSetScale(2.0, @DesktopWidth / 4, @DesktopHeight / 4)             EndIf             MsgBox(0, "Full-screen Scale FX", "Scaled 2x")             _MagnifierFullScreenSetScale(1.0)             MsgBox(0, "Full-screen Scale FX", "Back to 1x scale")         EndIf         ; Brightness Lowering isolated (Contrast & Saturation look bad)         Dim $aColorFX[5][5] = [ _                 [ 1.0,    0,    0,   0,   0], _                 [   0,  1.0,    0,   0,   0], _                 [   0,    0,  1.0,   0,   0], _                 [   0,    0,    0, 1.0,   0], _                 [-0.5, -0.5, -0.5,   0, 1.0] ]         ; Brightness - Lowering - Color Components         Dim $aColorFX[5][5] = [ _                 [0.6,   0,   0,   0,   0], _                 [  0, 0.6,   0,   0,   0], _                 [  0,   0, 0.6,   0,   0], _                 [  0,   0,   0, 1.0,   0], _                 [  0,   0,   0,   0, 1.0] ]         _MagnifierFullScreenSetColorEffect($aColorFX)         MsgBox(0, "Brightness Lowered Fullscreen", "Fullscreen ColorEffects - Brightness Reduced")         ; Verify effects (false here):         ;ConsoleWrite("Inversion Matrix Comparison Result:" & _MagnifierColorEffectIsEqual(_MagnifierFullScreenGetColorEffect(), $COLOR_EFFECTS_INVERSION_MATRIX) & @LF)         _MagnifierFullScreenSetColorEffect($COLOR_EFFECTS_INVERSION_MATRIX)         MsgBox(0, "Inverted Fullscreen", "Fullscreen ColorEffects - Inversion." & @CRLF & _             "Inversion Matrix Comparison Result:" & _MagnifierColorEffectIsEqual(_MagnifierFullScreenGetColorEffect(), $COLOR_EFFECTS_INVERSION_MATRIX))         #cs         ; Inverted Colors - Lowered Brightness (adding to color components, reducing brightness components)         Dim $aColorFX[5][5] = [ _                 [-0.7,   0,    0,   0,   0], _                 [  0, -0.7,    0,   0,   0], _                 [  0,    0, -0.7,   0,   0], _                 [  0,    0,    0, 1.0,   0], _                 [0.7,  0.7,  0.7,   0, 1.0] ]         _MagnifierFullScreenSetColorEffect($aColorFX)         MsgBox(0, "Inverted LB Fullscreen", "Fullscreen ColorEffects - Inversion Lowered Brightness")         #ce         #cs         ; Inverted Colors - Increased Brightness         Dim $aColorFX[5][5] = [ _                 [-1.3,   0,    0,   0,   0], _                 [  0, -1.3,    0,   0,   0], _                 [  0,    0, -1.3,   0,   0], _                 [  0,    0,    0, 1.0,   0], _                 [1.3,  1.3,  1.3,   0, 1.0] ]         _MagnifierFullScreenSetColorEffect($aColorFX)         MsgBox(0, "Inverted IB Fullscreen", "Fullscreen ColorEffects - Inversion Increased Brightness")         #ce         ;~ _MagnifierFullScreenSetColorEffect($COLOR_EFFECTS_BW_MATRIX)         ;~ MsgBox(0, "Black & White Fullscreen", "Black & White Fullscreen ColorEffects")         _MagnifierFullScreenSetColorEffect($COLOR_EFFECTS_SEPIA_TONE_MATRIX)         MsgBox(0, "Sepia FullScreen", "Sepia Fullscreen ColorEffects")         _MagnifierFullScreenClearColorEffects()         MsgBox(0, "Color Restored", "Restored Normal Colors")     EndIf     ; IMPORTANT - Magnification GUI will fail to work properly sometimes if run in x86 mode on a 64bit O/S     ;  For this reason, ALWAYS run the Magnification code in the SAME bit-mode as the O/S (x86 in 32-bit O/S's, x64 in 64-bit O/S's)     ;~ ConsoleWrite("Title = " & WinGetTitle("[CLASS:SciTEWindow]") & @CRLF)     _MagnificationExperiments(@DesktopWidth, @DesktopHeight / 2, 0, @DesktopHeight / 2, 2.0) EndFunc #EndRegion MAIN_CODE #EndRegion MAGNIFIER_EXPERIMENTS #Region MISC_FUNCTIONS ; ============================================================================= ; Func _IsScriptCompiledToExe() ; ; Returns True if the Script has been compiled to an Executable. ; Returns False for .AU3 and .A3X-compiled scripts, as well as scripts run from a different executable ;  (CompiledScript.exe /AutoIt3ExecuteScript AnotherScript.exe) ; ; The common method for checking @Compiled is error-prone especially when a script is compiled to .A3X ; To deal with this annoying oversight by the devs (who could easily make @Compiled return -1 for A3X), ; this function checks the path to executable against the script path to make sure they are 1 and the same ; ; While this doesn't detect scripts run from another executable, the situation is basically the same ; - the script still does not have access to the original executable file's resources ; ; Author: Ascend4nt ; ============================================================================= Func _IsScriptCompiledToExe()     Return (@Compiled And @AutoItExe = @ScriptFullPath) EndFunc #EndRegion MISC_FUNCTIONS _
      Screen Inverter: Toggle full-screen Color Inversion on and off via the Tray:

      ; =========================================================================================================== ; <MagnifierScreenInverter.au3> ; ; Simple Full-Screen Color Inversion example. Toggle Color Inversion on/off via Tray. ; Important: Requires Win 7+ ; ; Note: May work cleaner if run in same bitness (32/64) as O/S.. it seems some transitions in DWM ; cause the Magnifier tool (magnifier.exe) to crash if used in conjunction with this script. ; ; Uses <WinMagnifier.au3> ; ; Author: Ascend4nt ; =========================================================================================================== ;~ #AutoIt3Wrapper_UseX64=Y    ; Optional, may work better if in same bitness as O/S #include "WinMagnifier.au3" #include <WinAPIGdi.au3>    ; _WinAPI_DwmIsCompositionEnabled() Global $g_bDwmActive = False Global $g_bInvertOn = False, $g_cTrayInvertToggle = 0 #Region MAIN_CODE Exit _WinMain() Func _WinMain()     ; Singleton code:     If WinExists("0bc53fe0-59c2-11e2-bcfd-0800200c_9a66") Then Return 1111     AutoItWinSetTitle("0bc53fe0-59c2-11e2-bcfd-0800200c_9a66")     ; Vista Minimum for Magnifier, but Full-Screen FX requires Win7+     If Not _MagnifierInit() Or $g_nWinMagnifyAPILevel <= 1 Then Return @error     Opt("TrayOnEventMode", 1)     Opt("TrayMenuMode", 1+2)     Opt("GUIOnEventMode", 1)     If Not _WinAPI_DwmIsCompositionEnabled() Then         If MsgBox(32 + 3, "Warning: DWM is OFF", _             "Desktop Composition is OFF, which makes Color Inversion Impossible" & @CRLF & _             "unless Re-Enabled!" & @CRLF & _             "Would you like to run this program anyway? ") <> 6 Then Return 2222     EndIf     TraySetClick(8)     $g_cTrayInvertToggle = TrayCreateItem("Invert Colors Toggle")     TrayItemSetOnEvent(-1, "_ToggleInvertColors")     TrayCreateItem("")     TrayCreateItem("Exit")     TrayItemSetOnEvent(-1, "_Exit")     ; Automatically Invert on Left-Click Icon     TraySetOnEvent(-7, "_ToggleInvertColors")    ; $TRAY_EVENT_PRIMARYDOWN -7     TraySetToolTip("Screen Color Inverter (Left-Click Toggles, Right-Click For Menu)") #cs     ; OPTIONAL:     ; Create a Dummy GUI so we can receive and react to WM_DWMCOMPOSITIONCHANGED Messages     Local $hDummyGUI = GUICreate("")     GUIRegisterMsg(0x031E, "_DwmCompositionChange") ;    WM_DWMCOMPOSITIONCHANGED 0x031E #ce     ; Not necessary, but can free some memory by flushing data to disk     DllCall("psapi.dll", "bool", "EmptyWorkingSet", "handle", -1)     While 1         Sleep(50)     WEnd EndFunc #EndRegion MAIN_CODE #Region TRAY_ONEVENT_FUNCS Func _ToggleInvertColors()     If $g_bInvertOn Then         TrayItemSetState($g_cTrayInvertToggle, 4)         _MagnifierFullScreenClearColorEffects() ;~         ConsoleWrite("Inversion: OFF"&@LF)         $g_bInvertOn = False     Else         ; Magnifier Full-screen Effects Require DWM Composition to be enabled         If _WinAPI_DwmIsCompositionEnabled() Then             TrayItemSetState($g_cTrayInvertToggle, 1)             _MagnifierFullScreenSetColorEffect($COLOR_EFFECTS_INVERSION_MATRIX) ;~             ConsoleWrite("Inversion: ON"&@LF)             $g_bInvertOn = True         EndIf     EndIf EndFunc #cs ; OPTIONAL: Func _DwmCompositionChange($hWnd, $nMsg, $wParam, $lParam)     ConsoleWrite("DwmCompositionChanged!"&@LF)     If _WinAPI_DwmIsCompositionEnabled() Then         $g_bDwmActive = True         If $g_bInvertOn Then             ; Doesn't appear to be necessary (state is recovered):             ;_MagnifierFullScreenSetColorEffect($COLOR_EFFECTS_INVERSION_MATRIX)         EndIf     Else         $g_bDwmActive = False     EndIf     Return 0 EndFunc #ce Func _Exit()     _MagnifierUnInit()     Exit EndFunc #EndRegion TRAY_ONEVENT_FUNCS WinMagnifier.zip  ~prev downloads: 48