Első példa részletesen: ablakok elrejtése és visszaállítása

136 . ábra A ShowWindow leírása a PInvoke oldalon

A fenti ábrán például a ShowWindow funkció meghívását lehetővé tevő definíciós részt látjuk. Ezt a következőképpen kell PowerShell alá betenni:

$code = '[DllImport("user32.dll")]

[return: MarshalAs(UnmanagedType.Bool)]

public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);'

Add-Type -memberDefinition $code -name NativeMethod -namespace Win32

A $code változóhoz rendelem hozzá a PInvoke oldalról bemásolt kódot, és itt a következő apró módosításokat kellett elvégeznem. Először is az exportált függvény public kell, hogy legyen. Másrészt a weboldalon látható, a függvény második paraméterének típusa egy ShowWindowCommands típus nincs számunkra definiálva, de észrevehetjük, hogy ez valószínűleg egy felsorolás adattípus, tehát azt helyettesíthetjük az int-tel.

Ezek után az Add-Type  cmdlettel ezt hozzáadhatjuk a PowerShell környezetünkhöz, mint egy típus, és hogy hivatkozni is tudjunk rá el kell látni egy tetszőleges névvel és névtérrel.

A szkript további részében fény derül arra a Hide-Window és a Restore-Window függvényeknél, hogyan is kell ezután azt a típust munkára fogni. De előtte meg kell győződni, hogy az összes bemeneti adattal rendelkezünk-e, ami a ShowWindow metódus paramétereként majd kell. A Get-Process kimeneteként adódó processz objektumoknak van MainWindowHandle tulajdonságunk, viszont én olyan ablak elrejtő és helyreállító függvényt akarok, ami csak az adott felhasználó nevében futó processzekre lehet meghívni, és persze csak olyanokra, amelyeknek van ablakuk, azaz az ablakuknak van címsoruk.

Így a szkript első néhány sorában ezeket a processzeket szűröm, ki és teszem hozzá a tulajdonost tartalmazó attribútumot, az egészet eltárolom a $procs változóba.

$procs = Get-Process | ?{$_.mainwindowtitle} |

    %{$p = $_; [wmi] "Win32_Process.Handle=""$($_.id)""" } |

        Add-Member -MemberType scriptproperty -Name Owner -Value {"$($this.getowner().domain)\$($this.getowner().user)"} -PassThru |

            %{Add-Member -InputObject $_ -MemberType noteproperty -name MainWindowHandle -Value $p.mainwindowhandle -PassThru} |

            %{Add-Member -InputObject $_ -MemberType noteproperty -name MainWindowTitle -Value $p.mainwindowtitle -PassThru} |

            ?{$_.owner -eq "$($env:userdomain)\$($env:USERNAME)"} |

                Select-Object -Property name, owner, processid, mainwindowhandle, mainwindowtitle

Ezután jönnek azok a függvénydefiníciók, amely igazából fontos számunkra. Ugyanaz majdnem a kettő, csak más második paraméterrel hívjuk meg a ShowWindow metódust. A 0 jelenti az elrejtést, az 5 a helyreállítást.

Nézzük meg, hogy pontosan hogyan is kell ezek után ezt a metódust meghívni! Látható, hogy az Add-Type-nál megadott névtéren belüli típusról van szó: [Win32.NativeMethod], és ennek statikus metódusa a ShowWindow:

function Hide-Window ($expression){

    $procs | ?{$_ | select-object -property name, processid | Out-String | ?{$_ -match $expression}} | %{

        [void] ([Win32.NativeMethod]::ShowWindow($_.mainwindowhandle,0))

    }

}

 

function Restore-Window ($expression){

    $procs | ?{$_ | select-object -property name, processid | Out-String | ?{$_ -match $expression}} | %{

        [void] ([Win32.NativeMethod]::ShowWindow($_.mainwindowhandle,5))

    }

}

Egy pici trükközés van a processzek kiválasztását illetően, hogy akár a processz neve vagy a processzazonosító is lehessen az ablak hivatkozása.

Ezek után így lehet ezt a függvénypárt meghívni:

[5] PS C:\> Hide-Window outlook

[6] PS C:\> Restore-Window outlook



Word To HTML Converter