最後に、WindowsAPI触るのは初めてなのでどういったAPIを使えば良いかやどのサイトが調べるときにオススメかといった情報もいただけると幸いです。(4)
先にこちら から回答しますが、こういったユーティリティはおそらく「グローバルフック」という機能を使って実装していると思われます。グローバルフックを使ってフックチェーンというフックをかけたいアプリが並んだ行列みたいなところに自作のアプリを登録すると、全てのアプリケーションのキーボードイベントやマウスイベントのメッセージが取得できます。
「グローバルフック」で検索すれば、詳しく解説されているサイトを見つけることが可能だと思います。
ただ、グローバルフックではキー入力の検知と、そのキー入力がなかったことにする、ということはできますが、後続のフックチェーンに違うキーが入力されたという情報を渡すことはできません。一旦、キー入力をなかったことにして、改めてプログラム的に目的のキーが入力されたようなメッセージを送ることになります。
それと、グローバルフックは自作のアプリケーションだけでなく、システム全体に影響する機能ですので、デバッグ中に一つ間違えるとOSごと再起動しなければいけなくなるような代物であることに気を付けてください。
WindowsのGUIかつ常駐ソフトなので、C++のMFCかC#のWindows Formsあたりになると思うのですが、.NETだとできないこととかありますでしょうか?(1)
Microsoft公式には.NETではグローバルフックをサポートしていないそうなのですが、すでに.NETでのグローバルフックのクラスライブラリを公開されている方もおられます(ただし、フックできる機能に制約があるみたいです)。「グローバルフック .NET」で検索してみることをお勧めします。
また、いまあるキーボードユーティリティソフトだと 一部のソフト(DirectX使ってるネトゲやVBoxなど)では無効になってしまい本来のキーボードのボタンが反応しています。
こういうのにも対処したいんですが、キーボードの入力を受け取る順番の優先度はどんな仕組みになっているのか、作ったソフトを最上位に持ってくることができるかのかを知りたいです。(2)
優先度については難しいところです。フックチェーンの先頭から順番にマウスやキーボードのメッセージが渡されますが、これは単に早いもの順で登録されていたと思います。
また、DirectXについてはDirectInputというまた別の仕組みでキーボード入力を取得しているようですので、グローバルフックでどこまで食い込ませることができるのかは、ちょっと調べきれませんでした。
できればキーボードだけでなくマウスも使えるようにして Ctrl-Shift-ホイールボタンといった組み合わせでも任意のキーを出力できるようにしたいのですができるのでしょうか?(3)
マウスのメッセージをフックすればその時に押されているCtrlとShiftについては状態が取得できますので、このメッセージをなかったことにして、別のキー入力メッセージを送ればいいと思います。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2015/10/31 03:36
2015/11/01 04:21
2015/11/01 05:03
2015/11/02 12:05