// 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;
}
}
}