合宿の縛りであるところの「チームでPC1台」への対抗策としてキーボード毎にイベントの送り先ウィンドウを変えるマルチキーボード環境を作ろうと思った.適当な理由により OS は WinXP で使う言語は C# に固定.これができれば1台のPCで複数人が同時にプログラムを書けて力強い.仕組みとしては, Raw Input 使って入力デバイスの識別できるキー入力メッセージを取得し,そのメッセージを指定されたウィンドウにリダイレクすればうまく動きそう,と.
でも,実際に作ってみると調査不足のため二つほど問題が出てきて使い物になんかった.一つ目としては,Raw Input はフォーカスなしでもメッセージ取得できるのだが,このメッセージを潰すことができずにフォーカスを持ったウィンドウにメッセージが飛んでしまう.なので,リダイレクト先がフォーカスを持っているとキーが二重に入ってしまったりする.メッセージを潰す一つの手段として,Low-Level Keyboard をフックしてチェインをぶった切るというのがあるのだが,Low-Level のフックが RawInput の前に起こるのでこれはつかえない.C#だとこのフック以外はグローバルにできないのでこの時点で手詰まり.適当なウィドウを用意してそこにフォーカスを固定しておけば何とかなるけど… 美しくない.二つ目は致命的で, Shift/Alt/Ctrl の押下状態が全キーボードで共用となってしまうみたい.つまり,どれかでShiftを押しとくくと,全ウィンドウで Shift が押された状態になるらしい.キー入力メッセージの送信で修飾キーの情報を入れてないのが原因かもしれないけどなんとなく Windows が押下状態を管理している気がするのでどうにもならん気がする.もう少し試してみやうかな?
- Newer: AWK - はじめ