C#检测WndProc中的Click并在单击发生后调用函数

时间:2013-07-12 06:10:42

标签: c# winforms

我正在尝试检测点击,并且只有在实际发生点击后才调整功能。

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m) {
    //Detect a Click
    if (m.Msg == 0x210 && m.WParam.ToInt32() == 513){
        lastClick = DateTime.Now;
        clickedHappened();
        Debug.Print("Click Detected!");
    }

    base.WndProc(ref m);

}

private void clickedHappened(){
    MessageBox.Show("Click Already Happened");
}

我认为 WndProc 会在实际点击发生之前发生 我想知道是否有办法解决这个问题而不使用计时器?或sleep(400);

我能想到的唯一解决方案是使用计时器,但我想摆脱一些现有的计时器。在 WndProc 中检测到点击后,似乎实际上发生了200 - 350毫秒。

2 个答案:

答案 0 :(得分:3)

WndProc是Window Procedure的缩写,它是处理窗口,绘图,鼠标捕获,键盘捕获,调整大小等所有内容的过程......

还有几种方法可以捕获鼠标以获得不同的结果

[System.Security.Permissions.PermissionSet(System.Security.Permissions.SecurityAction.Demand, Name = "FullTrust")]
protected override void WndProc(ref Message m)
{
    switch(m.Msg)
    {
         case 0x201:
           //left button down
           break;
          case 0x202:
           clickedHappened(); //left button up, ie. a click
           break;
         case 0x203:
           //left button double click
           break;
    }

    base.WndProc(ref m);
}

问题是,C#中的windows窗体已经为你和WndProc处理了所有这些,触发事件并没有真正需要自己处理WndProc这类事情。

有关鼠标通知消息的完整列表,请参阅MSDN: Mouse Input Notifications以及所有wndproc消息的列表,请参阅MSDN System Defined Messages

答案 1 :(得分:0)

可能您可以处理单击后发生的WM_LBUTTONUP消息。 你可以这样做:

const int WM_LBUTTONUP = 0x202;

protected override void WndProc(ref Message m)
{
    if (m.Msg == WM_LBUTTONUP)
    {               
        clickedHappened();
    }

    base.WndProc(ref m);
}