ちょっと忙しくて全然触れなかったんですが余りに悔しいのでちょっと触ってみました。前回はまったく取れなかったんですがRegisterRawInputDevicesでconsumer controlsを追加することでWM_INPUTは飛んでくるようになりました。
その後入力を検証してみるがいまいち取得方法に自信が持てないので参考にするソースを探してみる。参考にできそうなソースがVB.NETであったのでC#でリライトしてみました。が、構造体の取得でエラー。
buffer = Marshal.AllocHGlobal(pcbSize)
GetRawInputData(m.LParam, RID_INPUT, buffer, pcbSize, Marshal.SizeOf(GetType(RAWINPUTHEADER)))
Dim raw As RAWINPUT
raw = CType(Marshal.PtrToStructure(buffer, GetType(RAWINPUT)), RAWINPUT)
というVBから
buffer = Marshal.AllocHGlobal(pcbSize);
GetRawInputData(m.LParam, RawInputCommand.Input,out buffer, ref pcbSize, Marshal.SizeOf(typeof(RAWINPUTHEADER)));
RAWINPUT raw;
raw = (RAWINPUT)Marshal.PtrToStructure(buffer, typeof(RAWINPUT));
というC#コードに変更してみたのだがMarshal.PtrToStructureのところで例外・・・。時間がないのでVBのまんまで続行。
キー入力の様子を見ると9bytesのデータが押しているキーに応じて押している間連続で飛んできている。その後キーを離すと9bytesの違う形のデータが4つのあとに9bytesの0が飛んできて終了。9bytesの0は終端だとして4つ来るデータはキーアップかな?まぁ、ナンにせよ押している間中飛んできているデータを捕捉すればよさそうなので適当に押してみて傾向を見てみる。
見ていると1byteが変わってるような感じだ。これがキーコードだろうか?先頭はキーアップ時と同じっぽいのだが念のため1byteだけ捨てて64bitデータとしてみてみると下位バイトが0x010000 ~ 0xXX0000のように変化している。
うし。んじゃこれを投げなおすだけだべ。
というわけで記憶を頼りにSendMessage(hWnd, WM_KEYDOWN, VK, IntPtr.Zero)してみるも応答無し。
調べてみるがなぜか到達しない。いろいろと情報をあさってみるがいまいちヒットせず。SendInputを使ったものが多いのでSendInputに変えてみることに。
が、応答無し。ターゲットをメモ帳にして見るもかわらず。(というかMessageが飛んでないっぽい・・・)
んむ~解決できそうだったのになぁ。もう暫くかかりそうです。