Microsoft MVP성태의 닷넷 이야기
글쓴 사람
창민 (changminoh at hotmail.com)
홈페이지
첨부 파일
[TESTP.zip]    

단순 후킹 처리 부분에서 에러가 걸렸습니다.
원인을 찾아내지 못해서 해매고 있습니다.

델파이 단순 T스트링그리드에서 데이터만 추출하는 것입니다.


버튼을 누르면 그리드에서

    1 2 3 4
    5 6 7 8
    9 10 11 12

이렇게 되어 있는 그리드에서 데이터를 추출하기만 하는데..
노력해도 문제 해결 기미가 안보여서 답답해서.. 이렇게 올려 봅니다. 혹시 아시면
문제점이 무엇인지 .. 좀 받아볼수 없을까 해서요..

MFC 어플을 하나 만들고요..
그안에
#pragma comment(lib, "../TEST/LHHOOK/Debug/LHHOOK.lib")

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

//extern "C" __declspec(dllexport) void SetHook (HWND hWnd);
extern "C" __declspec(dllexport) void SetHook (HWND hWnd,HWND hWnd1);
extern "C" __declspec(dllexport) void KillHook();
HHOOK hKBHook;
헤더에.. 참조

버튼 이벤트에

void CTESTDlg::OnBnClickedOk()
{
    
    CWnd* lpFindWnd = NULL;
    CWnd* lpFindWnd1 = NULL;
    HINSTANCE hIns = LoadLibrary( "LHHOOK.dll" );

     lpFindWnd = FindWindowEx(NULL,NULL,"TForm1",NULL);
    if (lpFindWnd == NULL){
            ::MessageBox(NULL,"TForm1핸들을 찾을수 없습니다.","핸들",MB_OK);
    }

    lpFindWnd1 = FindWindowEx(lpFindWnd->m_hWnd,NULL,"TStringGrid",NULL);
    if (lpFindWnd == NULL){
            ::MessageBox(NULL,"TStringGrid핸들을 찾을수 없습니다.","핸들",MB_OK);
    }
    SetHook(lpFindWnd1->m_hWnd,::GetDlgItem(this->m_hWnd,IDC_LIST1));

}


이렇게 했습니다.

동적 DLL에는

#include "windows.h"
#include "malloc.h"
#include "string.h"


#pragma data_seg("HookProc")

  HWND hLBox = NULL;    
  HWND hLBox1 = NULL;    
  HINSTANCE hInDll;    
  HHOOK hKBHook = NULL;    
#pragma data_seg()
#pragma comment(linker, "/SECTION:HookProc,RWS")//linker directive

  
char TempBuf[200];
LRESULT CALLBACK KBHookProc(int nCode, WPARAM wParam, LPARAM lParam);

