Get scale/zoom percentage setting.

Example scripts and tips (replaces Old Scripts & Tips archive)

Moderators: Dorian (MJT support), JRL, Phil Pendlebury

Post Reply
User avatar
Dorian (MJT support)
Automation Wizard
Posts: 1384
Joined: Sun Nov 03, 2002 3:19 am
Contact:

Get scale/zoom percentage setting.

Post by Dorian (MJT support) » Thu Dec 10, 2020 3:05 pm

Tested in Windows 10.

I was asked how to do this today, and thought it might be useful to someone. This snippet returns a result code for the given scale/zoom percentage.

For example, mine is set to 250%, and Result is returned as 240.

Code: Select all

LibFunc>User32,GetDC,hDC,0
LibFunc>GDI32,GetDeviceCaps,Result,hDC,88
messagemodal>Result
96 – Smaller 100%
120 – Medium 125%
144 – Larger 150%
192 – Extra Large 200%
240 – Custom 250%
288 – Custom 300%
384 – Custom 400%
480 – Custom 500%
Yes, we have a Custom Scripting Service. Message me or go here

User avatar
Phil Pendlebury
Automation Wizard
Posts: 543
Joined: Tue Jan 16, 2007 9:00 am
Contact:

Re: Get scale/zoom percentage setting.

Post by Phil Pendlebury » Sat May 21, 2022 7:31 am

Additionally if we want to find the actual percentage scale factor and then do some stuff with it.:

Code: Select all

// 96 – Smaller 100%
// 120 – Medium 125%
// 144 – Larger 150%
// 192 – Extra Large 200%
// 240 – Custom 250%
// 288 – Custom 300%
// 384 – Custom 400%
// 480 – Custom 500%

LibFunc>User32,GetDC,hDC,0
LibFunc>GDI32,GetDeviceCaps,Result,hDC,88

// Test (300% Scaled)
Let>Result=288

Let>ResBy96=Result/96
Let>ResPerc=ResBy96*100
messagemodal>%ResPerc% is the scaling factor

// So if a box is 50x60
// and you ned to scale it
Let>xboxdim=50
Let>yboxdim=60
//
Let>xboxdimx=xboxdim/100
Let>xboxdimx=xboxdimx*ResPerc
Let>yboxdimy=yboxdim/100
Let>yboxdimy=yboxdimy*ResPerc

MDL>Original x: %xboxdim% will now be: %xboxdimx%%CRLF%Original y: %yboxdim% will now be: %yboxdimy%
Phil Pendlebury - Linktree

User avatar
Grovkillen
Automation Wizard
Posts: 1131
Joined: Fri Aug 10, 2012 2:38 pm
Location: Bräcke, Sweden
Contact:

Re: Get scale/zoom percentage setting.

Post by Grovkillen » Sun Feb 25, 2024 8:03 pm

This is what I do with all my scripts now. First I do a check and see what maximum vertical pixel count the desktop uses and then I get the highest dpi value. I compare these to my (for now) standard size of 1080 vs 96. I scale from those values if needed:

Code: Select all

Let>SCALE_OF_DIALOG=100

Let>DECIMAL_SEPARATOR=.
Let>RP_WINDOWMODE=0
Let>RP_CAPTURESTDOUT=1
Let>POWERSHELL_COMMAND=Get-WmiObject win32_desktopmonitor | ConvertTo-Json
RunProgram>cmd /c chcp 65001 > nul & cmd /c PowerShell -Command " & {%POWERSHELL_COMMAND%}"
Let>RP_WINDOWMODE=1
Let>RP_CAPTURESTDOUT=0
Trim>RP_STDOUT,TEMP_string
JSONParse>TEMP_string,$.DeviceID,TEMP_device_id
If>TEMP_device_id_count=0
  JSONParse>TEMP_string,$[*].DeviceID,TEMP_device_id
  JSONParse>TEMP_string,$[*].ScreenHeight,TEMP_y_resolution
  JSONParse>TEMP_string,$[*].PixelsPerYLogicalInch,TEMP_y_ppi
Else>
  JSONParse>TEMP_string,$.ScreenHeight,TEMP_y_resolution
  JSONParse>TEMP_string,$.PixelsPerYLogicalInch,TEMP_y_ppi
Endif>
If>TEMP_device_id_count>0
  Let>MAX_VERTICAL_RESOLUTION=0
  Let>MAX_VERTICAL_PIXEL_PER_INCH=0
  Let>k=0
  Repeat>k
    Let>k=k+1
    Let>TEMP_resolution=TEMP_y_resolution_%k%
    Let>TEMP_check=TEMP_resolution*0
    If>{(%TEMP_resolution% > %MAX_VERTICAL_RESOLUTION%) AND (%TEMP_check% = 0)}
      Let>MAX_VERTICAL_RESOLUTION=TEMP_resolution
    Endif>
    Let>TEMP_pixel_per_inch=TEMP_y_ppi_%k%
    Let>TEMP_check=TEMP_pixel_per_inch*0
    If>{(%TEMP_pixel_per_inch% > %MAX_VERTICAL_PIXEL_PER_INCH%) AND (%TEMP_check% = 0)}
      Let>MAX_VERTICAL_PIXEL_PER_INCH=TEMP_pixel_per_inch
    Endif>
  Until>k=TEMP_device_id_count
  Let>SCREEN_DENSITY={(%MAX_VERTICAL_RESOLUTION%/1080*%MAX_VERTICAL_PIXEL_PER_INCH%/96)}
Else>
  Let>SCREEN_DENSITY=1
Endif>
Let>SCALE_OF_DIALOG={Round(%SCALE_OF_DIALOG%*%SCREEN_DENSITY%)}
Let>MSG_HEIGHT={Round(350*%SCALE_OF_DIALOG%/100)}
Let>MSG_WIDTH={Round(300*%SCALE_OF_DIALOG%/100)}
The SCALE_OF_DIALOG parameter is used in case I want to tweak the dialog size (may it be user preference or my own use case).
Let>ME=%Script%

Running: 15.0.27
version history

Post Reply
Sign up to our newsletter for free automation tips, tricks & discounts