3

我试图检测单击并仅在单击实际发生后才调用函数。

[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 毫秒。

4

2 回答 2

4

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:鼠标输入通知,有关所有 wndproc 消息的列表,请参阅MSDN 系统定义消息

于 2013-07-12T08:06:25.513 回答
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);
}
于 2013-07-12T07:54:57.267 回答