Sign in to follow this  
Followers 0
DLS

How to find if window handle is active on current virtual desktop (Win10)

2 posts in this topic

#1 ·  Posted (edited)

I have a working script that changes the core affinity and process priority of multiples of a specific application I have running.  

I have that part figured out.


I would like to make a little modification to it.


Windows10 introduced virtual desktops.  I am trying to have different core affinity and priority of processes on the visible and non-visible desktops.  

What I need is a bool function that could be described as IsWindowOnCurrentDesktop($hWnd).  I have searched the winAPI.au3 but I do not believe anything like that exists built it.

I have searched multiple places before asking for help. I found a Microsoft supplied example of the function I need using C#, but I am unfamiliar with C# to a degree that I cannot port the system call over.

https://blogs.msdn.microsoft.com/winsdk/2015/09/10/virtual-desktop-switching-in-windows-10/

Help is appreciated but not expected.  Thanks in advanced.   In the meantime I will be learning C# syntax and class structure.

Edited by DLS

Share this post


Link to post
Share on other sites



#2 ·  Posted (edited)

I got it to work.  Heres the code if someone needs it.

Relevant Function

Func _IsWindowOnCurrentVirtualDesktop($hWnd)
    $CLSID = "{aa509086-5ca9-4c25-8f95-589d3c07b48a}"
    $IID = "{a5cd92ff-29be-454c-8d04-d82879fb3f1b}"
    $TAG = "IsWindowOnCurrentVirtualDesktop hresult(hwnd;ptr*);"
    $IVirtualDesktopManager = ObjCreateInterface($CLSID, $IID, $TAG)
    $Result = False
    $IVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop($hWnd, $Result)
    $IVirtualDesktopManager = 0
    Return $Result
 EndFunc

Entire Program

#requireadmin
#include <WinAPI.au3>
#include <WinAPIProc.au3>
#include <ProcessConstants.au3>

$Process = ProcessList("processname.exe")
For $i = 1 To $Process[0][0]
    $pid = $Process[$i][1]
    $handle = _WinAPI_OpenProcess($PROCESS_QUERY_INFORMATION+$PROCESS_SET_INFORMATION, False, $pid)
    $hWnd = _GetWindowHandleFromPid($pid)
    ProcessSetPriority ($pid, 0 )                           ;set cpu priority
    _WinAPI_SetProcessAffinityMask($handle, 0x08)           ;set cpu affinity
    ;msgbox(0,"",$Process[$i][0] & "   " & $Process[$i][1]  & "   " & $handle & "   " & $hWnd ) ;debug
    ;msgbox(0, "", _IsWindowOnCurrentVirtualDesktop($hWnd)) ;debug
 Next

Func _IsWindowOnCurrentVirtualDesktop($hWnd)
    $CLSID = "{aa509086-5ca9-4c25-8f95-589d3c07b48a}"
    $IID = "{a5cd92ff-29be-454c-8d04-d82879fb3f1b}"
    $TAG = "IsWindowOnCurrentVirtualDesktop hresult(hwnd;ptr*);"
    $IVirtualDesktopManager = ObjCreateInterface($CLSID, $IID, $TAG)
    $Result = False
    $IVirtualDesktopManager.IsWindowOnCurrentVirtualDesktop($hWnd, $Result)
    $IVirtualDesktopManager = 0
    Return $Result
 EndFunc

 Func _GetWindowHandleFromPid($pid)
    Local $aData = _WinAPI_EnumProcessWindows($pid)
    Return $aData[1][0]
 EndFunc

;~  0x01    CPU1                binary to hex conversion reference chart with 1s for active cores and 0s for disabled
;~  0x02    CPU2
;~  0x03    CPU1+2
;~  0x04    CPU3
;~  0x05    CPU1+3
;~  0x06    CPU2+3
;~  0x07    CPU1+2+3
;~  0x08    CPU4
;~  0x09    CPU1+4
;~  0x0A    CPU2+4
;~  0x0B    CPU1+2+4
;~  0x0C    CPU3+4
;~  0x0E    CPU1+3+4
;~  0x0F    CPU1+2+3+4

 

