Get new windows of a certain type

This topic contains 0 replies, has 1 voice, and was last updated by Profile photo of Forums Archives Forums Archives 5 years, 3 months ago.

  • Author
    Posts
  • #5336

    by clovisc at 2012-12-10 07:07:55

    Hi,

    I'm trying to do something similar to Autohotkey's IfwinExist, which means I'm trying to run an action whenever a window of a certain type is opened.

    I don't really know how to go about it.

    I tried creating an array that contains all open windows of the type I want, then waiting one second, then creating a second array with the same, then comparing the arrays.

    It doesn't seem to work great.

    Here's what I did:

    Function check-newincs(){
    #get all inc windows
    $newwin1 = @((Select-Window -Title "INC* - Windows Internet *") | ? {$_.Processname -eq "iexplore"})
    #count windows
    $count = $newwin.Count
    sleep 5
    #get them again
    $newwin = @((Select-Window -Title "INC* - Windows Internet *") | ? {$_.Processname -eq "iexplore"})
    #if count gets bigger, then
    if ((Arearraysequal $newwin $newwin1) -eq $false){
    $a = (Compare-Object $newwin $newwin1)
    Set-Variable newinc ($a.InputObject) -Scope global
    activate-inc
    }
    sleep 1
    }
    Function do-checknewincs() {
    While ($true) {
    check-newincs
    }
    }

    arearraysequal contains a function I found on internet, but I don't understand all subtleties of it because it isn't commented.

    For example I do not know what ".rank" is, or what ".getEnumerator()" does. That I can obviuosly find on internet.

    I will post arearraysequal here if you are interested:

    function AreArraysEqual($a1, $a2) {
    if ($a1 -isnot [array] -or $a2 -isnot [array]) {
    throw "Both inputs must be an array"
    }
    if ($a1.Rank -ne $a2.Rank) {
    return $false
    }
    if ([System.Object]::ReferenceEquals($a1, $a2)) {
    return $true
    }
    for ($r = 0; $r -lt $a1.Rank; $r++) {
    if ($a1.GetLength($r) -ne $a2.GetLength($r)) {
    return $false
    }
    }
    $enum1 = $a1.GetEnumerator()
    $enum2 = $a2.GetEnumerator()
    while ($enum1.MoveNext() -and $enum2.MoveNext()) {
    if ($enum1.Current -ne $enum2.Current) {
    return $false
    }
    }
    return $true
    }

    Activate-inc just displays a message box with the title of the new window for now.

    I use select-window from WASP, but I coul dalso have used the com object Shell.application and enumerated windows.

    Thanks for any help on how to do this.

    Clovis

    by coderaven at 2012-12-17 12:04:59

    Instead of doing all that, you may try looking at Get-Process and the MainWindowTitle property.
    Get-Process | Select MainWindowTitle
    This will list you all the window titles for the applications that have one. If you use
    Get-Process | Where-Object {$_.MainWindowTitle -like *Some Title*}
    in you loop you should get to where you want to go.

You must be logged in to reply to this topic.