2014-05-25 3 views
0

응용 프로그램에서 생성 된 특정 창에 대해 Windows 메시지를 어떻게 연결시킬 수 있습니까? 나는 이것을했지만 오류가 E2036 Variable required이됩니다. 당신은 당신이 만든 윈도우 윈도우 메시지를 훅하려면훅 창 메시지

type 
    TSomeClass = class 
    ... 
    WndProc(code : integer; wParam: WPARAM; lParam: LPARAM) : LResult; 
    ... 
    end; 

var 
    SomeClass: TSomeClass; 

procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ... 
    SomeClass := TSomeClass.Create; 
    SetWindowsHookEx(WH_CALLWNDPROC, @SomeClass.WndProc, 0, GetCurrentThreadId); 
    ... 
end; 
+0

이것은 @I SomeClass.WndProc가 메소드 포인터 (look up)이기 때문에 발생합니다. –

답변

5

, 당신은 창을 래핑 컨트롤의 WindowProc 속성을 설정할 수 있습니다. 이것이 가능하다면가는 것이 옳습니다.

후크 절차를 통과하지 않아 SetWindowHookEx에 대한 호출이 실패합니다. 인스턴스 메소드를 전달 중입니다. 후크 절차는 다음과 같이 선언 된 비회원 함수 여야합니다.

function HookProc(nCode: Integer; wParam: WPARAM; 
    lParam: LPARAM): LRESULT; stdcall; 

또한 문서화 된 지침을 준수해야합니다. 인스턴스가 SetWindowHookEx으로 주어 졌음을 기억하고 CallNextHookEx으로 전화하여 후크 체인을 준수해야합니다.

+0

예.하지만 5 개의 다른 창을 연결하려면 어떻게해야합니까? 각각 다른 수업에 속해 있습니까? 결국 나는이 창들에 의한 포커스 훔치기를 막기를 원한다. – user3655788

+0

WindowProc을 사용할 수 있다면 그렇게하십시오. SetWindowHookEx를 사용해야하는 경우 스레드를 연결 한 다음 원하는대로 각 창을 처리하십시오. 전체 스레드에서 모든 창 proc 호출을 연결합니다. 내가 뭘 하려는지 알지 못하기 때문에 앱에 대한 특별한 조언을 해주는 것이 어렵다. 나는이 창문이 무엇인지, 누가 그 창을 소유하고 있는지 등을 모릅니다. –

+3

@user -'MakeObjectInstance'를 검색하십시오. –

1

당신은 수신 윈도우의 모든 종류의 프로세스 창 메시지뿐만 아니라 같은 당신이 직접 만든, 당신은 내 단위 사용할 수있는 멤버 함수를 사용할 수 있도록 좋아하는 경우 :

http://www.maxlogic.eu/subclassing-hooking-windows-with-delphi/

을 그리고 그것을 사용하는 방법은 다음과 같습니다.

uses maxWndSubClassing; 




TSomeClass = class 
public 
    WindowHook: TWndSubClass; 
    procedure myWindowProc(var Msg: Messages.TMessage; var PrevendDefaultHandler: boolean); 
end; 


procedure TForm1.Button1Click(Sender: TObject); 
begin 
    ... 
    SomeClass := TSomeClass.Create; 


    SomeClass.WindowHook := TWndSubClass.Create(nil); 
    SomeClass.WindowHook.OnMessage := SomeClass.MyMessageProc; 
    // this line assigns the window handle that will be hooked. Depending on what you are hooking, pass something else instead of aHandle 
    SomeClass.WindowHook.HookedWnd := aHandle; 
end; 

확실히이 코드를 TSomeClass의 생성자에 넣는 것이 좋습니다. 사용하여 서브 클래스를 해제하는 것을 잊지 마세요 :

SomeClass.WindowHook.free; 

어쨌든 난이 도움이되기를 바랍니다.

0

이 메서드를 클래스 멤버로 사용하려면 을 정적으로 사용할 수 있습니다.

type 
    TSomeClass = class 
    ... 
    class function WndProc(code : integer; wParam: WPARAM; lParam: LPARAM) : LResult; static; stdcall; 
    ... 
    end; 

    var 
     SomeClass: TSomeClass; 

    procedure TForm1.Button1Click(Sender: TObject); 
    begin 
     ... 
     SomeClass := TSomeClass.Create; 
     SetWindowsHookEx(WH_CALLWNDPROC, @TSomeClass.WndProc, 0, GetCurrentThreadId); 
     ... 
    end; 

P.S. : 클래스 함수 등이 (D2006)와 개질제 그리고 stdcall을 기억하지 마십시오. WinAPI func에 대한 변경자