[Windows.Devices.HumanInterfaceDevice.HidDevice,Windows.Devices.HumaInterfaceDevice,ContentType=WindowsRuntime] [Windows.Devices.Enumeration.DeviceInformation,Windows.Devices.Enumeration,ContentType=WindowsRuntime]
こう書いておくと、
$selector = [Windows.Devices.HumanInterfaceDevice.HidDevice]::GetDeviceSelector($usagePage, $usageId) $async = [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector)
と、ここまでは書くことができる。しかし PowerShell には非同期サポートがないので、これ以上どうしようもない。
とりあえず Task に変換して sleep しながら IsCompleted を見ればなんとかなるかなと思い以下のようにしてみた
$task = [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector).AsTask()
これはうまくいかない。AsTask() が存在しないと言われる。WindowsRuntimeSystemExtensions だからしかたないのかな? と思い、さらに以下のように展開してみる
$task = [WindowsRuntimeSystemExtensions]::AsTask([Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector))
これはオーバーロードされているメソッドが見つからないというエラーになる。引数が実行時に型なしになるためだと思い、型指定をつけてみる
$task = [WindowsRuntimeSystemExtensions]::AsTask([Windows.Foundation.IAsyncOperation] [Windows.Devices.Enumeration.DeviceInformation]::FindAllAsync($selector))
これは Windows.Foundation.IAsyncOperation が存在しないと言われてエラーになる。
[Windows.Foundation.IAsyncOperation,Windows.Foundation,ContentType=WindowsRuntime]
を冒頭に足してみるが、ダメ。Foundation だから? わからないけどとにかくダメ。Add-Type とかしてみてもダメ。
結論:PowerShell とかクソ
他の方法
C# でラッパーを書いてロードすればなんとかなる。が、ビルトインの機能でなんとかしたくて PowerShell を使っているのであって、C# で書くなら全部C#で書くわハゲ