在一个循环程序中使用了doevents,来交换主动权给系统!
现在遇到一个麻烦的问题:我的程序用来控制电机的行径,当我用鼠标左键点击窗口不放,似乎系统就响应了这个鼠标事件,而不继续执行我的程序,松开鼠标后它会继续执行!有什么办法,在我点击窗口不放时,程序继续执行。注:我发现定时器钟的程序还是可以走的,就是当前含有doevents的循环程序没有继续走。

解决方案 »

  1.   

    使用MouseUp事件而不是MouseDown事件应该可以解决吧
      

  2.   

    你交给系统处理,可是这个貌似系统是优先响应用户操作吧... 你可以在DOEVENT的过程中让程序不响应鼠标...也应该就不会发生这样的事情了...
      

  3.   

    我做了个试验,很简单。
    在Form1上只有command1按钮和text1,代码:
    sub command1_click()
        do
          doevents
           sleep 100
          a = a+1
          text1.text=a
       loop
    end sub
    大家可以试下,command1点击后,text1显示累加。当用鼠标点击窗体上方并且不放开,它就一直在doevents,而不会往下执行。同样,就算你在窗体上方点击鼠标右键,会显示什么:移动、关闭等等的那个菜单时,它依然不会往下执行。
    上面有位大哥说屏蔽点击会不会影响拖动啊?也许可以解决这个问题!
      

  4.   

    没有啊,我测试了你的代码就算我鼠标放在form上面不松开textbox依然累加
      

  5.   

    Option Explicit
    Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
    Private Sub Command1_Click()
      Dim a As Integer
        Do
          DoEvents
          Sleep 100
          a = a + 1
          Text1.Text = a
       Loop
    End Sub为什么我测试却一点问题都没呢,唯一的一点就是卡.... 
      

  6.   

    我的windows xp pro sp2
    按住标题栏计数会停下来,跟楼主描述的一样
      

  7.   

    10楼说的不错,要搞清楚鼠标要点在最上面蓝色的菜单条上,别处不行.其实也能想得通,你在蓝色菜单上点了左键,就是执行拖动窗体的操作,你点了右键,弹出右键菜单,程序在前台运行,你将控制权交给了系统,它执行时VB程序当然要停止.如果要VB运行不停止,要么你不doevents,要么你让VB在后台运行.个人管见.
      

  8.   

    那按照LZ的意思是完全不管消息了???那你就不能放到CLICK之类的消息处理里...尤其是鼠标的... 那时候系统自然会把控制权交给你了... 
      

  9.   

    注:我发现定时器钟的程序还是可以走的,就是当前含有doevents的循环程序没有继续走。 
    可是你想过没,你的那个东西里 SLEEP 100 也就是每执行一次就会休眠100毫秒...你的TIMER如何能正确让他走呢... 你不如把这么个东西扔到TIMER里 TIMER 的中断设置成100 然后让它加... 一点问题都不会有了...当然还有... 能不能达到100毫秒还是个问题... 
      

  10.   

    DOEVENTS根本就是什么... 
    就好比 你跟一个人说好了... 如果我待会打牌去了,你就帮我做作业... 他做的好好的,但是你下场了
                            它就不做了,它就等你去打牌了再帮你做作业它就是一个替补队员而已... 昂德死蛋
      

  11.   

    Private Sub Command1_Click()
      Dim a As Integer
      Form1.Enabled = False//=================那就不响应任何鼠标消息...咋样...你可以设计等到数字到你要的然后解除宵禁  Do
          DoEvents
          Sleep 100
          a = a + 1
          Text1.Text = a
      Loop
      
    End Sub
      

  12.   

    如果你希望在他计数的同时还拖动窗体点这个点那个就 把计算数字的东西直接扔TIMER里处理... 这样比较安逸...
      

  13.   


    click事件,并不只是你按下鼠标,还得你放开鼠标才会触发,所以,你这个例子说明的问题是错误的,并且,我也推断你的实际程序也有同样的错误.
    如果你想在鼠标按下的同时就开始执行动作,请使用MOUSEDOWN事件
      

  14.   

    SORRY,
    我看错了,
    楼主说的不是鼠标在按钮上,而是在标题栏上.这也不是VB或者DOEVENTS的错误.
    请楼主做个试验就知道了, 在开机的时候, windows 的 exproler还未载入的时候,有一个带滚动条的小窗体在屏幕中间提示windows正在启动, 此时,你只要把鼠标点住这个窗体的标题栏不放.
    然后,然后,然后,一直到你按得手酸, windows桌面也不会出来.SO, 改成无边框窗体吧.
      

  15.   

    感谢大家如此踊跃地回答!虽然还是没有解决的方案啊。我这里也只是举一个例子,实际上我的程序量比较大。主要就是解决用鼠标拖动的问题,或者类似于点住不放的问题!
    再次谢谢各位!看看还有没有那位大哥来指点。
    9楼:“是有此种情况发生,那就用多线程吧. ”,我相信可以解决,但是vb的多线程我不会。汗!!!而且听说vb6的多线程相当麻烦,不知哪位大哥指点1、2.
      

  16.   

    使用线程处理你的后台程序,vb的多线程确实麻烦一点,最大的是调试困难,可能连ide一起崩掉。
    不过都有现成的封装,就是调试使用的时候要特别的注意一点
      

  17.   

    DOEVENTS根本就是什么... 
    就好比 你跟一个人说好了... 如果我待会打牌去了,你就帮我做作业... 他做的好好的,但是你下场了 
                            它就不做了,它就等你去打牌了再帮你做作业 它就是一个替补队员而已... 昂德死蛋