Sign in to follow this  
Followers 0
Ascend4nt

Magnifier Functions - Windows Vista+ Magnifier Manipulation

21 posts in this topic

#1 ·  Posted (edited)

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:

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::

2014-08-25:

- Changed: WinMagnifier UDF is now separate from the examples

- Changed: MagnifierExperiments is a separate script

- Changed: Full-screen Scale example now adjusts correctly for Win8+

- Added: MagnifierScreenInverter example - invert screen colors via Tray

- Added: _MagnifierColorEffectIsEqual() - compare two Color Matrices for Equality

2014-05-12:

 - Added: Color Effects Matrix constants for typical effects like Invert Colors, Grayscale, Sepia tone - pass these as parameters to the SetColorEffect functions

 - Removed: Grayscale functions - use the Color Effect Matrix as a paramer to SetColorEffect functions instead

- Added: More annoying Msgboxes! (with more examples between!)

2014-05-07:

#2:

- Added General SetColorEffect functions which take matrices as 2D arrays now

  This also simplified other functions, and the matrixes look nicer

- Added GetColorEffect functions which return 2D arrays

- Added _MagnifierIsInvertColorsStyle() to detect if a Magnify Control has the MS_INVERTCOLORS flag set.  Note this will be set even after a SetColorEffect operation, so be aware!

- Added _MagnifierSetInvertColorsStyle() which allows enabling/disabling Invert-Colors operation of the Magnify Control (by setting/clearing MS_INVERTCOLORS flag and refreshing the Control contents)

---

#1:

- _MagnifierFullScreenSetScale() now works on Win7. Don't fully understand the offsets tho?

- Added 1 more function

- 64-bit mode restart if 64-bit O/S

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

Edited by Ascend4nt
3 people like this

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

Thank you!
I will use it to improve this script I did a long time ago:

'?do=embed' frameborder='0' data-embedContent>>

That script contols Magnifier in very primitive way (at that time when i made that script i was less talented so I did it in bad way..)

Edited by gil900

Share this post


Link to post
Share on other sites

Very interesting spotting. Thanks for sharing.

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!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

Right, I cracked that last little undocumented function.  All is well now!

Update:

- _MagnifierFullScreenSetScale() now works on Win7. Don't fully understand the offsets tho?

- Added 1 more function

- 64-bit mode restart if 64-bit O/S

By the way, I'm not sure, but the values for XOffset and YOffset for _MagnifierFullScreenSetScale() may differ betwen Windows 7 and Windows 8?  Right now it seems a bit odd that I have to feed a negative # in but perhaps there's logic in there somewhere?

Oh, UEZ good to see you - would you happen to have any clever ideas on matrix transformations for colors? You are a whiz at matrix stuff after all..  There's a link off here that describes how transforms work on colors with these matrices..

Share this post


Link to post
Share on other sites

can you include a function that show if the feature "invert colors" is turned on or off?

 
In the past I tried to think of a way to know this ..
It would be very helpful for me if you include a function that gives this information

Share this post


Link to post
Share on other sites

Guess this was today's obession.  New update:

Update #2!

- Added General SetColorEffect functions which take matrices as 2D arrays now

  This also simplified other functions, and the matrixes look nicer

- Added GetColorEffect functions which return 2D arrays

- Added _MagnifierIsInvertColorsStyle() to detect if a Magnify Control has the MS_INVERTCOLORS flag set.  Note this will be set even after a SetColorEffect operation, so be aware!

- Added _MagnifierSetInvertColorsStyle() which allows enabling/disabling Invert-Colors operation of the Magnify Control (by setting/clearing MS_INVERTCOLORS flag and refreshing the Control contents)

gil900, I added the function, but read the comments!  the 'invert colors' flag can be on even if the colors have been 'corrected', although its probably best to use the other function MagnifierSetInvertColorsStyle() to clear it before using any SetColorEffect functions.

Share this post


Link to post
Share on other sites

#7 ·  Posted (edited)

Here some color matrices which you can use -> http://docs.rainmeter.net/tips/colormatrix-guide

Scale doesn't work for (_MagnifierFullScreenSetScale(2.0, -1*@DesktopWidth / 2, -1*@DesktopHeight / 2)) - get an black screen only.

Br,

UEZ

Edited by 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!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

Updated

2014-05-12:

 - Added: Color Effects Matrix constants for typical effects like Invert Colors, Grayscale, Sepia tone - pass these as parameters to the SetColorEffect functions

 - Removed: Grayscale functions - use the Color Effect Matrix as a paramer to SetColorEffect functions instead

- Added: More annoying Msgboxes! (with more examples between!)

UEZ - Do you have Windows 8?  It might just be that the Windows 7 function requires negative numbers.  From what I gather, something like this might work for Windows 8:

