문제
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에서 파생해야합니다.