我正在尝试检测点击,并且只有在实际发生点击后才调整功能。
[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毫秒。
答案 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);
}