26 lines
1.3 KiB
PowerShell
26 lines
1.3 KiB
PowerShell
[CmdletBinding()]
|
|
param([Parameter(Mandatory=$true)][int]$GameProcessId,
|
|
[ValidateSet('Enter','Escape','Up','Down','Tab')][string]$Key='Enter')
|
|
$ErrorActionPreference='Stop'
|
|
$process=Get-Process -Id $GameProcessId -ErrorAction Stop
|
|
if ($process.ProcessName -ne 'SHProto-Win64-Shipping') { throw 'This helper is scoped to the authorized Silent Hill 2 diagnostic.' }
|
|
if (!('D4RGameKeys' -as [type])) {
|
|
Add-Type @'
|
|
using System;
|
|
using System.Runtime.InteropServices;
|
|
public static class D4RGameKeys {
|
|
[DllImport("user32.dll")] public static extern bool PostMessage(IntPtr window, uint message, IntPtr key, IntPtr flags);
|
|
[DllImport("user32.dll")] public static extern uint MapVirtualKey(uint code, uint kind);
|
|
}
|
|
'@
|
|
}
|
|
$window=$process.MainWindowHandle
|
|
if ($window -eq [IntPtr]::Zero) { throw 'Game window missing on this desktop.' }
|
|
$codes=@{Enter=13; Escape=27; Up=38; Down=40; Tab=9}
|
|
$code=$codes[$Key]; $scan=[D4RGameKeys]::MapVirtualKey($code,0)
|
|
$flags=[long](1 -bor ($scan -shl 16))
|
|
if ($Key -in @('Up','Down')) { $flags=$flags -bor 0x01000000 }
|
|
if (![D4RGameKeys]::PostMessage($window,0x100,[IntPtr]$code,[IntPtr]$flags)) { throw 'Game key-down post failed.' }
|
|
if (![D4RGameKeys]::PostMessage($window,0x101,[IntPtr]$code,[IntPtr]($flags -bor 0xc0000000L))) { throw 'Game key-up post failed.' }
|
|
Write-Host "Sent $Key only to diagnostic game PID $GameProcessId."
|