MouseMove事件,多长时间触发一次呢?
------------------------------------------
这个事件比较不好理解,对于别的事件,如单击,就是明触的单击一次触发一次。
但是这个事件不好理解,当鼠标连接移动时,这个事件会连接触发,即多次触发,但是多长时间触发一次呢?
这个时间间隔是由谁决定的呢?
请大家指教。

解决方案 »

  1.   

    理论上是每移动一个象素就触发一次!
    但当你移动鼠标的速度比系统处理上一条消息所用的时间要短的话
    你会发现两个 MouseMove 消息之间间隔的象素点会距离很远,并不是每一个象素就触发一次消息~
      

  2.   

    那消息队列岂不是没用了?这个消息应该不会像WM_PAINT那样吧?
      

  3.   


    我想他意思的是:“触发”这个行为,从硬件发中断,然后OS,产生消息,这个过程中,
      硬件产生中断的频率:
             1 鼠标硬件本身判断自己移动了多少距离时产生硬件信号,800dpi什么的,就是这意思
            2 主板上中断芯片的处理速度. (获取还涉及到了响应速度……)
      软件上的,就是OS产生消息放到消息队列,这个过程虽然是系统做的,但也是要按照规则的吧:就是由线程去做这件事,这就涉及时间片切换,也许每个版本的系统+硬件本身,这个时间片长短都不定。而程序本身由于GetMessage函数本身消耗的时间,与捕获 鼠标移动消息(switch分支的判断) 所需要的时间也不太确定。总结,这个事件的触发间隔是不定的(从毫秒级说,或者微秒?纳秒?),但如果鼠标移动1秒后还没触发,肯定是哪里出错了……
      

  4.   

    在mousemove里用个定时器看看?不过不知道响应OnTimer函数会不会影响结果
      

  5.   

    和CPU的时间片有没有关系的?
      

  6.   

    BCB XP测试,如果鼠标移动,在控件范围内1秒钟100次。
      

  7.   

    的确是10毫秒触发一次WM_MOUSEMOVE消息。mfc可能不是很准确,直接调用SDK就很方便了:LRESULT WINAPI Hira_WndProc (HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
    {
        static long prev_time = 0;
        if(!prev_time) prev_time = clock();    switch(uMsg) {
            /* ...... */
            case WM_MOUSEMOVE:
                printf("[MOUSEMOVE] T = %d", clock() - prev_time);
                prev_time = clock();
                break;
            /* ...... */
        }
        return TRUE;
    }为了方便调试,Debug的时候用了控制台,得到的T在9~11的范围内徘徊