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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

Q&A

解決済

2回答

5364閲覧

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

lazex

総合スコア604

Win32 API

Win32 APIはMicrosoft Windowsの32bitプロセッサのOSで動作するAPIです。

0グッド

1クリップ

投稿2015/10/30 11:46

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

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

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

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

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

以上よろしくお願いします。

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

最後に、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/30 15:42

編集2015/10/30 15:47
KoichiSugiyama

総合スコア3041

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

daive

2015/10/31 03:36

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

2015/11/01 04: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してみても何を見ればいいのかがわからなかったです。
KoichiSugiyama

2015/11/01 05:03

DLLの作り方によりますが、Win32APIのように外部からのインターフェースを関数ベースにすれば、割と柔軟にいろいろな言語から呼び出せたと思います。 DirectInputについてはMSDNに解説がありました。 https://msdn.microsoft.com/ja-jp/library/bb206292(v=vs.85).aspx このサイトによると、どうもデバイスドライバ経由で直接動作しているようで、Windowsメッセージは無視されているようです。なので、グローバルフックを使ってもキー入力の変更はできそうにありません。 exeファイルから素性を探る、というのは可能かもしれないですが、かなり専門的な知識が必要になると思います。ちょっと私もどうやっていいか見当がつきません。お役にたてず申し訳ないですがこんなところです。
lazex

2015/11/02 12:05

遅くなってすみません。 回答有り難うございます。 教えていただいたことをヒントに自分でももう少し調べてみます。 ありがとうございました。
guest

0

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

投稿2015/10/30 12:14

Orlofsky

総合スコア16415

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

lazex

2015/10/30 12:21

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問