2009-09-23 5 views
1

내 목표는 부동 도구 모음을 자체 C# 응용 프로그램으로 만드는 것입니다. 사용자가 스크롤 휠을 사용하면 볼 수있는 단추를 변경하려고합니다. 충분히 쉬운 소리, 그냥이 한 줄의 문제이어야한다 :초점이 맞지 않은 창 위에 마우스 휠을 감지 했습니까?

MouseWheel += new MouseEventHandler(Form1_MouseWheel); 

난 데 문제는 내 응용 프로그램이 포커스가있을 때 마우스 휠 핸들러 만 호출 될 것입니다. 즉, 사용자가 먼저 클릭 한 다음 마우스 휠로 이동해야합니다. 그건 내가하려는 일을하지 않을거야.

MouseHover 이벤트 처리기를 연결하고 form.Activate()를 호출하여 포커스를 얻을 수 있습니다. 왜냐하면 사용자가 (약간 기다리지 않고) 애플리케이션 위에 마우스를 올린 직후에 스크롤 휠을 사용하면 포커스가 이전 앱에 계속 남아 있기 때문에 mousewheel 이벤트가 발생하기 때문에 차선책입니다.

자연스럽게해야 할 일은 MouseEnter 이벤트를 연결하고 Activate()를 호출하는 것이지만 응용 프로그램이 앞으로 오지 않고 해당 아이콘이 작업 표시 줄에서 깜박이기 시작합니다. 나는 Win7을 사용하고 있지만이 문제는 아마 이것보다 오래되었다.

이상적으로, 내 응용 프로그램에 포커스가 있는지 여부에 대해 걱정할 필요없이 마우스 휠 이벤트를 감지하는 것이 이상적입니다. 이전 애플리케이션이 입력 포커스를 유지하는 것이 더 낫습니다. 예를 들어 사용자가 메모장에 입력 할 수 있고, 내 앱으로 마우스를 이동하고, 스크롤 휠을 사용하고,보고있는 내용을보고 메모장에서 다시 입력하기로 결정한 경우입니다. . 이상적으로 나는이 시나리오에서 한번도 클릭하지 않기를 바란다.

다른 방법이 없다면 내 애플리케이션으로 포커스를 전환하는 해결책을 찾겠습니다.

지금까지 C# 및 Windows Forms를 사용했지만 내 문제를 해결할 수 있다면 다른 것을 사용하고 싶습니다.

그렇다면 사용자가 먼저 내 애플리케이션에 포커스를 맞추지 않고 마우스 휠 이벤트를 볼 수 있습니까?

답변

2

응용 프로그램 외부에서 마우스 이벤트를 catch해야하는 경우 전역 시스템 후크를 사용할 수 있습니다. 좋은 .NET 구현이 있습니다. here

+0

토마스, 감사합니다. - 매우 가까이에 있지만 모든 방법으로 끝나지는 않습니다. 링크 된 코드는 마우스 휠 움직임을 감지 할 수 있지만 휠이 어느 방향으로 이동했는지 알려주지 않습니다. 자체 MouseFunc 핸들러에 넣는 것을 볼 수 있으며 WM_MOUSEWHEEL 메시지를 찾는 것은 wparam에 델타 및 수정 자 키가 있어야 함을 나타냅니다. 그러나 그것은 항상 나를 위해 522 인 것처럼 보인다 - 그래서 나는 델타 대신 높은 단어에서 기대하고있다. 해결책을 찾으려면 조금 더 많은 도움이 필요합니다! 도움을 주시면 감사하겠습니다 :) – redtuna

+0

522는 WM_MOUSEWHEEL 상수의 값입니다 ...이 구현에서 잘못된 것이 틀림 없습니다. 메시지 매개 변수가 코드 매개 변수 대신 wparam 인수로 HookCallback에 전달 된 것으로 보입니다. –

+0

내 잘못이야; WM_MOUSEWHEEL에 대한 설명서는 실제로 MouseProc에서 무엇을 얻는 지 설명하지 않습니다. lParam은 522이고 wParam은 MOUSEHOOKSTRUCT에 대한 포인터입니다. 이 구조는 마우스 휠에 대해서는 아무 것도없는 것처럼 보입니다. 설명서 (http://msdn.microsoft.com/en-us/library/ms644968%28VS.85%29.aspx)에는 점, 창 테스트 및 문서화되지 않은 데이터를 처리합니다. 그래서 질문에 답이 없습니다. 마우스 휠을 움직이는 방법을 어떻게 알 수 있습니까? – redtuna

관련 문제