Running an executable, Screen Resolution for Multiple Monitors

Technical support and scripting issues

Moderators: Dorian (MJT support), JRL

Post Reply
jbas
Junior Coder
Posts: 23
Joined: Tue Dec 15, 2009 4:59 pm

Running an executable, Screen Resolution for Multiple Monitors

Post by jbas » Thu Aug 08, 2019 1:52 am

A have a macro for managing / manipulating windows on PC with multiple monitors (similar to Display Fusion but with custom modes not supported by them). I have two 'issues' that I have work-arounds for, but I'm wondering if anyone has better alternatives.
1) I need a way to read the current screen resolution for the existing monitors. I did a fair amount of research but didn't find a workable alternative. My work-around was to send the output from the NirSoft MultiMonitorTool to a dataset and then read the data from there. This works, but it's slow. Does anyone have a better alternative? Much of what I found on the internet was old and I couldn't get it to work.
2) When I compile the script to share it with others I set up a windows 'hot-key' to run it. The issue is that using the hot-key causes the window that was active when the hot-key was pressed to lose focus. Adding commands to press 'Alt-Tab' to get back to the original window works - but is there a better way to do this?

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

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by Dorian (MJT support) » Fri Aug 09, 2019 1:57 pm

I'm not too sure about question 1, but this might help with question 2.

The most basic answer is to use SetFocus at the beginning of the script.

The question is, do you know the name of the window? If not, then maybe we can figure that out.

You're correct in saying that the hot key causes the current window to lose focus. That of course means we can't use GetActiveWindow, as it's no longer active.

However, I noticed a while back that GetWindowList always seems to return a list in the order they were last active. I just tested this with Notepad1, Notepad2, Notepad3 etc. The last active window always seems to be the first one in the list.

So, would this work?

Code: Select all

GetWindowList>winlist
Separate>winlist,CRLF,windows
SetFocus>windows_1
Or go through the entire list of open windows and SetFocus the one which matches the criteria

Code: Select all

//Loop through a list of windows
GetWindowList>winlist
Separate>winlist,CRLF,windows
Let>k=1
Repeat>k
  Let>this=windows_%k%

  //Does the Window title contain "Notepad"
  Pos>Notepad,%this%,1,NotePos,
  
  //if yes, do something
  If>NotePos>0
    Setfocus>%this%
  Endif
  
  Let>k=k+1
Until>k>windows_count
Or a combination of the two?
Always accepting custom script commissions. Message me or go here

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

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by Dorian (MJT support) » Fri Aug 09, 2019 2:30 pm

Regarding question 1, I had a Google around, and found this : https://www.windows-commandline.com/get ... nd-prompt/

Which may mean this could be a good starting point for you. Obviously you'd need to edit those output paths. Can be a temp directory if required.

Code: Select all

let>RP_WINDOWMODE=0
RunProgram>cmd /c wmic desktopmonitor get screenheight, screenwidth > d:\screen.txt
//or
RunProgram>cmd /c wmic path Win32_VideoController get CurrentHorizontalResolution,CurrentVerticalResolution > d:\screen.txt
Always accepting custom script commissions. Message me or go here

jbas
Junior Coder
Posts: 23
Joined: Tue Dec 15, 2009 4:59 pm

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by jbas » Fri Aug 09, 2019 6:21 pm

. The issue with running the executable using a Windows Hot-Key is that I want to know which window was active when they pressed the Hot-Key and I won't be able to tell which window that was. Using commands to do an 'Alt-Tab' works but I'm not sure how reliable it is. Thank you for the suggestion to use GetWindowList. I will try it!

. Regarding getting the resolution for multiple monitors
. . GetScreenResolution works to return the resolution for the primary monitor but I need the current screen resolution for all connected monitors. I currently use my laptop monitor (1440x900) and one external monitor (1920x1080) but I will soon be adding two additional monitors which will likely be using yet another resoluton.
. . The wmic 'desktopmonitor' command did not return anything
. . The wmic 'win32_videocontroller' command returned a single width/height value of 2736/1824- which is the maximum supported resolution for my laptop monitor
. . From what I've read I think I need to collect the WmiMonitorID's and then from that, collect (or calculate) the current resolution for each monitor. I was unable to find a solution I could run directly within Macro Scheduler so I used my workaround with the NirSoft utility. I was hoping someone already had a solution. If not, I'll keep working on it in my 'spare' time

Thank you for the replies!

jbas
Junior Coder
Posts: 23
Joined: Tue Dec 15, 2009 4:59 pm

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by jbas » Fri Aug 09, 2019 6:21 pm

. The issue with running the executable using a Windows Hot-Key is that I want to know which window was active when they pressed the Hot-Key and I won't be able to tell which window that was. Using commands to do an 'Alt-Tab' works but I'm not sure how reliable it is. Thank you for the suggestion to use GetWindowList. I will try it!

. Regarding getting the resolution for multiple monitors
. . GetScreenResolution works to return the resolution for the primary monitor but I need the current screen resolution for all connected monitors. I currently use my laptop monitor (1440x900) and one external monitor (1920x1080) but I will soon be adding two additional monitors which will likely be using yet another resoluton.
. . The wmic 'desktopmonitor' command did not return anything
. . The wmic 'win32_videocontroller' command returned a single width/height value of 2736/1824- which is the maximum supported resolution for my laptop monitor
. . From what I've read I think I need to collect the WmiMonitorID's and then from that, collect (or calculate) the current resolution for each monitor. I was unable to find a solution I could run directly within Macro Scheduler so I used my workaround with the NirSoft utility. I was hoping someone already had a solution. If not, I'll keep working on it in my 'spare' time

