안녕 하세요?
BacTeria 박종민 입니다.
제가 엉뚱한 소리 하는거나 아닌지 모르겠지만 서두요.
음... 특정 윈도우에서 발생하는 마우스 메시지를 가로채려면 이렇게 하심 됩니다.
이 방법이 절대적으로 옳은건 아니구요. 그냥 편법 정도로 해두죠.
우선 시스템 전체에서 발생하는 마우스 메시지를 가로채려면 훅이라는 방법을 통해서
가로채야만 합니다. 훅에 대한 자세한 내용은 관련 책자나 도움말을 참조 하시구요.
아래에 간단한 훅 관련 소스를 첨부 했습니다. (소스 1)
그리구요 어떤 특정 윈도우에서 발생한 메시지를 알아낸다. 이게 문젠데...
현재의 마우스 위치의 윈도우 핸들을 얻어내는 API가 있습니다.
WindowFromPoint 라고... 인자로 TPoint 형의 변수를 주시면 되구요.
또, 현재 마우스 위치는 GetCursorPos API 로 구할 수 있습니다.
아래의 소스를 보심 알겠지만 뭐, 대충 이런 식입니다.
GetCursorPos(위치저장변수);
현재 프로그램의 핸들 := WindowFromPoint(위치저장변수);
이렇게 얻어온 마우스 위치의 프로그램 핸들과 내가 찾고자 하는 프로그램의 핸들을
비교한 후에 맞으면 그 프로그램에서 발생한 메시지가 맞으니까 처리해주면 되겠죠?
너무 어렵남???
아래의 소스에선 윈도우에 포함된 '계산기'의 메시지를 가로 챘습니다.
소스 1을 가지구요 DLL로 만드신 후에 내 프로그램에서 호출 하시면 됩니다.
아래의 내용은 관련 소스입니다.
이만... 청주에서 박종민...
----------------------------<Project1.Dll 소스(소스 1)>------------------------
library Project1;
uses
Windows, Dialogs, Messages;
var
TheHook: HHook;
function MyHook(Code: Integer; wParam: WPARAM; lParam: LPARAM): LongInt;stdcall;
var
OrgHandle, FindHandle: THandle;
Position: TPoint;
begin
OrgHandle := FindWindow(nil, '계산기'); // 계산기의 핸들을 구한다
GetCursorPos(Position); // 마우스의 현재 위치를 구한다
FindHandle := WindowFromPoint(Position); // 현재 위치 프로그램 핸들을 구한다
if (Code >= 0) and (OrgHandle = FindHandle) then
Case wParam of
// WM_LBUTTONDOWN: ShowMessage('계산기에서 WM_LBUTTONDOWN 이벤트 발생');
WM_RBUTTONDOWN: ShowMessage('계산기에서 WM_RBUTTONDOWN 이벤트 발생');
end;
Result := CallNextHookEx(TheHook, Code, wParam, lParam);
end;
procedure TestHook;
begin
TheHook := SetWindowsHookEx(WH_MOUSE, MyHook, HInstance, 0);
end;
procedure UnTestHook;
begin
UnHookWindowsHookEx(TheHook);
end;
exports
TestHook,
UnTestHook;
begin
TheHook := 0;
end.
-------------------------------------<소스1 끝>--------------------------------
------------------------------<Unit1.pas 소스(소스 2)>-------------------------
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type
TForm1 = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
procedure TestHook; external 'Project1.dll' name 'TestHook'; // 함수 선언
procedure UnTestHook; external 'Project1.dll' name 'UnTestHook';
implementation
{$R *.DFM}
procedure TForm1.FormCreate(Sender: TObject);
begin
TestHook; // 훅 함수 설치...
end;
procedure TForm1.FormDestroy(Sender: TObject);
begin
UnTestHook; // 훅 함수 해제...
end;
end.
-------------------------------------<소스2 끝>--------------------------------
|