忍者ブログ
Comments
[03/30 のん]
TrackBack
Counter
blogRank
忍者ブログ [PR]
http://lresult.blog.shinobi.jp/
Borland C++ Builderを用いたWindowsプログラミングメモブログ

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

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

と、まぁこんな感じで。
ローカルフックなので、ほっとんど意味無し。
OnKeyPressイベントでイイんじゃないか、と。

PR
Comments
お名前
メールアドレス
パスワード
タイトル
コメント
TRACKBACK
TrackBack URL :
"LRESULT" WROTE ALL ARTICLES.
PRODUCED BY SHINOBI.JP @ SAMURAI FACTORY INC.