質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.95%

キーボードユーティリティ作りたいと思ってます

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 3,861

score 602

キーボードユーティリティを作ろうと思ってます。
Numlockキーを無効にするとか、Deleteキーの位置を変えるとか、CapsLockを修飾キーにするとかそういうものです。

WindowsのGUIかつ常駐ソフトなので、C++のMFCかC#のWindows Formsあたりになると思うのですが、.NETだとできないこととかありますでしょうか?(1)

また、いまあるキーボードユーティリティソフトだと 一部のソフト(DirectX使ってるネトゲやVBoxなど)では無効になってしまい本来のキーボードのボタンが反応しています。
こういうのにも対処したいんですが、キーボードの入力を受け取る順番の優先度はどんな仕組みになっているのか、作ったソフトを最上位に持ってくることができるかのかを知りたいです。(2)

できればキーボードだけでなくマウスも使えるようにして Ctrl-Shift-ホイールボタンといった組み合わせでも任意のキーを出力できるようにしたいのですができるのでしょうか?(3)

最後に、WindowsAPI触るのは初めてなのでどういったAPIを使えば良いかやどのサイトが調べるときにオススメかといった情報もいただけると幸いです。(4)

以上よろしくお願いします。
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+2

最後に、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 12:36

    Document/UnDocumentのWindows 機能を使うには、
    それなりの能力と、努力が必要と書いてあるように受けます。私的には当然。
    Windows公開ソースを視る(見るではない)、理解する。
    簡単な想定では、ウィルスチェッカーとの競合、優先、イベントの継承他
    エコロジー、システムに介入するには、理解と検証が必須。

    キャンセル

  • 2015/11/01 13:21

    詳しい説明ありがとうございます。

    グローバルフックを使うんですね。
    しらべてみたのですが C++のほうが情報が多いですね。

    グローバルフックを使うにはdllを作る必要があると見たのですが、dllはC++で作ってC#で設定画面を作ってC++で作ったdllをロードするってできるんでしょうか?
    というのも、C#を使いたい理由はオプション画面などのウィンドウを手軽に作りたいからなんです。

    DirectInputは調べてみましたが、方法が書かれたページが見つけれなかったです。
    JoyToKeyなどのゲームでも動くソフトでは、DirectInputで入力を受け取っているというのを見かけましたが、それだとグローバルフックと両方処理しないといけないのか、DirectInputでのキー入力を改変はどうすればいいかはわかりませんでした。

    http://d.hatena.ne.jp/LM-7/20090614/1244980470
    ↑のサイトをみたところ、制限なく好きなことをできるようにするにはドライバレベルのものを作らないといけないようですが、例に挙げられているCapsLockの置き換えが署名のいらないソフトでも出来たような記憶があります。
    exeファイルからそのソフトがどのレベルで動いてるのか調べることって可能でしょうか?
    バイナリデータをstringsしてみても何を見ればいいのかがわからなかったです。

    キャンセル

  • 2015/11/01 14:03

    DLLの作り方によりますが、Win32APIのように外部からのインターフェースを関数ベースにすれば、割と柔軟にいろいろな言語から呼び出せたと思います。

    DirectInputについてはMSDNに解説がありました。
    https://msdn.microsoft.com/ja-jp/library/bb206292(v=vs.85).aspx
    このサイトによると、どうもデバイスドライバ経由で直接動作しているようで、Windowsメッセージは無視されているようです。なので、グローバルフックを使ってもキー入力の変更はできそうにありません。

    exeファイルから素性を探る、というのは可能かもしれないですが、かなり専門的な知識が必要になると思います。ちょっと私もどうやっていいか見当がつきません。お役にたてず申し訳ないですがこんなところです。

    キャンセル

  • 2015/11/02 21:05

    遅くなってすみません。
    回答有り難うございます。

    教えていただいたことをヒントに自分でももう少し調べてみます。
    ありがとうございました。

    キャンセル

0

わざわざ作らなくてもフリーソフトを使う手もあります。
http://www.vector.co.jp/vpack/filearea/win/util/operate/keyboard/

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/10/30 21:21

    回答有り難うございます。
    気に入ってたフリーソフトだと(2)の問題にあたるか、開発終了していてバグが残ってるかでした。
    マウスとの組み合わせや修飾キー複数組み合わせたり、登録しておいたキーを順番に出力など複雑なこともやりたいので、条件を満たせていて気に入るものは見当たりませんでした。。
    ちょうど常駐ソフト作ってみたかったのもあり、どうせなら自分で作ってみようと思い質問しました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.95%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る