2013-04-18 2 views
3

저는 C 익숙하지 않은 WinForms 응용 프로그램을 사용하고 있습니다. 컨트롤은 드래그 가능하도록되어 있으며 사용자가 컨트롤의 일부에서 드래그를 시작하면 드래그 할 수 있지만 실제로 드래그 할 수는 없습니다.누락 된 마우스 클릭 찾기

컨트롤에는 여러 개의 자식 컨트롤이 포함되어 있으며 부모 컨트롤에서 볼 수 있기 전에 이러한 자식 컨트롤 중 일부가 마우스 클릭을 캡처하여 특정 영역에서 오류가 발생한다고 생각합니다. 사용자가 특정 자식 컨트롤을 클릭 할 때만 부모에 대한 마우스 다운 처리기가 호출된다는 것을 디버거에서 확인했습니다.

처리기에 도달하기 전에 클릭이 캡처되고/억제된다는 것을 감안할 때 디버거 (또는 기타)에서 클릭이 어디로 갈지 결정하는 방법이 있습니까? 어디서부터 시작해야할지 모르므로 코드를 보지 못했습니다.

+0

부모 컨트롤에서 KeyPreview 속성을 사용하면 자식 컨트롤이 수행하기 전에 이벤트를 catch합니다. 너무 확실한. –

+0

고마워요,하지만 KeyPreview는 마우스 이벤트가 아닌 키 누르기에서만 작동합니다. – Stefan

답변

4

Visual Studio와 번들로 제공되는 프로그램에는 Spy++이라는 아주 작은 프로그램이 있습니다. 그것은 log all messages이 윈도우로 보내지는 것을 허용하고, 윈도우 내에서 Win32 컨트롤의 '실제'구조를 보여줍니다 (많은 컨트롤은 실제로는 컨트롤이 아니라 사용자 정의 페인트 된 화면 영역입니다). 검사를 통해 메시지 로그로 범인을 찾을 수 있어야합니다.

+0

감사합니다. 이것은 거의 필요한 것입니다! 그것은 모든 컨트롤을 식별하고 이벤트를 감지하지만 모든 마우스 이벤트가 최상위 레벨 창 (관심있는 컨트롤 위의 여러 수준)으로 이동한다는 것을 알려줍니다. 그래서 특정 마우스를 눌러 어떤 핸들러가 호출되는지 알 수 없습니다. – Stefan

+0

Windows가 실제로 작동하는 방식입니다. 모든 메시지는 최상위 창으로 보내지고'DispatchMessage' Win32 API 함수로 배포됩니다. 따라서 Form 인스턴스의'Control.WndProc' 메소드를 오버라이드하여 모든 메시지가 아닌 모든 메시지를 미리 볼 수 있어야합니다. 자세한 정보는 http://msdn.microsoft.com/en-us/library/system.windows.forms.control.wndproc.aspx –

+0

을 참조하십시오. Control.WndProc을 재정의하면 어디에서 메시지가 왔는지 알 수 있습니다. DispatchMessage는 내가 보낸 메일을 보내 게됩니다. 이전과 마찬가지로 Windows에서 들어오는 메시지에 문제가 없으며 이해해야하는 부분입니다. – Stefan