■今週のゲーム制作:ウィンドウプロシージャとメモリアロケータ自作
今週は久しぶりにDXライブラリの中身を読んでいました。
前はちんぷんかんぷんだったんですけど前よりもプログラミングのスキルが少し上がったのか、何やってるのかが読める・・・・・・気がする!
自分のゲームには使わなそうな部分が結構あったので、試しに今までライブラリにやってもらっていたことを自分で作ってみることに。
というわけでまずはウィンドウプロシージャを作業していたんですが、DXライブラリが外部DLLを使用していて独特な実装だったので今週はそれをメモしておこうと思います。
まず、DXライブラリは外部DLLを使ってプロシージャをフックしているようです。
ただ、DLLファイルは外部に存在しません。
DLLのバイナリデータをDXライブラリのアーカイブ機能で圧縮したものを配列に入れておき(DxKeyHookBinary.cpp)、起動時に吐き出してDLLとして読み込むという仕様になっていました。
(ちなみにDLLはDxKeyHook.cをビルドしたものとのこと。)
個人的にはDLLを展開するのはロスかなーと思うんですが、DXライブラリを使うソフトにDLLをいちいちくっつけなくていいというのはライブラリ利用者からするとメリットが大きそうですね。
(圧縮されているので読み込み・デコードもそこまで時間はかからなそうです。(23/03/14追記))
話を戻そう!なんで外部DLLでわざわざフックするのか理由がわからずに調べていると↓のページのことのようです。
外部のDLLにプロシージャをフックすることで先に入力を奪って検知したくないキー入力を無かったことにしているようです~。
スッキリ。
低レベルキーボードフックについて調べてみると複数のキーボードを別々に処理できるようにするコードも見つけました↓
Combining Raw Input and keyboard Hook to selectively block input from multiple keyboards - CodeProjectキーボード入力はいと奥深しです。
というわけで今週も頑張りますぞ~!