○特定のキーボードのキーを使用不能にする

■通常のキーのフック----------------------------------------------------

注)この方法では、
数字 文字 DLL BS TAB Enter F1〜 などのキーを使用不能にすることはできますが
WindowsキーやCTRL+ALT+DLLを使用不能にすることはできません(次の次の項)
Windowsキーを使用不能にするには低レベルなキーフックが必要です(次の項)

@キーボードフックを作成してください。
キーボードフック

Aフックプロシージャ―にて
0以外の数字を返すとそのキーが入力されなくなります。


TABキーの無効化
TABキーが総てのアプリケーションで無効になります。

LRESULT CALLBACK HookProc(int nCode, WPARAM wp, LPARAM lp)
{
	if(wp==9){//TABキー
		return TRUE;//0以外の値を渡すと無効化される
	}else{
		return CallNextHookEx(hHook, nCode, wp, lp);
	}
}


CTRLキーの無効化
CTRLキーは自アプリケーションにしか効果がありません。
他のアプリケーションも無効にする場合は次の項の低レベルなキーフックを見てください
ほとんどフック部分の内容はこのままで低レベルなキーフックでも動作します。

LRESULT CALLBACK HookProc(int nCode, WPARAM wp, LPARAM lp)
{
	if(GetAsyncKeyState (VK_CONTROL)){//CTRLキー
		return TRUE;//0以外の値を渡すと無効化される
	}else{
		return CallNextHookEx(hHook, nCode, wp, lp);
	}
}


■低レベルなキーフック------------------------------------------------

Windows95,98,MEでは動作しません、システムフックを行います
▽Windowsキーを使用不能にします。
CTRL+ALT+DLLを使用不能にすることは出来ません(次の項)


#define _WIN32_WINNT 0x0400

#include <windows.h>

//注意 このDLLを呼び出すアプリケーションはメッセージループ
//が必ず必要です。つまりコンソールアプリケーションからは動作しません

HINSTANCE hInst;
HHOOK hHook;

LRESULT CALLBACK HookProc(int nCode, WPARAM wp, LPARAM lp)
{
	if(nCode==HC_ACTION){
		KBDLLHOOKSTRUCT*pK = (KBDLLHOOKSTRUCT*)lp;
		//91 : 左Windowsキー  92 : 右Windowsキー
		if(pK->vkCode==91 || pK->vkCode==92) return TRUE;//100ms以内に0以外を返すと無効になる
	}
	return CallNextHookEx(hHook, nCode, wp, lp);
}

extern "C" __declspec(dllexport) void HookStart()
{
	//低レベルなキーフックを指定
	hHook = SetWindowsHookEx(WH_KEYBOARD_LL, HookProc, hInst, 0);
}

extern "C" __declspec(dllexport) void HookEnd()
{
	UnhookWindowsHookEx(hHook);
}

BOOL APIENTRY DllMain(HINSTANCE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
	hInst=hModule;
	return TRUE;
}

■CTRL+ALT+DLLを無効にする----------------------------------------------------

▽Windows 95 98の場合

BOOL SystemParametersInfo(
  UINT uiAction,  // 取得または設定するべきシステムパラメータ
  UINT uiParam,   // 実施するべき操作によって異なる
  PVOID pvParam,  // 実施するべき操作によって異なる
  UINT fWinIni    // ユーザープロファイルの更新オプション
);

#define SPI_SCREENSAVERRUNNING 97

設定もしくは設定解除
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 1, NULL, 0)
SystemParametersInfo(SPI_SCREENSAVERRUNNING, 0, NULL, 0)

▽Windows NT 2000 XPの場合

GINA.DLL をカスタマイズします。
(次の次のページにあります)



▲トップページ > Windows と C++