BCB Client

- C++ Builderを用いたWindowsプログラミングメモ -

SetWindowsHookEx [キーボードのローカルフック]

キーボードのローカルフックを試してみる。
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("フック解除は失敗しました");
    }
}
//---------------------------------------------------------------------------


と、まぁこんな感じで。
ローカルフックなので、あんま意味無し?
次はようやくグローバルフック。

[ トップ | 一覧 | 前へ | 次へ ]

  • トップ
  • 一覧
  • リンク
  • 掲示板

Copyright © BCB Client. All Rights Reserved. Template by ネットマニア