ページ 11

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

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

開発環境はWindows10、VisualStudio2015です。

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

Posted: 2016年11月14日(月) 22:14
by あんどーなつ
どうしてグローバルキーフックの方法を知りたいと思ったのですか?

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

Posted: 2016年11月14日(月) 22:57
by BP
アプリケーション選択画面からアプリを選ぶと起動するランチャーを制作したいと考えています。
そこで、使う予定のないWindowsキーとALTキーをロックしたいです。

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

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

Posted: 2016年11月14日(月) 23:07
by YuO
フックまわりは詳しくないですが……。

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

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

Posted: 2016年11月14日(月) 23:48
by BP
試しにGlobalHookDll.cpp内の KeyHookProc関数においてreturn1を追加したところALTキーのキーフックが成功しました!
ありがとうございます!

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

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

Posted: 2016年11月15日(火) 00:32
by sleep
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);
}

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

Posted: 2016年11月15日(火) 10:48
by BP
無事無効化できました!
ありがとうございます!