Files
doslang-mirror/.qemu/send-keys.ps1
T
2026-08-16 06:12:59 +09:00

61 lines
2.1 KiB
PowerShell

param(
[Parameter(Mandatory)]
[string] $Text,
[ValidateRange(0, 1000)]
[int] $DelayMilliseconds = 25,
[switch] $NoEnter
)
$ErrorActionPreference = 'Stop'
$map = @{
' ' = 'spc'; ':' = 'shift-semicolon'; ';' = 'semicolon'
'\' = 'backslash'; '|' = 'shift-backslash'; '/' = 'slash'; '?' = 'shift-slash'
'.' = 'dot'; '>' = 'shift-dot'; ',' = 'comma'; '<' = 'shift-comma'
'-' = 'minus'; '_' = 'shift-minus'; '=' = 'equal'; '+' = 'shift-equal'
'[' = 'bracket_left'; '{' = 'shift-bracket_left'
']' = 'bracket_right'; '}' = 'shift-bracket_right'
"'" = 'apostrophe'; '"' = 'shift-apostrophe'; '`' = 'grave_accent'; '~' = 'shift-grave_accent'
'!' = 'shift-1'; '@' = 'shift-2'; '#' = 'shift-3'; '$' = 'shift-4'; '%' = 'shift-5'
'^' = 'shift-6'; '&' = 'shift-7'; '*' = 'shift-8'; '(' = 'shift-9'; ')' = 'shift-0'
}
function ConvertTo-QemuKey([char] $Character) {
$text = [string] $Character
if ($map.ContainsKey($text)) { return $map[$text] }
if ([char]::IsLetter($Character)) {
$letter = [char]::ToLowerInvariant($Character)
if ([char]::IsUpper($Character)) { return "shift-$letter" }
return [string] $letter
}
if ([char]::IsDigit($Character)) { return $text }
throw "Unsupported QEMU key character: '$Character'"
}
$client = [System.Net.Sockets.TcpClient]::new([System.Net.Sockets.AddressFamily]::InterNetwork)
try {
$client.Connect([System.Net.IPAddress]::Parse('127.0.0.1'), 4444)
$stream = $client.GetStream()
$writer = [System.IO.StreamWriter]::new($stream, [System.Text.Encoding]::ASCII, 1024, $true)
try {
$writer.NewLine = "`r`n"
$writer.AutoFlush = $true
Start-Sleep -Milliseconds 100
foreach ($char in $Text.ToCharArray()) {
$writer.WriteLine("sendkey $(ConvertTo-QemuKey $char)")
Start-Sleep -Milliseconds $DelayMilliseconds
}
if (-not $NoEnter) { $writer.WriteLine('sendkey ret') }
Start-Sleep -Milliseconds $DelayMilliseconds
}
finally {
$writer.Dispose()
}
}
finally {
$client.Dispose()
}