|
안녕하세요.
장마 기간중인데도 비가 오지 않으니 좋군요. 바람도 시원하고.. 집에 쳐박혀서 -_- 코딩하기 딱 좋은 날씨군요.
다름이 아니라, 키보드 전역 훅을 해볼려고 테스트 코드를 작성 하였는데, 해당 어플리케이션이 포커스를 가지고 있을 때만 키입력을 감시를 하고, 그 외에는 동작을 하지 못하네요.
같은 코드를 VC++로 작성을 할 경우에는 올바르게 동작을 하는 것 같은데, 빌더6으로 작성을 하니, 제가 뭔가 실수를 했거나 빠뜨린 부분이 있는지... 전역 훅이 올바르게 되지 않았던 것 같습니다.
아래의 코드가 전부입니다.
HookDll.cpp----------------------------------------------------------------------------
#include <windows.h>
#define EXPORT extern "C" __export __stdcall
//---------------------------------------------------------------------------
EXPORT BOOL SetHook( HWND hWnd ) ;
EXPORT BOOL RemoveHook() ;
#pragma argsused
#pragma data_seg(".SHARDATA")
static HINSTANCE hDll = NULL; //dll 핸들
static HHOOK hHook = NULL; //훅 핸들
static HWND hCallerApp = NULL; //이 dll을 호출한 app의 핸들
#pragma data_seg()
#pragma comment(linker, "/SECTION:.shared,RWS")
//---------------------------------------------------------------------------
BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved)
{
switch (fwdreason)
{
case DLL_PROCESS_ATTACH:
hDll = (HINSTANCE)hinstDLL; // Save Dll Handle
break;
case DLL_PROCESS_DETACH:
RemoveHook();
break;
}
return TRUE;
}
//---------------------------------------------------------------------------
LRESULT CALLBACK getMsgProc( int nCode, WPARAM wp, LPARAM lp)
{
long msgTemp;
if(nCode >= 0)
{
msgTemp = ((MSG*)lp)->message;
if(msgTemp == WM_CHAR)
{
SendMessage( hCallerApp, WM_USER, 0, ((MSG*)lp)->wParam);
} else if(msgTemp == WM_PAINT)
{
SendMessage( hCallerApp, WM_USER + 1, 0, ((MSG*)lp)->wParam);
}
}
return CallNextHookEx( NULL, nCode, wp, lp );
}
//---------------------------------------------------------------------------
EXPORT BOOL SetHook( HWND hWnd )
{
if(hHook != NULL) return false;
hCallerApp = hWnd ; // Set Hook Server
hHook = SetWindowsHookEx( WH_GETMESSAGE , (HOOKPROC)getMsgProc, hDll , 0 ) ;
return true ;
}
//---------------------------------------------------------------------------
EXPORT BOOL RemoveHook()
{
UnhookWindowsHookEx( hHook );
hHook = NULL;
return false;
}
//---------------------------------------------------------------------------
여기서부터는 위의 DLL을 호출하는 어플리케이션 입니다.
Main.h-----------------------------------------------------------------------
class TForm1 : public TForm
{
__published: // IDE-managed Components
TMemo *Memo1;
TButton *Button1;
void __fastcall Button1Click(TObject *Sender);
void __fastcall FormDeactivate(TObject *Sender);
private: // User declarations
HINSTANCE hDll;
HHOOK hKeyHook;
void procKeyMsg(TMessage &msg);
void (__stdcall *setHook)(HWND hWnd);
void (__stdcall *removeHook)();
void (__stdcall *hookProc)();
public: // User declarations
__fastcall TForm1(TComponent* Owner);
BEGIN_MESSAGE_MAP
MESSAGE_HANDLER(WM_USER, TMessage, procKeyMsg)
END_MESSAGE_MAP(TForm)
};
//-----------------------------------------------------------------------------
main.cpp----------------------------------------------------------------------
void __fastcall TForm1::Button1Click(TObject *Sender)
{
hDll = LoadLibrary("hookDll.dll");
setHook = (void (__stdcall*)(HWND hWnd))GetProcAddress(hDll, "SetHook");
removeHook = (void (__stdcall*)()) GetProcAddress(hDll, "RemoveHook");
hookProc = (void (__stdcall*)()) GetProcAddress(hDll, "KeyboardProcedure");
// hKeyHook = SetWindowsHookEx(WH_GETMESSAGE, (HOOKPROC)hookProc, hDll, 0);
setHook(this->Handle);
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormDeactivate(TObject *Sender)
{
// UnhookWindowsHookEx( hKeyHook);
removeHook();
FreeLibrary(hDll);
}
//---------------------------------------------------------------------------
void TForm1::procKeyMsg(TMessage &msg)
{
Memo1->Lines->Add(msg.LParam);
}
대체 어디가 잘 못 된것일까요?
|