できること

  • マウスとかキーボードの操作をフックして、他の操作に入れ替えたり出来ます。

作り方

グローバルフックはDLLでないとダメなので、C++で作ります

  • DLLのプロジェクトを作る
  • DLLエントリポイントのDllMain?を追加
    ※ここでDLLインスタンスを保存しておきます
    HINSTANCE g_hDll = NULL;   //DLLのインスタンスハンドル
    
    BOOL WINAPI DllMain (HINSTANCE hInstance, DWORD ul_reason_for_call, LPVOID lpReserved)
    {
    	switch(ul_reason_for_call){
    		case DLL_PROCESS_ATTACH:
    			g_hDll=hInstance; 
    			break;
    		case DLL_THREAD_ATTACH:
    		case DLL_THREAD_DETACH:
    		case DLL_PROCESS_DETACH:
    			break;
    	}
        return  TRUE;
    }
  • フックをインストールするプロシージャ
    ※この例はマウス(LOW LEVEL)のフックをインストールします
     ここでインストールしたフックのハンドルを保存します
    HHOOK g_hHookMouseWnd = NULL;  //フックのハンドル
    //フックインストール
    DllExport void CALLBACK MouseHookInstall(void)
    {
    	if ( g_hDll == NULL ) return;
    	g_hHookMouseWnd = SetWindowsHookEx(WH_MOUSE_LL,(HOOKPROC)MouseProc, g_hDll, 0 );
    	if ( g_hHookMouseWnd == NULL){
    		MessageBox(NULL,"フック失敗","エラー",MB_OK | MB_TOPMOST);
    	} else {
    		MessageBox(NULL,"フック成功","成功",MB_OK | MB_TOPMOST);
    	}
    }
  • フックをアンインストールするプロシージャ
    ※フック解除のプロシージャです
     アプリケーション終了時に必ずフックを解除する必要があります
    // フックアンインストール
    DllExport void CALLBACK MouseHookUninstall(void)
    {
    	if ( g_hHookMouseWnd != NULL){
    		UnhookWindowsHookEx(g_hHookMouseWnd);
    	}
    		MessageBox(NULL,"フック解除","解除",MB_OK | MB_TOPMOST);
    }
  • フックプロシージャ
    ※nCodeが0未満なら、メッセージを処理せずにそのメッセージを CallNextHookEx? 関数へ渡し、その関数の戻り値を返さなければなりません
     また、最後にCallNextHookEx?で次のフックに移動する必要があります
    // マウスフックプロシージャ
    LRESULT CALLBACK MouseProc(int nCode,WPARAM wParam,LPARAM lParam)
    {
    	if (nCode < 0 || nCode == HC_NOREMOVE ) { return CallNextHookEx(g_hHookMouseWnd, nCode, wParam, lParam); }
    		
    	MSLLHOOKSTRUCT  * lp = (MSLLHOOKSTRUCT  *)lParam;
    
    	if( nCode == HC_ACTION ){
    		switch (wParam){
    			case WM_XBUTTONDOWN:
     				//この辺に処理を書く
    			}
    				break;
    		}
    	}
    
    	return CallNextHookEx(g_hHookMouseWnd, nCode, wParam, lParam); //次のフックを呼ぶ
    }
  • インストールとアンインストールのプロシージャをexport
    ※DEFファイルを作ります。LIBRARYにDLL名の.dllを除いた名称、EXPORTS以下にexportする関数名を並べます
    LIBRARY	TestWinHook
    EXPORTS
      MouseHookInstall
      MouseHookUninstall

使い方

  • 上で作ったDLLのインストール関数(MouseHookInstall?)を呼ぶと、フックがインストールされます
  • 上で作ったDLLのアンインストール関数(MouseHookUninstall?)を呼ぶと、フックがアンインストールされます
C++関連
(books)


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: Thu, 12 Nov 2009 23:24:00 JST (2836d)