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
[42135] Re:답변 정말 감사드립니다...
최준호.스페로 [sparrow] 1435 읽음    2005-10-12 11:49
안녕하세요 스페로 입니다.
다음과 같이 해보십시오.
먼저 폼에 버튼 하나 올리고... (이넘이 Key 후킹 시작 버튼으로.. )
해지는아침님이 올리신 소스를 그래도 활용 하였습니다.
<CPP 소스>
//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;

LPCTSTR ProgName = "Form1";
HHOOK hHook;
LRESULT CALLBACK HookMouseProc(int nCode, WPARAM wParam, LPARAM lParam) ;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{

  hHook = SetWindowsHookEx(13,(HOOKPROC)::HookMouseProc,GetModuleHandle(NULL), 0);
}
//---------------------------------------------------------------------------




LRESULT CALLBACK HookMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    HWND hwnd;
    LRESULT lResult = 0;
    if(nCode == HC_ACTION)
    {
        if(((EVENTMSG*)lParam)->message == VK_F10)
        {
            hwnd=FindWindow(NULL,ProgName);
            SendMessage(hwnd,WM_USER+4,1,1);
            return 1;
        }
        else if(((EVENTMSG*)lParam)->message == VK_F12)
        {
            hwnd=FindWindow(NULL,ProgName);
            SendMessage(hwnd,WM_USER+5,1,1);
            return 1;
        }
        else if(((EVENTMSG*)lParam)->message == VK_F8)
        {
            hwnd=FindWindow(NULL,ProgName);
            SendMessage(hwnd,WM_USER+6,1,1);
            return    1;
        }
    }

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

//---------------------------------------------------------------------------
void __fastcall TForm1::OnMyKeyEvent(TMessage &Message)
{
  switch(Message.Msg)
  {
    case WM_USER+4:
      ShowMessage("F10 press");
      break;
    case WM_USER+5:
      ShowMessage("F12 press");
      break;
    case WM_USER+6:
      ShowMessage("F8 press");
      break;

  }
}
<헤더파일 소스>
//---------------------------------------------------------------------------

#ifndef Unit1H
#define Unit1H
//---------------------------------------------------------------------------
#include <Classes.hpp>
#include <Controls.hpp>
#include <StdCtrls.hpp>
#include <Forms.hpp>
//---------------------------------------------------------------------------
class TForm1 : public TForm
{
__published:    // IDE-managed Components
  TButton *Button1;
  void __fastcall Button1Click(TObject *Sender);
private:    // User declarations
public:        // User declarations
  __fastcall TForm1(TComponent* Owner);

protected:
  void __fastcall OnMyKeyEvent(TMessage &Message);
BEGIN_MESSAGE_MAP
  MESSAGE_HANDLER(WM_USER+4, TMessage, OnMyKeyEvent);
  MESSAGE_HANDLER(WM_USER+5, TMessage, OnMyKeyEvent);
  MESSAGE_HANDLER(WM_USER+6, TMessage, OnMyKeyEvent);
END_MESSAGE_MAP(TForm)
};
//---------------------------------------------------------------------------
extern PACKAGE TForm1 *Form1;
//---------------------------------------------------------------------------
#endif

최소화 했을때.. HookMouseProc()까지는 오고 SendMessage()까지 하지만.
MESSAGE_MAP 에서 OnMyKeyEvent()로 보내주지는 않더군요..
메세지 받는 부분은 좀더 수정해보세요..

아마도 프로그램이 최소화 되어 있거나 아니면 아에 보이지 않는 폼으로
다른 프로그램들의 Function키를 후킹 하시려고 하는거 같은데..

이곳에서 좀더 검색해보시면 답이 나올거 같습니다.
저는 회사에서 빌더 프로그래밍을 하지 않으므로 잘모릅니다. ^^.

그럼 즐거운 프로그래밍 라이프 되십시오.~~