BOOL APIENTRY DllMain( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{

    switch (ul_reason_for_call) {
    case DLL_PROCESS_ATTACH:
        hInDll = hModule;
        break;
    case DLL_PROCESS_DETACH:
        break;
    }

    return TRUE;
}

// 시스템 전역적으로 후킹시
//extern "C" __declspec(dllexport) void SetHook (HWND hWnd)
////extern "C" __declspec(dllexport) void SetHook (HWND hWnd,HWND hWnd1)
//{
//     // hLBox1 = hWnd;
//     hLBox =hWnd;    
//
//    //unsigned long pid;
//    //GetWindowThreadProcessId(hLBox, &pid);
//
//    hKBHook = SetWindowsHookEx( WH_KEYBOARD,KHookProc, hInDll, NULL);
//    //hKBHook = SetWindowsHookEx( WH_GETMESSAGE, KHookProc, hInDll,NULL);
//    if(hKBHook==NULL) {
//        MessageBox(NULL,"잡지 못했습니다.","Error!",MB_OK);
//    }
//
//
//}


extern "C" __declspec(dllexport) void SetHook(HWND hWnd,HWND hWnd1)
{
      hLBox1 = hWnd1;
      hLBox = hWnd;    

    unsigned long pid;
    GetWindowThreadProcessId(hLBox, &pid);
    hKBHook = SetWindowsHookEx( WH_GETMESSAGE, KBHookProc, hInDll, pid);

    if(hKBHook==NULL)
        MessageBox(NULL,"Unable to install hKBHook","Error!",MB_OK);
}

extern "C" __declspec(dllexport) void KillHook()
{
    UnhookWindowsHookEx(hKBHook);
}

// LRESULT CALLBACK KHookProc(int nCode, WPARAM wParam, LPARAM lParam)
//{
//
//    
//        //LPMSG pMsg=(LPMSG)lParam;
//        //if(pMsg->message == WM_USER+44032)
//        //{
//        //    wsprintf(TempBuf,"데이터: %s", wParam);
//        //    SendMessage ( hLBox1 , LB_ADDSTRING, 0, (LPARAM) TempBuf);
//        //
//        //}
//
//    if( nCode >= 0 )
//    {
//        // 눌렸을때만 나온다.
//        if ( ( lParam & 0x80000000 ) ) {
//            wsprintf (TempBuf, "현재의 문자는 %c 입니다.", wParam);
//
//            SendMessage (hLBox1, LB_ADDSTRING, 0, (LPARAM) TempBuf);
//        }
//    }
//    
//
//    return CallNextHookEx( hKBHook, nCode, wParam, lParam );
//}
//

LRESULT CALLBACK KBHookProc (int nCode, WPARAM wParam, LPARAM lParam)
{
    LPMSG pMsg=(LPMSG)lParam;
    //if(pMsg->message == WM_USER+44032) {
    if(pMsg->message ==WM_USER+44032) {
            wsprintf (TempBuf, "%s", lParam);
            SendMessage (hLBox1, LB_ADDSTRING, 0, (LPARAM) TempBuf);

    }
    return CallNextHookEx( hKBHook, nCode, wParam, lParam );
}


MFC 에서는 dll를 구동하고
현재 델파이에 그리드가 뿌려지기 전에 데이터를 받아오려는데..

SPY로 봤을때는 WM_USER+44032이벤트에서 뿌려지는거 같습니다.
그래서 그 이벤트를 잡아서 나온 데이터를 MFC리스트에 전달하는건인데..
나름대로 계속 해보는데 기미가 안보여서.. 혹시 원치 않으시면 삭제하셔도.. ㅜㅜ

답변시간이 오래 걸려도 ㅜㅜ 기다리겠습니다. ㅜㅜ
참조 파일은 델파이 단순 그리드입니다.

이메일 :changminoh@hotmail.com








[최초 등록일: ]
[최종 수정일: 6/2/2006]


비밀번호

댓글 작성자
 




... 76  [77]  78  79  80  81  82  83  84  85  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
594ygso...3/13/200714203ClickOnce를 이용하여 SmartClient를 배포할경우.. [2]
589김희택3/2/200713340리소스 추가 방법에 대한 아티클을 보던중에 질문요... [1]파일 다운로드1
588이성진2/24/200715620웹 -> 스마트클라이언트 -> 웹서비스 의 세션 공유 방법 ? [1]
583김영민2/22/200713801Vista에서 "관리자 권한으로 실행"을 통해 실행한 프로세스의 동작
584정성태2/22/200715305    답변글 [답변]: Vista에서 "관리자 권한으로 실행"을 통해 실행한 프로세스의 동작
582한귀순2/22/200713854sqlhelper 의 updatedataset
585정성태2/23/200713098    답변글 [답변]: sqlhelper 의 updatedataset [1]
579futu...2/16/200714609VS2005의 스마트 클라이언트에서 웹브라우저 예제 질문입니다. [1]
578정해봉2/16/200713840IE Embeded Assambly 방식에서 CAS 설정 방법 [1]
575박성민2/12/200714611COM에 데이터 보내기 질문입니다. [1]
571엔틱스2/7/200715312그냥... 질문은 아닙니다만... [2]
5682/6/200712559이런 오류 화면을 어떻게 찾아봐야 - 알아봐야 - 하는지요?파일 다운로드1
569정성태2/6/200714051    답변글 [답변]: 이런 오류 화면을 어떻게 찾아봐야 - 알아봐야 - 하는지요? [1]
570정성태2/6/200713970        답변글 [답변]: [답변]: 이런 오류 화면을 어떻게 찾아봐야 - 알아봐야 - 하는지요?
5732/8/200712942            답변글 [답변]: [답변]: [답변]: 이런 오류 화면을 어떻게 찾아봐야 - 알아봐야 - 하는지요? [1]파일 다운로드1
565한귀순2/5/200713522typed dataset 의 유용성
566정성태2/6/200715307    답변글 [답변]: typed dataset의 유용성 [1]
564정민영2/5/200713748혹시 이런 경우 보신적 있으신가 궁금합니다..^^; [2]
563창민이2/2/200713925Visual C++ COM Objects Returning Recordsets 사용에 대해.. [3]
562현석1/29/200713912C# 스마트응용장치에서 아이콘 움직이게하는거 질문요 ^^ [1]파일 다운로드1
559초보1/27/200715230급 질문 입니다. visual studio 자동 종료에 대한 질문입니다. [2]
558즈믄1/26/200714930.Net Framework v2.0에서 Winform의 Panel에 Excel파일 보여주기 [2]
556정재우1/26/200715002vista에서 smartclient의 System.Security.PermissionsRegistryPermission 에러 [1]
555dev....1/25/2007163792005 WebBrowser내에서 팝업 처리 문제 관련 질문입니다.
561정성태1/29/200719225    답변글 [답변]: 2005 WebBrowser 내에서 팝업 처리 문제 관련 질문입니다.
554sky1/23/200715005<급질문> interop 를 사용함에 있어 [2]
... 76  [77]  78  79  80  81  82  83  84  85  86  87  88  89  90  ...