mouse click事件的一点疑惑,高手进来解疑答惑吧 鼠标点击一下,click了,然后就触发click事件,这大家都明白。我的问题是,click了,.net是如何知道这个事件发生了。是windows有一个什么循环机制,比如每隔几毫秒去检测一下是否有click信号,检测到就触发这个事件。还是一旦click,就主动通知.net,我这里click了,你事件可以触发了。这点一直没搞懂,请高手回答。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 sendmessage发送了个消息告诉WINDOWS你单击了个按钮 WndProc做的。具体你应该看下《windows程序设计》这本书, 关于消息机制的介绍。然后用Reflector看下Control类的一部分源码。就知道怎么回事了。 当你用mouse click时,会产生一个中断,windows接收到这个中断后,就会产生一个message,告诉你的程序,click了,这时候你的程序就触发一个click事件 一旦点击, 立刻发出。是windows在调用Control。 不需要轮询。只要消息队列排到就可以了。这点和正常的C++程序是一样的。只不过现在抽象出delegate, 有event了。别的没什么区别。 一旦点击windows就能立即调用?就好比一点击windows就直接知道我点了鼠标了?就好比我一开灯灯就亮了,而不是系统检测到我灯开了,然后再去把等打开?这样的话是不是有一个电路,一旦有电信号,windows就直接获取了??我总觉得这中间缺少了什么环境。 http://www.rupeng.com/forum/thread-9513-1-1-uid48381.html从代码看消息循环。首先来看看什么是消息循环,消息循环就是语言上的一个循环体,并不是什么高深的东西。用while (GetMessage (&msg, NULL, 0, 0))使程序一直陷入消息循环中。while (GetMessage (&msg, NULL, 0, 0)){ TranslateMessage (&msg) ;DispatchMessage (&msg) ; } return msg.wParam ; 其实程序内部有个和上面类似一样的结构,通过msg结构体来标识当前的消息,分析msg就知道当前有什么消息产生,然后再触发不同的事件.就好比你在窗体中做个死循环,循环里面如果不调用Application.DoEvents(),那么整个界面就假死了,既不能移动窗体,鼠标点击也没有反应,就是因为上面的消息循环不能执行到,所以处理不了任何消息了. 所有的外部事件都由OS系统转换成相应的消息发送到应用程序的消息队列C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体//通过覆盖基类的窗体函数拦截消息 protected override void WndProc(ref System.Windows.Forms.Message e) { } 所谓的WndProc它也是一个回调函数而已,因此它也是被底层通知到,而不是它自己去循环。 也就是说,说到底还是轮询的。while语句一直在循环着,可以这么理解吧?如果是轮询,那么轮询的时间是多少间隔呢,有理论值吗? 获取网站验证码的图片文件 C# 用户更改迭代方程 如何给以下保存对话框写一个如果 开始使用ADO的问题 急,几天都没解决,命名空间Microsoft.Office.Interop.Word不存在??? 在C#中怎样使用HOOK函数 高分求解智能客户端(Issuevision)问题!高手帮忙!!!!!! 紧急求助,关于DataTable C#:如何让程序在后台能捕获光驱换盘的操作? 请问在Asp.net服务器端怎样用C#将PDF文件转换成JPG图片,急 C# modopt 关键字是什么意思?有什么用? 问一下关于IEnumerator接口的问题
然后用Reflector看下Control类的一部分源码。就知道怎么回事了。
是windows在调用Control。 不需要轮询。只要消息队列排到就可以了。这点和正常的C++程序是一样的。
只不过现在抽象出delegate, 有event了。别的没什么区别。
就好比我一开灯灯就亮了,而不是系统检测到我灯开了,然后再去把等打开?这样的话是不是有一个电路,一旦有电信号,windows就直接获取了??我总觉得这中间缺少了什么环境。
从代码看消息循环。
首先来看看什么是消息循环,消息循环就是语言上的一个循环体,并不是什么高深的东西。用while (GetMessage (&msg, NULL, 0, 0))使程序一直陷入消息循环中。while (GetMessage (&msg, NULL, 0, 0)){ TranslateMessage (&msg) ;DispatchMessage (&msg) ; } return msg.wParam ;
其实程序内部有个和上面类似一样的结构,通过msg结构体来标识当前的消息,分析msg就知道当前有什么消息产生,然后再触发不同的事件.
就好比你在窗体中做个死循环,循环里面如果不调用Application.DoEvents(),那么整个界面就假死了,既不能移动窗体,鼠标点击也没有反应,就是因为上面的消息循环不能执行到,所以处理不了任何消息了.
C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体
//通过覆盖基类的窗体函数拦截消息
protected override void WndProc(ref System.Windows.Forms.Message e)
{ }
while语句一直在循环着,可以这么理解吧?如果是轮询,那么轮询的时间是多少间隔呢,有理论值吗?