Search code examples
windowspowershellcommand-linedisplayresolution

If condition not working while comparing the current resolution of the machine with standard resolution using powershell


I want to get the current resolution of the machine and store it to use for comparison with a standard resolution. We are keeping standard resolution as 1280x1024 or 1920x1080.

I am able to get current resolution as variable $hdc from the amazing answer here https://superuser.com/a/1437714/1280078 but how do I use $hdc further to compare with above resolution/widths.

I used below code in powershell but it does not seem to work for the if condition and only goes to the else condition. What am I doing wrong here?

Add-Type @"
using System;
using System.Runtime.InteropServices;
public class PInvoke {
    [DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hwnd);
    [DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
}
"@
while ($true) #To execute following in infinite loop
{
#Check the width of the machine and store in variable $hdc
$hdc = [PInvoke]::GetDC([IntPtr]::Zero)
[PInvoke]::GetDeviceCaps($hdc, 118) # Get width

#Compare with standard width in standard resolution
if(($hdc -eq 1280) -or ($hdc -eq 1920)) { #NOT Working
   write-host("Resolution is correct")
}else {
    Start-sleep -s 60
    #Wait for resolution to be set on startup and check width again
    write-host("Resolution is not correct, checking again...")
    [PInvoke]::GetDeviceCaps($hdc, 118) # Get width
    
    #Compare with standard widths again, send  email if NOT equal
    if(($hdc -eq 1280) -or ($hdc -eq 1920)) {
        write-host("Resolution is correct")
    }else {
        write-host("Resolution is not correct, triggering email notification...")
        break #break loop if email is triggered
}
}
}

Solution

  • The width isn't stored in the variable $hdc, it is retrieved by running the line [PInvoke]::GetDeviceCaps($hdc, 118). You could do something like $width = [PInvoke]::GetDeviceCaps($hdc, 118) and then replace your $hdc with $width in your if.

    So, in other words, something like this should work.

    Add-Type @"
    using System;
    using System.Runtime.InteropServices;
    public class PInvoke {
        [DllImport("user32.dll")] public static extern IntPtr GetDC(IntPtr hwnd);
        [DllImport("gdi32.dll")] public static extern int GetDeviceCaps(IntPtr hdc, int nIndex);
    }
    "@
    while ($true) #To execute following in infinite loop
    {
        #Check the width of the machine and store in variable $hdc
        $hdc = [PInvoke]::GetDC([IntPtr]::Zero)
        $width = [PInvoke]::GetDeviceCaps($hdc, 118) # Get width
    
        #Compare with standard width in standard resolution
        if(($width -eq 1280) -or ($width -eq 1920)) { #NOT Working
           write-host("Resolution is correct")
        }else {
            Start-sleep -s 60
            #Wait for resolution to be set on startup and check width again
            write-host("Resolution is not correct, checking again...")
            $width = [PInvoke]::GetDeviceCaps($hdc, 118) # Get width
        
            #Compare with standard widths again, send  email if NOT equal
            if(($width -eq 1280) -or ($width -eq 1920)) {
                write-host("Resolution is correct")
            }else {
                write-host("Resolution is not correct, triggering email notification...")
                break #break loop if email is triggered
    }
    }
    }