Edited by DLS

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

    • BBs19
      By BBs19
      Features:
      Create modern looking borderless and resizable GUIs with control buttons (Close,Maximize/Restore,Minimize, Fullscreen, Menu) True borderless, resizeable GUI with full support for aerosnap etc. Many color schemes/themes included. See MetroThemes.au3 for more details. 3 type of Windows 8/10 style buttons. Modern checkboxes, radios, toggles and progressbar. All buttons, checkboxes etc. have hover effects! Windows 10 style modern MsgBox. Windows 10/Android style menu that slides in from left. Windows 10 style right click menu  
      Credits: @UEZ, for the function to create buttons with text using GDIPlus. @binhnx for his SSCtrlHover UDF
       
      Changelog:
      Download UDF with example:
       
       
    • keelaji
      By keelaji
      Hello,
      first of all i searched in the forum but i didn't found any solution to my problem.
      I am using windows 10.
      I made a script that is supposed to change the title to the active window, resize it to the smallest size possible (should be around 800 x 600) and move to (0, 0).
      I can change the title but i fail to do the other 2 tasks.
      i use wingettitle [active] copied from the F1 help tool (and this works), i i put the title in a variable and than i use
      winsettitle ($variable, "one") (this works too)
      winmove ("one", 0, 0, 800, 600) (doesn't do anything)
      i also tried
      local $x = winget ( "one")
      msgbox (0, "", $x) (i get a completely white box so i suppose winget can't have any data about my window ??)
      any suggestion ?
    • spuuunit
      By spuuunit
      I have a script that autostart with Windows, and sometimes some of my code is skipped. My script takes long pauses, so it's not that the script "goes too fast". This is my script for now:
      TraySetIcon("C:\Portables\AutoIt\_\icon.ico") AutoItSetOption("WinTitleMatchMode", 2) Run("C:\Portables\Key Manager\keymanager.exe") WinActivate("ATNSOFT Key Manager v") WinWaitActive("ATNSOFT Key Manager v") WinMove("ATNSOFT Key Manager v", "", 650, 200, 600, 800) Sleep(500) $pos = MouseGetPos() MouseClick("left", 1220, 210, 1, 100) MouseMove($pos[0], $pos[1], 100) Run("C:\Portables\foobar2000\foobar2000.exe") $version = 298 For $i = 0 To 99 Step 1 $path = "C:\Users\spunit\AppData\Local\Discord\app-0.0." & $version + $i & "\Discord.exe" If FileExists($path) Then Run($path) ExitLoop EndIf Next Run("C:\Portables\Firefox\FirefoxPortable.exe") Sleep(10000) WinMove("- Mozilla Firefox", "", 205, 0, 1214, 1047) Sleep(100) MouseClick("left", 1300, 15, 1, 10) Sleep(100) MouseClick("left", 1130, 275, 1, 10) Sleep(100) MouseClick("left", 930, 105, 1, 10) Sleep(100) Send("#{m}") Sometimes it skips to click and move mouse right after Key Manager starts. Almost always it skips everything after the last run.

      This type of script were never an issue with Windows 7... Any thoughts?
    • VIP
      By VIP
      I can not do anything with any user in the "Local Users Group"
      I tried from my account but I could not change my password (ie set new password)!
      But I was able to activate the Administrator account and I logged into the Administrator account and still could not do anything with my account! But I can set the password and disable the Administrator account from my account or Administrator.
      Any ideas? (Ignore the click on the Sign-in option in the Change Accout settings.)
       

    • dreivilo47
      By dreivilo47
      When I want to test Example 1 of Function _IECreate (AutoIt Help File), I see that function _IECreate doesn't work in Windows 10.
      Syntax Check (Ctrl+F5) gives no errors.
       
      Example 1:
      ; Create a browser window and navigate to a website #include <IE.au3> Local $oIE = _IECreate("www.autoitscript.com")  
      The error I receive with F5 (Tools, Go) in SciTE: