문제

Winform C# 응용 프로그램에서 Mouseevents에 문제가 있습니다.

난 갖길 원해 모두 마우스는 내 응용 프로그램을 클릭하지만 모든 어린이 구성 요소에 청취자를 넣고 싶지는 않습니다.

플래시에서 나는 무대에 청취자를 넣어 영화에 모든 뮤즈 벤트를 얻을 수있었습니다.

C#에 그런 것이 있습니까? 글로벌 mouselistener?


편집하다:

ImessageFilter ANS 중고 응용 프로그램 에서이 클래스를 만듭니다. AddMessageFilter.

public class GlobalMouseHandler : IMessageFilter{

    private const int WM_LBUTTONDOWN = 0x201;

    public bool PreFilterMessage(ref Message m){
        if (m.Msg == WM_LBUTTONDOWN) {
            // Do stuffs
        }
        return false;
    }
}

이 코드를 전역 클릭을 듣는 컨트롤 에이 코드를 넣으십시오.

GlobalMouseHandler globalClick = new GlobalMouseHandler();
Application.AddMessageFilter(globalClick);
도움이 되었습니까?

해결책

이 작업을 수행하는 한 가지 간단한 방법은 호출하여 메시지 루프 필터를 추가하는 것입니다. Application.AddMessageFilter 그리고 구현하는 수업을 작성합니다 IMessageFilter 상호 작용.

을 통해 IMessageFilter.PreFilterMessage, 클래스는 응용 프로그램의 메시지 루프를 통과하는 입력 메시지를 볼 수 있습니다. PreFilterMessage 또한이 메시지를 자신이 운명의 특정 제어로 전달할지 여부를 결정하게됩니다.

이 접근법이 도입 한 복잡성의 한 부분 PreFilterMessage 방법. 이것은 Win32 Documention을 언급하는 것을 의미합니다 WM\_LBUTTONDOWN, WM\_MOUSEMOVE, WM\_LBUTTONUP 기존 대신 등 MouseDown, MouseMove 그리고 MouseUp 이벤트.

다른 팁

샘플 클래스

class CaptureEvents : IMessageFilter
{
    #region IMessageFilter Members
    public delegate void Callback(int message);
    public event Callback MessageReceived;

    IntPtr ownerWindow;
    Hashtable interestedMessages = null;
    CaptureEvents(IntPtr handle, int[] messages)
    {
        ownerWindow = handle;
        for(int c = 0; c < messages.Length ; c++)
        {
            interestedMessages[messages[c]] = 0;
        }
    }
    public bool PreFilterMessage(ref Message m)
    {
        if (m.HWnd == ownerWindow && interestedMessages.ContainsKey(m.Msg))
        {
            MessageReceived(m.Msg);
        }
        return true;
    }

    #endregion
}

이 기사를 살펴보십시오. 그것은 모든 컨트롤 이벤트를 재귀 적으로 hook로 방송하고 방송합니다. 당신은 또한 무시할 수 있습니다 wndproc 당신의 형태로.

양식을 재정의하여 메시지를 처리하지 않으려면 processmessage 또는 form.wndproc을 서브 클래스를 사용하여 이벤트 핸들러를 양식의 다양한 컨트롤에서 모든 Mouseclick 이벤트에 연결할 수 있습니다.
편집 : 양식의 아동 제어를 통해 되풀이하는 것을 잊어 버렸습니다.

    public class MousePreviewForm : Form
    {
      protected override void OnClosed(EventArgs e)
      {
         UnhookControl(this as Control);
         base.OnClosed(e);
      }

      protected override void OnLoad(EventArgs e)
      {
         base.OnLoad(e);

         HookControl(this as Control);
      }

      private void HookControl(Control controlToHook)
      {
         controlToHook.MouseClick += AllControlsMouseClick;
         foreach (Control ctl in controlToHook.Controls)
         {
            HookControl(ctl);
         }      
      }

      private void UnhookControl(Control controlToUnhook)
      {
         controlToUnhook.MouseClick -= AllControlsMouseClick;
         foreach (Control ctl in controlToUnhook.Controls)
         {
            UnhookControl(ctl);
         }
      }

      void AllControlsMouseClick(object sender, MouseEventArgs e)
      {
         //do clever stuff here...
         throw new NotImplementedException();
      }
   }

그런 다음 양식은 system.windows.forms.form이 아닌 mousepreviewform에서 파생해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top