1

私はpowershellでGetWindowText API関数をどのように使用できますか?PowerShellでGetWindowText API関数をどのように使用できますか?

私はこの方法で試してみました:私のような機能を使用

$stringbuilder = New-Object System.Text.StringBuilder 
$stringbuilder.Capacity =256 

$WindowTitless = $ImportDll::GetWindowText($TopWindow, $stringbuilder, 256) 

が、私はエラーを得た:

Add-Type @" 
    using System; 
    using System.Runtime.InteropServices; 
    public class UserWindowss { 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count); 
} 
"@ 

をし、私はこのような文字列ビルダを作ります

ERROR: test: Failed to get active Window details. More Info: Exception calling "GetWindowText" with "3" argument(s): "Unable to find an entry point named 
ERROR: 'GetWindowText' in DLL 'user32.dll'." 

私はこの機能を使用するのに役立つものがありますか?あなたができる場合は儀式コード。 tnx。

+0

の可能性のある重複した[どのように私はPowerShellでのプロセスにより、すべてのウィンドウハンドルを取得することができますか?](http://stackoverflow.com/questions/25369285/how-can-i-get-all-window-handles -by-a-process-in-powershell) – TessellatingHeckler

+0

参考までにGet-Processのタイトルを次のように取得できます。 Get-Process | ProcessNameのような 'notepad' |あなたの助けには、MainWindowHandle、MainWindowTitle –

答えて

5

大雑把にこの:

Add-Type @" 
    using System; 
    using System.Runtime.InteropServices; 
    public class UserWindows { 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count); 
} 
"@ 

$stringbuilder = New-Object System.Text.StringBuilder 256 

Get-Process | ForEach-Object { 

    $count = [UserWindows]::GetWindowText($_.MainWindowHandle, $stringbuilder, 256) 

    if (0 -lt $count) { 
     "$($_.ProcessName) $($stringbuilder.ToString())" 
    } 

} 

$ImportDllがあなたのコード内のどこから来たあなたは言いませんでしたが、あなたは、あなたが定義したクラスの静的メソッドとしてそれらを呼び出すする必要があります。

私の投票のリンクには、より完全な例があります。


ヘルプリンク(利用可能な場合):(モジュールMicrosoft.PowerShell.Utility中)

+0

tnxを選択してください。あなたのコードをテストしましたか?私はそれが常に= 0をデバッグするとき。私はちょうど窓のテキストを取得したいのですが、私はstringbuilderが必要ですが、ここに何も表示されません。再びtyx – saftargholi

+0

私はそれを一度走った。それはウィンドウのタイトルを返しました:http://i.imgur.com/oeLsFB0.pngしかし、私はそれがあなたのために動作しない理由は分かりません。 – TessellatingHeckler

+1

あなたのソリューションは私のマシンでPowerShell v5 +を正常に動作させます。 –

-1

DLLからGetWindowTextAまたはGetWindowTextWをインポートします。マルチバイトまたはユニコードのいずれのバージョンの関数を使用するかによって異なります。

0

クラスをC#コードで宣言し、その関数を関数に記述してプログラムで使用できます。

Add-Type @" 
    using System; 
    using System.Runtime.InteropServices; 
    public class UserWindowss { 
    [DllImport("user32.dll")] 
    public static extern IntPtr GetWindowText(IntPtr hWnd, System.Text.StringBuilder text, int count); 
} 
"@ 
[UserWindowss]::GetWindowText(hwnd , stringbuilder , count) 
関連する問題