C# 点击按钮外的区域会响应按钮消息
adgsq 2017-06-28 10:57:03 今天我做了一个工业项目,要求按钮有WM_LBUTTONDOWN和WM_LBUTTONUP的消息,但是vs2005并没有提供此类的消息,所以我搜索了论坛找到了一个帖子,地址如下
http://bbs.csdn.net/topics/390584447
我按照帖子的内容,的确是解决了这个问题,但是当我处理WM_LBUTTONDOWN这个消息的时候如果弹出对话框,如messagebox的话,再点击窗口的任意位置都会响应按下消息,求问怎么处理?!谢谢
partial class MouseAwareButton : Button
{
private const int WM_LBUTTONDOWN = 0x201;
private const int WM_LBUTTONUP = 0x202;
Control prevParent = null;
public event MouseEventHandler MyMouseUp;
public event MouseEventHandler MyMouseDown;
protected override void OnParentChanged(EventArgs e)
{
if (prevParent != null)
{
WndProcHooker.UnhookWndProc(this, WM_LBUTTONDOWN);
WndProcHooker.UnhookWndProc(this, WM_LBUTTONUP);
}
prevParent = Parent;
if (Parent != null)
{
WndProcHooker.HookWndProc(this, WM_LBUTTONDOWN_Handler, WM_LBUTTONDOWN);
WndProcHooker.HookWndProc(this, WM_LBUTTONUP_Handler, WM_LBUTTONUP);
}
base.OnParentChanged(e);
}
int WM_LBUTTONDOWN_Handler(IntPtr hwnd, uint msg, uint wParam, int lParam, ref bool handled)
{
int x = lParam & 0xffff, y = lParam >> 16;
MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 0, x, y, 0);
if (MyMouseDown != null)
{
MyMouseDown(this, args);
}
prevParent = null;
return 0;
}
int WM_LBUTTONUP_Handler(IntPtr hwnd, uint msg, uint wParam, int lParam, ref bool handled)
{
int x = lParam & 0xffff, y = lParam >> 16;
MouseEventArgs args = new MouseEventArgs(MouseButtons.Left, 0, x, y, 0);
if (MyMouseUp != null)
{
MyMouseUp(this, args);
}
prevParent = null;
return 0;
}
}
private MouseAwareButton button1;
this.button1 = new DeviceApplication2.MouseAwareButton();
this.button1.MyMouseDown += new System.Windows.Forms.MouseEventHandler(this.button1_Click);
private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("测试");
count++;
label1.Text = count.ToString();
}