|
안녕하세요 스페로 입니다.
다음과 같이 해보십시오.
먼저 폼에 버튼 하나 올리고... (이넘이 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에서 쓸 수 있게 점 만들어 주셔요... 부탁드립니다.
|