[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#で書くわハゲ

  1. トップ
  2. tech
  3. Windows PowerShell から Windows Runtime API を呼びたかった