Thank you for the replies!

jbas
Junior Coder
Posts: 23
Joined: Tue Dec 15, 2009 4:59 pm

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by jbas » Sat Aug 10, 2019 7:09 pm

The following PowerShell commands return the information I need but I'm having trouble getting them to work in Macro Scheduler:
/*
PS1:
Add-Type -AssemblyName System.Windows.Forms
[System.Windows.Forms.Screen]::AllScreens | Clip.exe
*/
LabelToVar>PS1,PSCmd,1,1
Run>powershell.exe -%PSCmd%
wait>2
GetClipBoard>check_ps
**breakpoint**

This is the first time I've tried using PowerShell within Macro Scheduler. I'm obviously doing something wrong. Help?

jbas
Junior Coder
Posts: 23
Joined: Tue Dec 15, 2009 4:59 pm

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by jbas » Sun Aug 11, 2019 12:21 am

Corrected syntax -now it works as expected:

Let>RP_WINDOWMODE=0
/*
PS1:
Add-Type -AssemblyName System.Windows.Forms;
[System.Windows.Forms.Screen]::AllScreens | Clip.exe;
*/
LabelToVar>PS1,PSCmd
Run>powershell.exe -command "%PSCmd%"
wait>10
GetClipBoard>check_ps
**breakpoint**

User avatar
JRL
Automation Wizard
Posts: 3266
Joined: Mon Jan 10, 2005 6:22 pm
Location: Iowa

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by JRL » Mon Aug 12, 2019 6:37 pm

Well done jbas!

I watched this thread with interest not commenting because I don't like the solutions I've used for multiple monitor resolution acquisition. This powershell solution is spectacular!

I did make a small alteration for timing. I removed your Wait>10 and added an RP_Wait>1 to cause Macro Scheduler to wait for the powershell script to finish before moving on to the other lines of code. And added WaitClipBoard> so the script could continue immediately after the clipboard stops changing. Seems to be working reliably but your results may vary. I'd suggest a very short wait ahead of WaitClipboard if the script ever fails to produce a result.

Code: Select all

Let>RP_WINDOWMODE=0
Let>RP_Wait=1
/*
PS1:
Add-Type -AssemblyName System.Windows.Forms;
[System.Windows.Forms.Screen]::AllScreens | Clip.exe;
*/
LabelToVar>PS1,PSCmd
Run>powershell.exe -command "%PSCmd%"
WaitClipBoard
GetClipBoard>check_ps

MDL>check_ps

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

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by Dorian (MJT support) » Tue Aug 13, 2019 12:32 pm

Hi JRL.

Thank you for that input. Most appreciated. I have a question, as someone who knows nothing about Powershell.

Right now I am using a 4k laptop connected with a USB Type-C > HDMI adapter to a 49 inch 4k TV as a secondary monitor. Are the results you see below what you'd expect from that setup? Maybe there's something screwy in my setup.

BitsPerPixel : 32
Bounds : {X=0,Y=0,Width=1536,Height=864}
DeviceName : \\.\DISPLAY1
Primary : True
WorkingArea : {X=0,Y=0,Width=1536,Height=824}

BitsPerPixel : 32
Bounds : {X=0,Y=-864,Width=1280,Height=720}
DeviceName : \\.\DISPLAY2
Primary : False
WorkingArea : {X=0,Y=-864,Width=1280,Height=680}
Always accepting custom script commissions. Message me or go here

User avatar
JRL
Automation Wizard
Posts: 3266
Joined: Mon Jan 10, 2005 6:22 pm
Location: Iowa

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by JRL » Tue Aug 13, 2019 12:48 pm

Hello Dorian,

Assuming you have a windows 10 computer, what do you see if you right click the desktop and select "Display Settings" from the menu? You should see representations of both monitors (1 and 2) and if you scroll down you will find what Windows reports as the resolution of the selected monitor.

If the Display Settings match the PS output, I'd suspect the monitor goes to 4k when an application asks for it and returns to more "reasonable" resolution otherwise. Seems your desktop icons would be dots at 4k resolution.

Google returned this PC World article.

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

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by Dorian (MJT support) » Wed Aug 14, 2019 2:29 pm

Both say 3840x2160, which is what I was expecting the PS output to be.

I think you've helped me figure it out. It's the zoom level.

Monitor 2
3840 x 2160 is scaled at 300%
1280 x 720 is 3840 x 2160 / 3

Monitor 1
3840 x 2160 is scaled at 250%
1536 x 824 is 3840 x 2160 / 2.5

Even though 2.5 x 824 is 2060, I think this must be the answer.
Always accepting custom script commissions. Message me or go here

User avatar
JRL
Automation Wizard
Posts: 3266
Joined: Mon Jan 10, 2005 6:22 pm
Location: Iowa

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by JRL » Wed Aug 14, 2019 7:14 pm

Happy to have pretended to help :roll:

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

Re: Running an executable, Screen Resolution for Multiple Monitors

Post by Dorian (MJT support) » Thu Aug 15, 2019 12:33 pm

Sometimes all it takes is bouncing off someone else, eh?
Always accepting custom script commissions. Message me or go here

Post Reply