2010-11-25 4 views
6

모든 응용 프로그램의 모든 UI 이벤트를 가로 채어 로그에 기록하도록 응용 프로그램을 만들고 싶습니다. 이 데이터는 가장 많이 사용되는 컨트롤, 순서 등을 확인하는 데 사용할 수 있습니다. 문제는 기존 클래스를 수정하지 않고 자동으로이를 수행하도록하려는 것입니다.C# (WinForms)의 응용 프로그램에서 모든 컨트롤에 대한 클릭 이벤트를 가로 채기

폼의 모든 컨트롤에 대해 클릭 이벤트에 메서드를 연결하는 프로토 타입을 만들었지 만 모든 폼에서이 작업을 수행하는 방법은 무엇입니까? 리플렉션은 이벤트를 조작 할 때 대상 객체가 필요하지만 시작 폼 만 쉽게 액세스 할 수 있습니다.

개체의 생성자를 연결하는 방법이 있습니까? 그런 다음 새 양식의 모든 이벤트에 내 방법을 "삽입"할 수있었습니다. 아니면 다른 방법이있을 수 있습니다.

미리 감사드립니다.

답변

7

message filter을 설치할 수 있습니다.

메시지 필터는 IMessageFilter을 구현하는 개체입니다. WinForms는 스레드의 메시지 루프를 통과하는 모든 메시지에 대해 PreFilterMessage 메서드를 호출합니다. 이것은 응용 프로그램에서 사용자 입력을 모니터하기에 충분합니다 (그리고 조작 옵션을 제공합니다).

1

Windows API에서 이것은 로컬 후크를 사용하여 수행됩니다 (SetWindowsHookEx 기능을 사용하여 로컬 마우스 후크를 설정할 수 있음). 이것은 당신의 임무를 수행하는 적절한 방법입니다. C#에서는 P/Invoke를 사용하여 SetWindowsHookEx에 액세스해야합니다.

한 가지 더 많은 작업은 HWND (Windows 핸들)를 해당 WinForms 컨트롤과 일치시키는 것입니다. WM_GETCONTROLNAME 메시지를 통해이 작업을 수행하는 방법은 this article을 참조하십시오.

this question은 (는) 귀하의 복제본입니다.

0

message filters - 으로 원하는 것을 달성 할 수 있어야합니다. 직접 P/Invoke to Win32-API가 필요하지 않습니다!

자세한 내용은 IMessageFilter 인터페이스의 도움말을 참조하십시오.