해지는아침 님이 쓰신 글 :
: 답변 감사 드립니다...
: 단축키 F10, F12등이 다른 프로그램 작동중(프로그램 비활성화중)에도 작동하는 원리를 배우고 싶어 전환을 부탁드렸습니다...  자료를 찾아보니 후킹이라는 것으로 되어 있던데요...
: 그래서 후킹 관련 자료를 보고 있습니다...  이참에 VC++도 기본적인 것은 공부해 두어야 겠다는 생각이 들고요.
: .
: 아래 부분을 C++ Builder로 전환해 보고 싶어서 요청을 드렸습니다...
: --------------------------------------------------------------------
: hHook = SetWindowsHookEx(13,(HOOKPROC)::HookMouseProc,GetModuleHandle(NULL), 0);
:
: LRESULT CALLBACK HookMouseProc(int nCode, WPARAM wParam, LPARAM lParam)
: {
:     HWND hwnd;
:     LRESULT lResult = 0;
:     if(nCode == HC_ACTION)
:     {
:         if(((EVENTMSG*)lParam)->message == VK_F10)
:         {
:             hwnd=FindWindow(NULL,ProgName);
:             SendMessage(hwnd,WM_USER+4,1,1);
:             return 1;
:         }
:         else if(((EVENTMSG*)lParam)->message == VK_F12)
:         {
:             hwnd=FindWindow(NULL,ProgName);
:             SendMessage(hwnd,WM_USER+5,1,1);
:             return 1;
:         }
:         else if(((EVENTMSG*)lParam)->message == VK_F8)
:         {
:             hwnd=FindWindow(NULL,ProgName);
:             SendMessage(hwnd,WM_USER+6,1,1);
:             return    1;
:         }
:     }
:
:     return CallNextHookEx(hHook, nCode, wParam, lParam);
: }
: ------------------------------------------------------------------------
: 답변에 거듭 감사 드리며, 나머지는 제가 한번 연구해서 해 보기로 하고요....혹시 간단히 전환되는 거면 리플달아 주시면 저야 좋은데, 넘 무리한 부탁 드리는 것 같아 자제하겠습니다...^^
: 좋은 하루 되셔요^^
:
: 최준호.스페로 님이 쓰신 글 :
: : 안녕하세요 스페로 입니다.
: :
: : 이걸 완전히 C++빌더로 포팅 하느니 대강 만드러 봣습니다. 어짜피 세팅 UI라던지 여러 좌표를 파일로 저장한다던지
: : 이런것들은 직접 작성 하시면 될거 같구요.
: :
: : 오토마우스라는게 어짜피 정해진 좌표로 마우스 이동시키고 누르기만 하면 되는 거라서...
: : 아래와 같이 하면 됩니다.
: :
: : 일단 폼에 Edit를 3개 하나는 X구 하나는 Y그리고 하나는 타이머 인터벌
: : 타이머 하나를 올려 놓습니다. 속성에서 Enable을 일단 false로 조정 합니다.
: : 버튼을 두개 올려 놓습니다. 하나는 시작, 하나는 중지
: :
: : 중요한 코드는 마우스 커서의 위치 이동, 그리고 누르게 해주는 함수 두개만 쓰면 됩니다.
: : 타이머 이벤트에 코드를 작성 합니다.
: :
: : 그럼 아래와 같은 코드가 되겠죠.
: :
: : 그럼 ~~
: :
: : //---------------------------------------------------------------------------
: :
: : #include <vcl.h>
: : #pragma hdrstop
: :
: : #include "Unit1.h"
: : //---------------------------------------------------------------------------
: : #pragma package(smart_init)
: : #pragma resource "*.dfm"
: : TForm1 *Form1;
: : //---------------------------------------------------------------------------
: : __fastcall TForm1::TForm1(TComponent* Owner)
: :   : TForm(Owner)
: : {
: : }
: : //---------------------------------------------------------------------------
: :
: : void __fastcall TForm1::Button1Click(TObject *Sender)
: : {
: :   Timer1->Interval = Edit3->Text.ToInt();
: :   Timer1->Enabled = true;
: :
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall TForm1::Timer1Timer(TObject *Sender)
: : {
: :   SetCursorPos(Edit1->Text.ToInt(), Edit2->Text.ToInt());
: :   mouse_event(MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, GetMessageExtraInfo());
: :   mouse_event(MOUSEEVENTF_RIGHTUP, 0, 0, 0, GetMessageExtraInfo());
: :
: : }
: : //---------------------------------------------------------------------------
: : void __fastcall TForm1::Button2Click(TObject *Sender)
: : {
: :   Timer1->Enabled = false;
: : }
: : //---------------------------------------------------------------------------
: :
: :
: :
: :
: : 해지는아침 님이 쓰신 글 :
: : : 오토마우스라는 프로그램을 짜 볼려고 시도하다가 잘 되지 않아 친구한데 프로그램 쏘쓰를 받았습니다.... 그런데 VC++로 짜여 있어서 초보에다 VC는 접해보지 않아 도통 모르겠습니다.
: : : 고수분들 첨부한 파일을 BCB에서 쓸 수 있게 점 만들어 주셔요... 부탁드립니다.

+ -

관련 글 리스트
42121 [요청]vc++로 짜여진 프로그램인데요...누가 BCB로 바꿔 주셔요...제발 해지는아침 998 2005/10/09
42123     Re:[요청]vc++로 짜여진 프로그램인데요...누가 BCB로 바꿔 주셔요...제발 최준호.스페로 1251 2005/10/10
42130         답변 정말 감사드립니다... 해지는아침 1244 2005/10/11
42135             Re:답변 정말 감사드립니다... 최준호.스페로 1435 2005/10/12
42136                 Re:Re:덕분에 시원하게 해결됬습니다. 해지는아침 1945 2005/10/12
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.