2009.10.31 Saturday | 09:33

  SendMessage と PostMessage のフック ふるいむかし

こいつは dll である必要があります
// LboxHook.cpp : DLL アプリケーション用のエントリ ポイントを定義します。
//

#include "stdafx.h"
#include "LboxHook.h"
#include <lightbox.h>

HINSTANCE hInst;

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
					 )
{
    switch (ul_reason_for_call)
	{
		case DLL_PROCESS_ATTACH:
		case DLL_THREAD_ATTACH:
		case DLL_THREAD_DETACH:
		case DLL_PROCESS_DETACH:
			break;
    }
	
	hInst = (HINSTANCE)hModule;

    return TRUE;
}


// これはエクスポートされた変数の例です。
LBOXHOOK_API int nLboxHook=0;

// これはエクスポートされた関数の例です。
LBOXHOOK_API int fnLboxHook(void)
{
	return 42;
}

// これはエクスポートされたクラスのコンストラクタです。
// クラスの定義については LboxHook.h を参照してください。
CLboxHook::CLboxHook()
{ 
	return; 
}

// SendMessge のフックハンドル
static HHOOK hhk = NULL;
// PostMessge のフックハンドル
static HHOOK hhkPost = NULL;

// *********************************************************
// SendMessge のフック処理
// *********************************************************
LRESULT CALLBACK CallWndRetProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhk, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		CWPRETSTRUCT *msg;
		char szClass[512];
		char szTitle[512];

		msg = (CWPRETSTRUCT *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"SEND:WM_COMMAND:"
					"%lu:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
		CloseHandle(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}
// *********************************************************
// PostMessge のフック処理
// *********************************************************
LRESULT CALLBACK GetMsgProc(
  int nCode,
  WPARAM wParam,
  LPARAM lParam
)
{
	if ( nCode < 0 ) {
		return CallNextHookEx( hhkPost, nCode, wParam, lParam );
	}

	HANDLE hMutex;

	hMutex = OpenMutex(
		SYNCHRONIZE,
		false,
		"LboxHook"
	);
	if ( hMutex != NULL ) {
		WaitForSingleObject(hMutex, INFINITE);

		MSG *msg;
		char szClass[512];
		char szTitle[512];

		msg = (MSG *)lParam;
		if ( msg->message == WM_COMMAND ) {
			GetClassName( msg->hwnd, szClass, 512 );
			GetWindowText( msg->hwnd, szTitle, 512 );

			LboxInfo Info;
			LboxString LString;
			LboxTextFile Txt;

			Info.TempPath( &LString );
			LString.AddBackslash();
			LString.operator += ("LboxHook.log");

			if( Txt.AppendOpen( &LString ) ) {
				Info.Time( &LString );
				Txt.PutPrintf(
					"%s:"
					"POST:WM_COMMAND:"
					"%lu:%u:%u:%lu:%s:%s\n",
					LString.szLboxString,
					msg->hwnd,
					LOWORD(msg->wParam),
					HIWORD(msg->wParam),
					lParam,
					szClass,
					szTitle
				);
				Txt.Close();
			}

		}
		ReleaseMutex(hMutex);
		CloseHandle(hMutex);
	}

	return CallNextHookEx( hhk, nCode, wParam, lParam );

}

extern "C" { 
// *********************************************************
// システムフックのインストール
// *********************************************************
LBOXHOOK_API void Initialize( void )
{
	if ( hhk == NULL ) {
		// ミューテックス作成
		CreateMutex(
			NULL,
			false,
			"LboxHook"
		);

		// システムフックの実装
		hhk = SetWindowsHookEx(
			WH_CALLWNDPROCRET,
			CallWndRetProc,
			hInst,
			0				
		);
		hhkPost = SetWindowsHookEx(
			WH_GETMESSAGE,
			GetMsgProc,
			hInst,
			0				
		);
	}
}

// *********************************************************
// システムフック解放
// *********************************************************
LBOXHOOK_API void End( void )
{
	if ( hhk != NULL ) {
		UnhookWindowsHookEx( hhk );
		hhk = NULL;
	}
	if ( hhkPost != NULL ) {
		UnhookWindowsHookEx( hhkPost );
		hhkPost = NULL;
	}
}
}