Конечно.
Я конвертировал Функция Nitesh C # в скрипт Powershell
$signature_user32_GetForegroundWindow = @"
[DllImport("user32.dll")]
public static extern IntPtr GetForegroundWindow();
"@
$signature_user32_GetWindowText = @"
[DllImport("user32.dll")]
public static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count);
"@
$foo = `
Add-Type -MemberDefinition $signature_user32_GetForegroundWindow `
-Name 'user32_GetForegroundWindow' `
-Namespace 'Win32' `
-PassThru
$bar = `
Add-Type -MemberDefinition $signature_user32_GetWindowText `
-Name 'user32_GetWindowText' `
-Namespace 'Win32' `
-Using System.Text `
-PassThru
[int]$nChars = 256
[System.IntPtr] $handle = New-object 'System.IntPtr'
[System.Text.StringBuilder] $Buff = New-Object 'System.Text.StringBuilder' `
-ArgumentList $nChars
$handle = $foo::GetForegroundWindow()
$title_character_count = $bar::GetWindowText($handle, $Buff, $nChars)
If ($title_character_count -gt 0) { Write-Output $Buff.ToString() }
Здесь много чего происходит.Позвольте немного рассказать о том, что я сделал.
- Я создал две сигнатуры метода (бит в строке здесь);по одному на каждую функцию, которую мы вызываем.
- Я использую эти сигнатуры для создания соответствующих типов.Опять же, по одному для каждого метода.
- Для GetWindowType (который передает заголовок обратно в строку и нуждается в ссылке на System.Text), я передаю пространство имен
System.Text
в параметре -Using
. - За кулисами PowerShell добавляет ссылки на
System
и System.Runtime.InteropServices
, поэтому не нужно беспокоиться о них. - Я создаю размер строки (
$nChars
), указатель окна ($handle
) и буфер заголовка окна ($Buff
) - Я вызываю функции через указатель типа:
$foo...
и $bar...
Вот что яполучить, когда я запускаю все это ...
Всякий раз, когда мне нужно вызвать Windows API (что на самом деле не мое), я ссылаюсьследующие две статьи:
Надеюсь, это поможет!