グローバルキーフックについて

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
BP
記事: 11
登録日時: 8年前

グローバルキーフックについて

#1

投稿記事 by BP » 7年前

こんばんは。
グローバルキーフックのついたアプリケーションを作ろうとこちらのサイトのプログラムを書いてみました。
http://fa11enprince.hatenablog.com/entr ... /10/051454
キーを押すとメッセージボックスを出すことには成功しましたがメッセージボックスを消した後にそのキーが押されたのと同じ反応が起こってしまいます。
例として、WINキーを押すとメニューが表示されてしまいます。
キーを押すとそのキーが完全に無効化されるようにしたいのですがどのようにすればよいでしょうか?

開発環境はWindows10、VisualStudio2015です。

あんどーなつ
記事: 171
登録日時: 7年前
連絡を取る:

Re: グローバルキーフックについて

#2

投稿記事 by あんどーなつ » 7年前

どうしてグローバルキーフックの方法を知りたいと思ったのですか?

BP
記事: 11
登録日時: 8年前

Re: グローバルキーフックについて

#3

投稿記事 by BP » 7年前

アプリケーション選択画面からアプリを選ぶと起動するランチャーを制作したいと考えています。
そこで、使う予定のないWindowsキーとALTキーをロックしたいです。

一つのアプリケーションにキーフックとランチャーをまとめる必要はなく、キーフック単体でのアプリケーションでもかまわないためキーフックについてのみ質問させていただきました。

YuO
記事: 947
登録日時: 13年前
住所: 東京都世田谷区

Re: グローバルキーフックについて

#4

投稿記事 by YuO » 7年前

フックまわりは詳しくないですが……。

CallNextHookExを呼べば,それはそのままシステム既定の処理まで辿り着くのは想像が付きます。
で,MSDNを読むと,処理をして後続の処理を断ちたい場合は非0を返せ,とあります。
KeyboardProc callback function さんが書きました:If the hook procedure processed the message, it may return a nonzero value to prevent the system from passing the message to the rest of the hook chain or the target window procedure.
なので,処理をした場合はCallNextHookExを呼ばずに0以外の値を返してみてはどうでしょうか。
refs)
CallNextHookEx function
KeyboardProc callback function

BP
記事: 11
登録日時: 8年前

Re: グローバルキーフックについて

#5

投稿記事 by BP » 7年前

試しにGlobalHookDll.cpp内の KeyHookProc関数においてreturn1を追加したところALTキーのキーフックが成功しました!
ありがとうございます!

ただ、WINキー、それとALT + TABキーによるタスク切り替えが防がれないのは仕様なのでしょうか?
もしお分わかりでしたら教えて頂きたいです。

sleep

Re: グローバルキーフックについて

#6

投稿記事 by sleep » 7年前

WH_KEYBOARDではなく、WH_KEYBOARD_LLを使用してください。

コード:

hKeyHook = SetWindowsHookEx(WH_KEYBOARD_LL, KeyHookProc, hInst, 0);

コード:

EXPORT_API_ LRESULT CALLBACK KeyHookProc(int nCode, WPARAM wp, LPARAM lp)
{
	if (nCode == HC_ACTION)
	{
		KBDLLHOOKSTRUCT*pKBHS = (KBDLLHOOKSTRUCT*)lp;
		if (pKBHS->vkCode == 91                                //左Windowsキー
		|| pKBHS->vkCode == 92                                 //右Windowsキー
		|| (pKBHS->flags == 32 && pKBHS->vkCode == 9)          //左右Alt+Tab
		|| (pKBHS->flags == 160 && pKBHS->vkCode == 9)	       //左右Alt+Tab
		|| pKBHS->vkCode == 164                                //左Alt
		|| pKBHS->vkCode == 165                                //右Alt
		) return TRUE;//100ms以内に0以外を返すと無効になる
	}

	return CallNextHookEx(hKeyHook, nCode, wp, lp);
}

BP
記事: 11
登録日時: 8年前

Re: グローバルキーフックについて

#7

投稿記事 by BP » 7年前

無事無効化できました!
ありがとうございます!

閉鎖

“C言語何でも質問掲示板” へ戻る