_MagnifierFullScreenSetScale(2.0, @DesktopWidth / 4, @DesktopHeight / 4)

Might have to experiment with various settings though!

Share this post


Link to post
Share on other sites

Yes, I have Win 8.1 Update 1.

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!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

I have the same system as UEZ and I too get the black screen problem.


_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

UEZ and guinness, thanks for not testing the single line of code I posted above for testing on Win 8. lol..

Share this post


Link to post
Share on other sites

_MagnifierFullScreenSetScale(2.0, @DesktopWidth / 4, @DesktopHeight / 4) works on Win8.  :D 

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!
¯\_(ツ)_/¯

Share this post


Link to post
Share on other sites

UEZ and guinness, thanks for not testing the single line of code I posted above for testing on Win 8. lol..

You asked UEZ, not me! But it solved the issue, happy now? -_0

_AdapterConnections()_AlwaysRun()_AppMon()_AppMonEx()_BinaryBin()_CheckMsgBox()_CmdLineRaw()_ContextMenu()_ConvertLHWebColor()/_ConvertSHWebColor()_DesktopDimensions()_DisplayPassword()_DotNet_Load()/_DotNet_Unload()_Fibonacci()_FileCompare()_FileCompareContents()_FileNameByHandle()_FilePrefix/SRE()_FindInFile()_GetBackgroundColor()/_SetBackgroundColor()_GetConrolID()_GetCtrlClass()_GetDirectoryFormat()_GetDriveMediaType()_GetFilename()/_GetFilenameExt()_GetHardwareID()_GetIP()_GetIP_Country()_GetOSLanguage()_GetSavedSource()_GetStringSize()_GetSystemPaths()_GetURLImage()_GIFImage()_GoogleWeather()_GUICtrlCreateGroup()_GUICtrlListBox_CreateArray()_GUICtrlListView_CreateArray()_GUICtrlListView_SaveCSV()_GUICtrlListView_SaveHTML()_GUICtrlListView_SaveTxt()_GUICtrlListView_SaveXML()_GUICtrlMenu_Recent()_GUICtrlMenu_SetItemImage()_GUICtrlTreeView_CreateArray()_GUIDisable()_GUIImageList_SetIconFromHandle()_GUIRegisterMsg()_GUISetIcon()_Icon_Clear()/_Icon_Set()_IdleTime()_InetGet()_InetGetGUI()_InetGetProgress()_IPDetails()_IsFileOlder()_IsGUID()_IsHex()_IsPalindrome()_IsRegKey()_IsStringRegExp()_IsSystemDrive()_IsUPX()_IsValidType()_IsWebColor()_Language()_Log()_MicrosoftInternetConnectivity()_MSDNDataType()_PathFull/GetRelative/Split()_PathSplitEx()_PrintFromArray()_ProgressSetMarquee()_ReDim()_RockPaperScissors()/_RockPaperScissorsLizardSpock()_ScrollingCredits_SelfDelete()_SelfRename()_SelfUpdate()_SendTo()_ShellAll()_ShellFile()_ShellFolder()_SingletonHWID()_SingletonPID()_Startup()_StringCompact()_StringIsValid()_StringRegExpMetaCharacters()_StringReplaceWholeWord()_StringStripChars()_Temperature()_TrialPeriod()_UKToUSDate()/_USToUKDate()_WinAPI_Create_CTL_CODE()_WinAPI_CreateGUID()_WMIDateStringToDate()/_DateToWMIDateString()Au3 script parsingAutoIt SearchAutoIt3 PortableAutoIt3WrapperToPragmaAutoItWinGetTitle()/AutoItWinSetTitle()CodingDirToHTML5FileInstallrFileReadLastChars()GeoIP databaseGUI - Only Close ButtonGUI ExamplesGUICtrlDeleteImage()GUICtrlGetBkColor()GUICtrlGetStyle()GUIEventsGUIGetBkColor()Int_Parse() & Int_TryParse()IsISBN()LockFile()Mapping CtrlIDsOOP in AutoItParseHeadersToSciTE()PasswordValidPasteBinPosts Per DayPreExpandProtect GlobalsQueue()Resource UpdateResourcesExSciTE JumpSettings INISHELLHOOKShunting-YardSignature CreatorStack()Stopwatch()StringAddLF()/StringStripLF()StringEOLToCRLF()VSCROLLWM_COPYDATAMore Examples...

Updated: 04/09/2015

Share this post


Link to post
Share on other sites

I made some small changes, and added an example script which lets you invert the colors on the screen (Win7+) via Tray controls. The last bit was inspired by a post long ago by gil900 about Inversion being better than the Windows Dimmer/Shade/Spotlight eyestrain solutions that I've put up.

2014-08-25:
- Changed: WinMagnifier UDF is now separate from the examples
- Changed: MagnifierExperiments is a separate script
- Changed: Full-screen Scale example now adjusts correctly for Win8+
- Added: MagnifierScreenInverter example - invert screen colors via Tray
- Added: _MagnifierColorEffectIsEqual() - compare two Color Matrices for Equality

Share this post


Link to post
Share on other sites

Have you any idea on how to keep the "colors" intact while inverting the "grayscales" only (in order to protect our eyes whitout leaving in a "negative colors" world)?

Share this post


Link to post
Share on other sites

I've found this UDF and it seems perfect for magnifying a fixed area of my screen (eventually, this system tray).

But I haven't been able to get it to magnify any area that doesn't start at the top left corner.

#include "WinMagnifier.au3"

_MagnifierInit()

$aTmp = _MagnifierGUICreate(1200, 800, 200, 100) ; , $iX1, $iY1, $bInvertColors, $bShowCursor)
$hMagnifyGUI = $aTmp[0]
$hMagnifyCtrl = $aTmp[1]
_MagnifierSetSource($hMagnifyGUI, 200, 100, 800, 500)   ;<<<< HAS NO EFFECT
_MagnifierSetScale($hMagnifyCtrl, 2)

GUISetState(@SW_SHOW, $hMagnifyGUI)
Sleep(5000)

GUIDelete($hMagnifyGUI)
_MagnifierUnInit()

Obviously I'm missing something.  But what?

Also, what is the proper way to update the contents of the GUI after it has been displayed?  Plus, I'm a little uncertain as to when _MagnifierInit() is required.

Thanks in advance for help.

 

Share this post


Link to post
Share on other sites

I've found this UDF and it seems perfect for magnifying a fixed area of my screen (eventually, this system tray).

But I haven't been able to get it to magnify any area that doesn't start at the top left corner.

#include "WinMagnifier.au3"

_MagnifierInit()

$aTmp = _MagnifierGUICreate(1200, 800, 200, 100) ; , $iX1, $iY1, $bInvertColors, $bShowCursor)
$hMagnifyGUI = $aTmp[0]
$hMagnifyCtrl = $aTmp[1]
_MagnifierSetSource($hMagnifyGUI, 200, 100, 800, 500)   ;<<<< HAS NO EFFECT
_MagnifierSetScale($hMagnifyCtrl, 2)

GUISetState(@SW_SHOW, $hMagnifyGUI)
Sleep(5000)

GUIDelete($hMagnifyGUI)
_MagnifierUnInit()

Obviously I'm missing something.  But what?

Also, what is the proper way to update the contents of the GUI after it has been displayed?  Plus, I'm a little uncertain as to when _MagnifierInit() is required.

Thanks in advance for help.

 

you should pass the handle $hMagnifyCtrl  instead of $hMagnifyGUI to the _MagnifierSetSource function

#include <GUIConstantsEx.au3>
#include "WinMagnifier.au3"

_MagnifierInit()

$aTmp = _MagnifierGUICreate(500, 250, 200, 100) ; , $iX1, $iY1, $bInvertColors, $bShowCursor)
$hMagnifyGUI = $aTmp[0]
$hMagnifyCtrl = $aTmp[1]
; _MagnifierSetSource($hMagnifyGUI, 200, 100, 800, 500)   ;<<<< HAS NO EFFECT
_MagnifierSetScale($hMagnifyCtrl, 2)

GUISetState(@SW_SHOW, $hMagnifyGUI)
; Sleep(5000)

While 1
    Switch GUIGetMsg()
        Case $GUI_EVENT_CLOSE
            ExitLoop
    EndSwitch
    $aCoords = MouseGetPos()
    _MagnifierSetSource($hMagnifyCtrl, $aCoords[0], $aCoords[1], 100, 100)
WEnd

GUIDelete($hMagnifyGUI)
_MagnifierUnInit()

>here some other tests I've tried


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

Thanks for pointing that out.  My script was pretty crude, as I was just trying to get a handle on your UDF's basic operation.

I now have the magnified window following the cursor by moving both the Source Area and the Displayed Result in tandem.  It's not as smooth as I'd like, but it doesn't require any timers or other triggers.

I'll play with it over the next days and see what I can make of it.

Thanks, again.

Share this post


Link to post
Share on other sites

In working with this UDF, I've noticed a DLL call in the function _MagnifierSetSource() that seems to execute on each call such that a new structure is created each time:

$stRect = DllStructCreate("long[4];")

This normally wouldn't be a particular problem, but I'm trying to drag the window and am calling "set source" many times each second.

Can someone familiar with structures confirm that this is a problem? ... and maybe suggest a solution or an alternative?

Thanks in advance.

Share this post


Link to post
Share on other sites

#20 ·  Posted (edited)

