1

Как я могу использовать функцию API GetWindowText в powershell?Как я могу использовать функцию API GetWindowText в powershell?

я попробовал этот путь:

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); 
} 
"@ 

и я сделать строковое строитель так:

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

я использовал функцию как:

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

, но я получил сообщение об ошибке:

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'." 

Кто-нибудь может мне помочь использовать эту функцию? если можете пожалуйста w обман код. Тпй.

+0

Возможный дубликат [Как я могу получить все оконные ручки с помощью процесса в Powershell?] (Http://stackoverflow.com/questions/25369285/how-can-i-get-all-window-handles -by-a-process-in-powershell) – TessellatingHeckler

+0

FYI, вы можете получить титулы от Get-Process как: Get-Process | где ProcessName - как «блокнот» | Выберите 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 пришли в вашем коде, но вы должны называть их как статические методы класса, который вы определили.

Ссылка на мой бюллетень содержит более полные примеры.


Помощь Ссылки (если таковые имеются):

+0

tnx за помощью. вы проверили свой код? когда я отлаживаю его count always = 0. Я хочу получить только текст в формате Windows, мне нужен stringbuilder, но ничего не показывать здесь, я проголосовал за ваши ответы. tnx again – saftargholi

+0

Я запустил его один раз. Он вернул названия окон: http://i.imgur.com/oeLsFB0.png Но я понятия не имею, почему это не работает для вас. – TessellatingHeckler

+1

Ваше решение отлично подходит для меня, PowerShell v5 + на моей машине. –

-1

Импортируйте GetWindowTextA или GetWindowTextW из библиотеки DLL. В зависимости от того, нужна ли вам многобайтовая или юникодная версия функции.

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)