2014.8.30
INASOFT
/トップ/F1ブレイカー ダウンロード/WebHelp/ヘルプトップ
動作原理
1.キーボードフックの動作原理
このプログラムは、Windows APIの SetWindowsHookEx() と UnhookWindowsHookEx() を使い、キーボードメッセージをフックすることにより、特定のキーの排除を行っています。
大まかには、下記の図のようになっています。

キーボードメッセージのフックを行うためには、SetWindowsHookEx() API に WH_KEYBOARD 定数を与えて呼び出します。この際、フック時に呼び出したい関数へのアドレスを渡します。
ただし、キーボードフックは、Windows上で動作するすべてのアプリケーションに対して行わなければなりません。そのため、引数 dwThreadId には 0 を指定し、引数 hMod には、フックを行うプロシージャが格納されたDLLのモジュールハンドルを指定してやることになります。
これは、次の図のように、DLLの共有の原理を利用して、フックを行うためです。

2.情報共有のための仕組み
DLLは色々なプロセスで共有して動作します。Windowsでは、プロセス間におけるメモリの独立性が保証されており、例えば Notepad.exe(メモ帳) 内における 0x11223344 というアドレスと、Explorer.exe(エクスプローラ)内における 0x11223344 というアドレスは、実際には別の物理メモリを指し示していることになります。DLLはプログラムのコードの共有はしていますが、作業用のメモリの内容までは共有しません。別の言い方をすれば、メモ帳にてメモリ内に保持しているデータは、エクスプローラから見ることはできませんし、その逆もできないことになります。
これは当然、F1ブレイカーとメモ帳の間、F1ブレイカーとエクスプローラとの間にも言えることです。F1ブレイカーは、どのキーをブロックすべきかとか、どのプログラムについてブロックを除外すべきか等の情報を保持していますが、メモ帳やエクスプローラから、この情報を見ることはできません。
これはマルチプロセスの独立性からは良いことなのですが、逆に言うと、これらの間で情報を共有したい場合に、うまくいかないことになります。メモ帳やエクスプローラから呼び出される F1BREAK.DLL であっても、これは変わりません。
メモ帳やエクスプローラからキーボードのブロックのために呼び出された F1BREAK.DLL は、F1BREAK.EXEから呼び出した F1BREAK.DLL が保持している、情報(どのキーをブロックすべきかとか、どのプログラムについてブロックを除外すべきか等)を参照することはできないのです。
そこで、F1ブレイカーでは、「#pragma data_seg」というキーワードを使うことにより、各プロセスから呼び出されるすべてのF1BREAK.DLL間で、情報の共有ができるようにしています。
#include "stdafx.h" #include "f1breakdll.h" #include "EnumProcs.h" HHOOK hHookKeyboardProc = 0; HANDLE hModule = 0; // 以下、環境内で共有するグローバル変数 // 環境内で共有するグローバル変数には、必ず初期値を与える! #pragma data_seg(".sh_data") HWND hMainWnd = 0; unsigned char BlockedKeyCode[256*HKK_NUM] = {0}; char szEnableProgramFiles[JOGAI_LEN] = {0}; #pragma data_seg() // リンカに対し、.sh_data を読み書き共用とするように指示 #pragma comment(linker, "/SECTION:.sh_data,RWS") BOOL APIENTRY DllMain( HANDLE hMod, DWORD dwReason, LPVOID reserved) { : :
目次へ
※このページは、ソフトウェアに付属のヘルプファイルをWeb用に再構築したものです。大部分に自動変換を施しているため、一部は正しく変換しきれずに表示の乱れている箇所があるかもしれませんが、ご容赦下さい。また、本ドキュメントはアーカイブドキュメントであり、内容は、右上の作成日付の時点のものとなっております。一部、内容が古くなっている箇所があるかと思いますが、あらかじめご了承下さい。
※このページへは、自由にリンクしていただいてかまいません。
このページに関するご意見の受け付けは終了しています。