By the way, I'm not sure, but the values for XOffset and YOffset for _MagnifierFullScreenSetScale() may differ betwen Windows 7 and Windows 8?  Right now it seems a bit odd that I have to feed a negative # in but perhaps there's logic in there somewhere?

 

Thanks again
For the problem with Windows 7-,
My solution is to change _MagnifierInit() from this:

Func _MagnifierInit()
    If $g_hMagnificationDLL <> -1 Then Return 1

    $g_hMagnificationDLL = DllOpen("Magnification.dll")
    If $g_hMagnificationDLL = -1 Then Return SetError(-1, 0, 0)

    Local $aRet = DllCall($g_hMagnificationDLL, "bool", "MagInitialize")
    If @error Or Not $aRet[0] Then
        Local $iErr = @error
        DllCall($g_hMagnificationDLL, "bool", "MagUninitialize")
        DllClose($g_hMagnificationDLL)
        $g_hMagnificationDLL = -1
        Return SetError(-1, $iErr, 0)
    EndIf

    ; Check on Windows 7+ and 8+ Magnifier Full-screen API functions support
    If _WinAPI_GetProcAddress(_WinAPI_GetModuleHandle("Magnification.dll"), "MagSetFullscreenColorEffect") = 0 Then
        ; Windows 8 API not present
        ;$g_bWin8MagnifyAPIPresent = False
        If _WinAPI_GetProcAddress(_WinAPI_GetModuleHandle("user32.dll"), "SetMagnificationDesktopColorEffect") = 0 Then
            ; Window 7 API not present (Vista-level O/S)
            ;$g_bWin7MagnifyAPIPresent = False
            $g_nWinMagnifyAPILevel = 1
            ConsoleWrite("Boo, simple Vista Magnify API Present!" & @LF)
        Else
            ;$g_bWin7MagnifyAPIPresent = True
            $g_nWinMagnifyAPILevel = 7
            ConsoleWrite("Windows 7 Magnify API Present!" & @LF)
        EndIf
    Else
        ConsoleWrite("Windows 8 Magnify API Present!" & @LF)
        ;$g_bWin7MagnifyAPIPresent = False
        ;$g_bWin8MagnifyAPIPresent = True
        $g_nWinMagnifyAPILevel = 8
    EndIf

    OnAutoItExitRegister("_MagnifierUnInit")
    Return 1
EndFunc

to this:

Func _MagnifierInit()
    If $g_hMagnificationDLL <> -1 Then Return 1
    
    If @OSBuild >= 7850 Then
        $g_hMagnificationDLL = DllOpen("Magnification.dll")
    Else
        $g_hMagnificationDLL = DllOpen(@ScriptDir&'\Magnification_win8.dll')
    EndIf
    
    If $g_hMagnificationDLL = -1 Then Return SetError(-1, 0, 0)

    Local $aRet = DllCall($g_hMagnificationDLL, "bool", "MagInitialize")
    If @error Or Not $aRet[0] Then
        Local $iErr = @error
        DllCall($g_hMagnificationDLL, "bool", "MagUninitialize")
        DllClose($g_hMagnificationDLL)
        $g_hMagnificationDLL = -1
        Return SetError(-1, $iErr, 0)
    EndIf
    
    $g_nWinMagnifyAPILevel = 8 
    OnAutoItExitRegister("_MagnifierUnInit")
    Return 1
EndFunc

And you need the win 8 version of the dll.

 

 

Magnification_win8.dll

Edited by gil900

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

    • wakillon
      By wakillon
      Polaroider 1.0.3.1
      Easily Create a picture as a Polaroid and be able after, to create Custom Photos Polaroid Collage.
      May be you know Pola a soft for create easily Polaroid-like photos from your digital images, but after some tries, i didn't find it very handy !
      So i made mine.
       

      Photo can be positioned by drag and zoomed/unzoomed with mouse wheel ( sorry for Touchpad user    )
      Polaroid can be inclined 10 or 20 degrees, on left or right, and with simple or multiple frames.
      Inclination will only be visible on the saved shoot.
      It is also saved with a transparent background for be able to create "Pêle-Mêles" (in french) with a photo editor.
      I have set the desktop as save directory.
      previous downloads : 122
       
      source and executable are available in the Download Section
      All files are included in script.
      I hope you will like it !
      Happy Shooting ! 
    • wakillon
      By wakillon
      Easily Create a picture as a Polaroid and be able after, to create Custom Photos Polaroid Collage.
       
      Photo can be positioned by drag and zoomed/unzoomed with mouse wheel ( sorry for Touchpad user )
      Polaroid can be inclined 10 or 20 degrees, on left or right, and with simple or multiple frames.
      Inclination will only be visible on the saved shoot.
      It is also saved with a transparent background for be able to create "Pêle-Mêles" (in french) with a photo editor.
      I have set the desktop as save directory.
       
    • 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