ここから本文です

C#コンソールアプリケーションでキーボードのフックができない http://keyboardmo...

sas********さん

2014/5/203:27:55

C#コンソールアプリケーションでキーボードのフックができない
http://keyboardmousehooks.codeplex.com/
こちらのライブラリのKeyboardHook.csをプロジェクトに追加し、

以下のようなコードを記入して実行しましたが、キーが表示されません。
加えて、キーを押した瞬間に5秒ほどキーの入力が受け付けられなくなります。
どうすれば無事にフックすることが出来るようになるのでしょうか。

using System;

namespace KeyboardHookTest
{
class Program
{
private static RamGecTools.KeyboardHook keyboardHook = new RamGecTools.KeyboardHook();

static void Main(string[] args)
{
keyboardHook.KeyDown += new RamGecTools.KeyboardHook.KeyboardHookCallback(keyboardHook_KeyDown);
keyboardHook.Install();

Console.ReadKey();
keyboardHook.Uninstall();
}
private static void keyboardHook_KeyDown(RamGecTools.KeyboardHook.VKeys key)
{
Console.WriteLine(key.ToString());
}

}
}

補足ホスティングプロセスを無効にしても、exeを直接実行しても変化がありませんでした。
他のサイトの見よう見まねでApplication.Run();の一行を追加したところ、
何故かフックされるようになりました。
MSDNには「現在のスレッドで標準のアプリケーション メッセージ ループの実行を開始します。」と解説がありましたが、まだ理解できていません。

閲覧数:
1,009
回答数:
1
お礼:
100枚

違反報告

ベストアンサーに選ばれた回答

編集あり2014/5/411:07:40

デバッグ実行時にうまくいかない(コマンドラインから直接exeを実行した場合は問題ない)のであれば、プロジェクトのプロパティのデバッグタブの
「Visual Studio ホスティング プロセスを有効にする」
のチェックを外すといいかも。


追記
あぁ、そういうことだったのね。
メッセージループというのは Windows アプリケーション ( コンソールアプリケーションではない ) がキー入力やマウスクリックなどに応答するようにするためにもので、具体的には↓の While のループのこと。
http://wisdom.sakura.ne.jp/system/winapi/win32/win9.html
フォームアプリケーションも、表には現れないけどメッセージループの動作が組み込まれてるんだろうね。
結論を言うと、KeyboardHook.cs が使っている SetWindowsHookEx という Windows API は、メッセージループを持っているアプリケーションに対してのみ有効、ということなんだと思う。

質問した人からのコメント

2014/5/5 04:41:42

降参 Windowsアプリケーションの動作の仕組みにもっと詳しくならないとと思いました。

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる