各位大侠,我的客户一直抱怨:我用VB编的程序中的下拉框ComboBox控件在使用时,经常一不小心动了鼠标的滚轮,下拉框的内容就被改变了,我如何才能在我的应用程序中屏蔽鼠标的滚轮功能呢,但是在程序之外滚轮不可屏蔽(比如IE浏览器需要滚轮来上下移动网页),怎么办呢,或者有什么其他办法呢?谢谢,请各位大侠帮忙!

解决方案 »

  1.   

    aalei(阿磊) 谢谢你的回答,不过我不太理解,可以告诉我具体方法吗,非常感谢!
      

  2.   

    我的怎么不会呢?
    不过,我的是用SendMessage函数激出的下拉框。在win2k下,VB6.0+SP5下没有这种情况。你建一个窗体,里面放一个ComboBox控件名为:Combo1(默认就是这个)。
    然后在窗体里放上以下代码,运行看看:'这儿是声明API函数SendMessage
    Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Public Const CB_SHOWDROPDOWN = &H14F'这儿是激出下拉单的动作,在这里,当你按动键盘上的上下方向键时激出下拉单。
    Private Sub Combo1_KeyDown(KeyCode As Integer, Shift As Integer)
    If KeyCode = 38 Or KeyCode = 40 Then
        SendMessage Combo1.hwnd, CB_SHOWDROPDOWN, True, 0
    End If
    End Sub'窗体装载时作一些准备工作,初始化Combo1。
    Private Sub Form_Load()
    With Combo1
        .Text = "年"
        .AddItem "年"
        .AddItem "月"
        .AddItem "日"
        .AddItem "周"
    End WithEnd Sub
      

  3.   

    to kob(无助的人) :  只要焦点不要设在下拉框上就行了
    谢谢,问题是我需要修改该下拉框的文本,那只有让它获得焦点,但当鼠标点击下拉框中的文本获得插入点后,此时如果不小心滚动了鼠标滚轮(也有的鼠标只要有震动就可能产生自动滚轮现象),该下拉框的文本就变成该下拉框的其他的Item了。to    weill(每天提一问,一天学一点) 
     谢谢你提供的代码,我也是用该法弹开下拉框,不过我的下拉框的Item中的文字较长,且都要手工修改、添加少许字符,问题就出现在修改文字的时候。to   minghui000(绿豆冰好好味)
      其实如果使用者注意的话,的确没有必要,但是客户不是计算机高手,而且操作鼠标时手指经常也会无意中碰到滚轮,致命的是如果一旦下拉框的文本发生了改变,客户辛辛苦苦在下拉框中修改输入的文本就消失了,只有重新修改输入了。客户一再抱怨,我也想解决这个问题!请各位在给点意见!谢谢,结贴后肯定送分!
      

  4.   

    设置鼠标滚动:    滚轮鼠标已经很普及了,用户可以通过修改注册表来设置该鼠标滚轮转动一圈屏幕内容滚动多少行。操作步骤如下:
        1、打开注册表编辑器。
        2、打开下面所示位置。双击右侧窗口中的"WheelScrollLines",并将其数值设置为你想要设置的值。位置:HKEY_CURRENT_USER\Control Panel\Desktop用VB修改注册表就可以了,具体怎么修改可以到网上搜搜,CSDN以前的贴子也都说过了。
    如果要防止在其他程序中不屏蔽,可以在程序失去焦点时再改回去,获得焦点时改回来。
      

  5.   

    你在你的程序中写一个插队函数当鼠标滚动事件发生就直接吃掉该事件或者你用C++写个鼠标HOOK拦截滚轮事件
    当然如果以上两个你都能实现,那么你水平就不错了加油
      

  6.   

    对,在keypress事件的时候记下当前的值,然后捕捉事件,如果是鼠标滚动事件就把值给设回去.
      

  7.   

    to   goodname008(卢培培,想学好VB): 谢谢帮助,您的方法我觉得很可行!另外我如何知道我的应用程序处于活动状态,或者不活动状态(比如IE浏览器处于活动状态)呢?
    to   mafangsan(mafangsan): 谢谢帮助,很惭愧,我的水平很低,这两种方法我一种都不会,我不知道什么是插队函数,也不知道怎样获得滚轮事件。能推荐些教材给我吗,我要努力学习!
    to   kob(无助的人):谢谢帮助,问题是我怎样才能获得滚轮事件呢?据我所知在VB里鼠标事件里有Click、dbclick、mousedown等事件,但是没有“滚轮事件”。
    to   alicky(周松) :有点思路了,但是因为水平低,代码仍然不会写!
      

  8.   

    Option Explicit
    Private Declare Function GetActiveWindow Lib "user32" () As LongPrivate Sub Form_Load()
        Timer1.Interval = 1
    End SubPrivate Sub Timer1_Timer()
        Dim ret As Long
        ret = GetActiveWindow()
        ' ret 返回的是系统中当前活动窗口的句柄
        ' 用 API 中的 GetWindowText 函数可以获得当前活动窗口的标题来判断是什么程序
        If ret <> Me.hWnd Then
            ' 我的程序失去焦点了
            ' 去写注册表把鼠标滚轮设成正常
        Else
            ' 去写注册表把屏蔽鼠标滚轮
        End If
    End Sub
      

  9.   

    '''以下代码设置系统级鼠标HOOK ,程序运行时屏蔽鼠标滑轮,退出程序时解除HOOK
    ===================================
    ''form1:
    Sub form_load()
       lMouseHook = SetWindowsHookEx(WH_MOUSE_LL, AddressOf LowLevelMouseProc, App.hInstance, 0)
    End SubPrivate Sub Form_DblClick()
       Unload Me
    End SubPrivate Sub Form_Unload(Cancel As Integer)
       If lMouseHook <> 0 Then
          UnhookWindowsHookEx lMouseHook
       End If
    End Sub'''module1:
    Public Declare Function SetWindowsHookEx Lib "user32" Alias "SetWindowsHookExA" (ByVal idHook As Long, ByVal lpfn As Long, ByVal hmod As Long, ByVal dwThreadId As Long) As Long
    Public Declare Function UnhookWindowsHookEx Lib "user32" (ByVal hHook As Long) As Long
    Public Declare Function CallNextHookEx Lib "user32" (ByVal hHook As Long, ByVal ncode As Long, ByVal wParam As Long, lParam As Any) As Long
    Type EVENTMSG
            message As Long
            paramL As Long
            paramH As Long
            time As Long
            hwnd As Long
    End TypePrivate Type POINTAPI
        x As Long
        y As Long
    End TypePublic Const WH_MOUSE_LL = 14
    Public Const HC_ACTION = 0
    Public Const WM_MOUSEWHEEL = &H20APublic msgs As EVENTMSG
    Public lMouseHook As LongPublic Function LowLevelMouseProc(ByVal code As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If code = HC_ACTION Then
          Select Case wParam
            Case WM_MOUSEWHEEL
                Form1.Caption = "mouse wheel"
                
                LowLevelMouseProc = -1
          End Select
        End If    If code <> 0 Then
          LowLevelMouseProc = CallNextHookEx(0, code, wParam, lParam)
        End If
      
    End Function
      

  10.   

    "在我的应用程序中屏蔽鼠标的滚轮功能呢,但是在程序之外滚轮不可屏蔽(比如IE浏览器需要滚轮来上下移动网页)"实现这个亦不难,只要把 WH_MOUSE_LL 换成 WH_MOUSE然后对应的回调用这个函数:LRESULT CALLBACK MouseProc(
      int nCode,      // hook code
      WPARAM wParam,  // message identifier
      LPARAM lParam   // mouse coordinates
    );相对来说,反而比我写给你的简单,自己完成吧
      

  11.   

    to  wxy_xiaoyu(☆然也☆ => .NET 努力ing) 、 goodname008(卢培培,想学好VB)、等等回复的大侠:
         谢谢你们的热情帮助,我用你们的方法试一试!我目前的水平很低,向各位大侠学习!
    结贴,送分!