鼠标点击一下,click了,然后就触发click事件,这大家都明白。我的问题是,click了,.net是如何知道这个事件发生了。是windows有一个什么循环机制,比如每隔几毫秒去检测一下是否有click信号,检测到就触发这个事件。还是一旦click,就主动通知.net,我这里click了,你事件可以触发了。这点一直没搞懂,请高手回答。

解决方案 »

  1.   

    sendmessage发送了个消息告诉WINDOWS你单击了个按钮
      

  2.   

    WndProc做的。具体你应该看下《windows程序设计》这本书, 关于消息机制的介绍。
    然后用Reflector看下Control类的一部分源码。就知道怎么回事了。
      

  3.   

    当你用mouse click时,会产生一个中断,windows接收到这个中断后,就会产生一个message,告诉你的程序,click了,这时候你的程序就触发一个click事件
      

  4.   

    一旦点击, 立刻发出。
    是windows在调用Control。 不需要轮询。只要消息队列排到就可以了。这点和正常的C++程序是一样的。
    只不过现在抽象出delegate, 有event了。别的没什么区别。
      

  5.   

    一旦点击windows就能立即调用?就好比一点击windows就直接知道我点了鼠标了?
    就好比我一开灯灯就亮了,而不是系统检测到我灯开了,然后再去把等打开?这样的话是不是有一个电路,一旦有电信号,windows就直接获取了??我总觉得这中间缺少了什么环境。
      

  6.   

    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(),那么整个界面就假死了,既不能移动窗体,鼠标点击也没有反应,就是因为上面的消息循环不能执行到,所以处理不了任何消息了.
      

  7.   

    所有的外部事件都由OS系统转换成相应的消息发送到应用程序的消息队列
    C#中的消息被Application类从应用程序消息队列中取出,然后分发到消息对应的窗体
    //通过覆盖基类的窗体函数拦截消息 
     protected override void WndProc(ref System.Windows.Forms.Message e) 
     { }
      

  8.   

    所谓的WndProc它也是一个回调函数而已,因此它也是被底层通知到,而不是它自己去循环。
      

  9.   

    也就是说,说到底还是轮询的。
    while语句一直在循环着,可以这么理解吧?如果是轮询,那么轮询的时间是多少间隔呢,有理论值吗?