キーボードのローカルフックを試してみる。
HookStartBtnを押し、フックが成功したら[0]キーか[F2]キーを押して
メッセージを受け取れていることを確認するコード
その後、きちんとHookStopBtnを押してフックを解除してやります。
※フック関数や、用語についてはこちらにまとめてます。
・Form上にButtonコンポーネントの"HookStartBtn"と"HookStopBtn"を配置し
表示用のEditコンポーネントも配置してから..
<Unit1.cpp>
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
// 宣言
HHOOK g_hHook; // フックハンドル
// フックプロシージャ: この関数内でパラメータを処理する
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
// フックを開始する
void __fastcall TForm1::HookStartBtnClick(TObject *Sender)
{
HINSTANCE hInst;
// アプリケーションのインスタンスハンドルを取得
hInst = (HINSTANCE)GetWindowLong(Handle, GWL_HINSTANCE);
// フックをインストールします
g_hHook = SetWindowsHookEx(WH_KEYBOARD, // 今回はキーボード。
(HOOKPROC)KeyboardProc, // 処理するための関数
hInst, // インスタンスのハンドル
0); // スレッドのID
if ( g_hHook == NULL ){
ShowMessage("フック開始は失敗しました");
}
else{
ShowMessage("フック開始は成功しました");
}
}
//---------------------------------------------------------------------------
// フックを処理する
LRESULT CALLBACK KeyboardProc(int code, WPARAM wParam, LPARAM lParam)
{
// MSDNには...
// > codeパラメータの値が0未満の場合、フックプロシージャは、
// > それ以上メッセージを処理せず、CallNextHookEx関数にメッセージを渡し、
// > その関数の戻り値を返さなければなりません。
// とあるので返してやります。
if ( code < 0 ){
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
// 今回は試しにキーボードの[0]と[F2]の押下を確認してみます
if ( wParam == 0x30 ){
Form1->Edit1->Text = "0押した!";
}
else if ( wParam == VK_F2 ){
Form1->Edit1->Text = "F2押した!";
}
// MSDNには...
// > codeパラメータの値が0以上かつ、フックプロシージャで
// > メッセージを処理しなかったときは、CallNextHookEx関数を呼び出し、
// > その関数の戻り値を返すことを強く推奨します
// と、、あるので素直に返してやります。
return CallNextHookEx(g_hHook, code, wParam, lParam);
}
//---------------------------------------------------------------------------
// フックを停止する
void __fastcall TForm1::HookStopBtnClick(TObject *Sender)
{
BOOL bResult;
bResult = UnhookWindowsHookEx(g_hHook);
if ( bResult != 0 ){
ShowMessage("フック解除は成功しました");
}
else{
ShowMessage("フック解除は失敗しました");
}
}
//---------------------------------------------------------------------------
と、まぁこんな感じで。
ローカルフックなので、あんま意味無し?
次はようやくグローバルフック。