Delphi Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
델파이 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
FreePascal/Lazarus
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
델마당
볼랜드포럼 광고 모집

델파이 Q&A
Delphi Programming Q&A
[6486] [답변] 한림정보/ 마우스 작동만을 일시 중지방법?
박테리아 [ ] 999 읽음    1999-08-01 16:38
안녕 하세요?

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 끝>--------------------------------



+ -

관련 글 리스트
6486 [답변] 한림정보/ 마우스 작동만을 일시 중지방법? 박테리아 999 1999/08/01
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.