C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[40830] 키보드 전역 훅을 할려는데 잘 되지가 않네요.
error [] 1274 읽음    2005-06-30 18:51
안녕하세요.
장마 기간중인데도 비가 오지 않으니 좋군요. 바람도 시원하고.. 집에 쳐박혀서 -_- 코딩하기 딱 좋은 날씨군요.

다름이 아니라, 키보드 전역 훅을 해볼려고 테스트 코드를 작성 하였는데, 해당 어플리케이션이 포커스를 가지고 있을 때만 키입력을 감시를 하고, 그 외에는 동작을 하지 못하네요.

같은 코드를 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);
}


대체 어디가 잘 못 된것일까요?

+ -

관련 글 리스트
40830 키보드 전역 훅을 할려는데 잘 되지가 않네요. error 1274 2005/06/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.