たるきちのあれこれ









  Topプログラミングサンプル ▶ グローバルフック(HSP)

C#でのグローバルフックは不完全なものしか作成できなかったので、
HSP(HOT SOUP PROCESSOR)」でグローバルフックを実現するサンプルを掲載させていただきます。

つーさ様作の「KeyHook.dll」を使用させていただきます。
「KeyHook.dll」を実行ファイルと同じフォルダに置いて作成します。

サンプルは現場作業で、バーコードリーダーのみでコンピュータを操作することを想定したものです。
バーコードリーダーは読み取り後、「ENTER」を入力する設定にしています。

HSP 「KeyHook.hsp」

#ifndef khHook

#ifndef GetKeyName
#module
#uselib "user32.dll"
#func GetKeyNameText "GetKeyNameTextA" int,prefstr,int
#defcfunc GetKeyName int _lparam
GetKeyNameText _lparam, 64
return refstr
#global
#endif

#uselib "KeyHook.dll"
#func _khHook "_kh_hook@8" int, int
#define khHook(%1) oncmd gosub %1, $9313 : _khHook hWnd, $9313
#func khUnhook onexit "_kh_unhook@0"
#define khKeyCode wParam
#define khKeyName GetKeyName(lParam)
#define khStat (lParam >> 30 & 3)

#endif


HSP 「MonitorBarCode.hsp」

#include "keyhook.hsp"
    // フックをセット
    khHook *onKeyHook
    if stat = 0 : dialog "フック失敗" : end
    // 初期設定
    title "MonitorBarCode"
    screen 0 , 290 , 20 , 4 + 8
    width ,, ginfo_dispx - 400 , 10
    mes "このウインドウは閉じないでください。"
    strBarCode = ""
    stop

*onKeyHook
    if khStat = 0 {
        // コード(/-3-6-9-)が入力されたらバーコード入力ソフトを起動
        if (strBarCode = "-3-6-9-") & (khKeyName = "Enter") {
            exec dir_exe + "\\InputBarCode.exe"
            return 1 // バーコードリーダから入力される'Enter'をキャンセル
        }
        strBarCode = strBarCode + khKeyName
        // '/'が押されたらキーバッファをクリア
        if khKeyName = "/" : strBarCode = ""
        // 'Caps Lock'が押されたらキーバッファをクリア
        if khKeyName = "Caps Lock" : strBarCode = ""
        // 'Enter'が押されたらキーバッファをクリア
        if khKeyName = "Enter" : strBarCode = ""
        // 'Shift'が押されたらキーバッファをクリア
        if khKeyName = "Shift" : strBarCode = ""
    }
    return