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
[1346] [질문] 메시지 후킹에서 문제가../프포
z3833992 [ ] 4414 읽음    1999-05-16 12:12

안녕하세요? 홍환민입니다.

메시지 후킹을 하려고 합니다. 클립보드로 뭔가가 복사  다는 것을 감지해서
그에 해당하는 작업을 하도록요..

아래 소스를 올릴텐데 먼저 몇가지 질문을 드리죠.

질문 1 >> 그 클립보드로 뭔가가 복사될때 발생하는 메시지가 WM_COPY가
           맞는지?
질문 2 >> 클립보드로 뭔가가 복사됐다  라는 메시지를 후킹하기에 가장
           알맞은 훅은 무엇입니까?

소스를 올립니다.
먼저 문제점을 말씀드리자면, 프로그램을 실행하면 다음과 같은 에러가
발생하면서 윈도우즈가 다운되는 위기가 오더군요.
(현재 실행중인 프로그램에 차례로 다음과 같은 에러가 나면서 다운상태..)

"VCL35.BPL에서 MSTASK이 예외 eedfadeH를 일으켰습니다."
에러의 내용이 좀 틀리더라도 eedfadeH 예외가 발생하는건 동일합니다.

그리고 Build 처리를 하면 이상하게도 실행이 됩니다.
(이나마도 안돼는 때도 있고요. 이상하니 소스를 보고 직접  테스트
  해보시는게 좋을실 겁니다.)
실행이 된다고 해도 윈도우즈 자체의 속도가 엄청나게 느려집니다.
왜 그럴까요?

임포트 라이브러리 파일은 프로젝트에 추가하였습니다.
DLL 파일도 컴파일되어서 생겼고요.


소스 보시고 테스트 부탁드립니다.

질문 3 >> 소스 작동 안 되는 이유와 고친 소스 올려주시기 바랍니다.
질문 5 >> 좀 좋지 않은(정확치 않은) 루틴이 보이면 고쳐주시고요.
질문 6 >> 클립보드에 복사되는것이 감지되어서 훅프로시저에서 해당작업을
           해야 될텐데요.(제가 원하는 작업은 복사된 스트링을 알맞게
           처리를 한뒤 특정 프로그램에 붙여넣기를 하려 합니다.)
           소스는 아마 DLL 소스가 아닌 프로그램 소스에 들어가야 할것 같네요.
           (프로그램에 있는 컴포넌트에 작업을 해줘야 해서요.. 맞는
생각인가..)
           그런데 그럴려면 DLL 소스의 훅프로시저에서 어떤식으로
           프로그램 소스의 함수를 호출할수 있는지..
           아구.. 제 생각이 틀렸다면 전반적으로 다시 설명부탁드립니다.

<< HookDLL.cpp 파일 >>

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "HookDLL.h"

HHOOK HookHandle = 0;

int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*)
{
    return 1;
}
//---------------------------------------------------------------------------

// 훅핸들을 파일 형태로 저장을 합니다.
void ReadData()
{
  TFileStream *F = new TFileStream("HOOK.DAT", fmOpenRead);

  try
  {
    F->Read(HookHandle, sizeof(HookHandle));
  }
  __finally
  {
    F->Free();
  }
}

void WriteData()
{
  TFileStream *F = new TFileStream("HOOK.DAT", fmCreate);

  try
  {
    F->Write(HookHandle, sizeof(HookHandle));
  }
  __finally
  {
    F->Free();
  }
}

LRESULT CALLBACK MyHookProcedure(int Code, WPARAM wParam, LPARAM lParam)
{
  if (HookHandle == 0)
    ReadData();

  if (Code >= 0)
  {
    if (((LPMSG)lParam)->message == WM_DESTROYCLIPBOARD)
      ShowMessage("클립보드 복사 이벤트 발생");
  }
  return CallNextHookEx(HookHandle, Code, wParam, lParam);
}

// 후킹 설정
int DLL_EXP SetHook()
{
  HookHandle = SetWindowsHookEx(WH_CALLWNDPROCRET,
(HOOKPROC)MyHookProcedure, (H
INSTANCE)NULL, 0);
  WriteData();
}

// 후킹 해제
int DLL_EXP UnHook()
{
  if (HookHandle == 0)
    ReadData();
  return UnhookWindowsHookEx(HookHandle);
}


<< HookDLL.h 파일 >>

#ifndef _HOOKDLL_H
#define _HOOKDLL_H

#ifdef __DLL__
#  define DLL_EXP __declspec(dllexport)
#else
#  define DLL_EXP __declspec(dllimport)
#endif

extern "C" int DLL_EXP SetHook();
extern "C" int DLL_EXP UnHook();

#endif


<< DLL의 함수를 사용하는 cpp 파일의 일부 >>

#include <vcl.h>
#pragma hdrstop

#include "HookDLL.h"

.....................


void __fastcall TMainForm::FormCreate(TObject *Sender)
{
  // 후킹 설치
  SetHook();
}

void __fastcall TMainForm::FormDestroy(TObject *Sender)
{
  // 후킹 해제
  UnHook();
}


  언제나 답변에 감사드리며....




+ -

관련 글 리스트
1346 [질문] 메시지 후킹에서 문제가../프포 z3833992 4414 1999/05/16
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.