我的怎么不会呢? 不过,我的是用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
to kob(无助的人) : 只要焦点不要设在下拉框上就行了 谢谢,问题是我需要修改该下拉框的文本,那只有让它获得焦点,但当鼠标点击下拉框中的文本获得插入点后,此时如果不小心滚动了鼠标滚轮(也有的鼠标只要有震动就可能产生自动滚轮现象),该下拉框的文本就变成该下拉框的其他的Item了。to weill(每天提一问,一天学一点) 谢谢你提供的代码,我也是用该法弹开下拉框,不过我的下拉框的Item中的文字较长,且都要手工修改、添加少许字符,问题就出现在修改文字的时候。to minghui000(绿豆冰好好味) 其实如果使用者注意的话,的确没有必要,但是客户不是计算机高手,而且操作鼠标时手指经常也会无意中碰到滚轮,致命的是如果一旦下拉框的文本发生了改变,客户辛辛苦苦在下拉框中修改输入的文本就消失了,只有重新修改输入了。客户一再抱怨,我也想解决这个问题!请各位在给点意见!谢谢,结贴后肯定送分!
to goodname008(卢培培,想学好VB): 谢谢帮助,您的方法我觉得很可行!另外我如何知道我的应用程序处于活动状态,或者不活动状态(比如IE浏览器处于活动状态)呢? to mafangsan(mafangsan): 谢谢帮助,很惭愧,我的水平很低,这两种方法我一种都不会,我不知道什么是插队函数,也不知道怎样获得滚轮事件。能推荐些教材给我吗,我要努力学习! to kob(无助的人):谢谢帮助,问题是我怎样才能获得滚轮事件呢?据我所知在VB里鼠标事件里有Click、dbclick、mousedown等事件,但是没有“滚轮事件”。 to alicky(周松) :有点思路了,但是因为水平低,代码仍然不会写!
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
'''以下代码设置系统级鼠标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
不过,我的是用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
谢谢,问题是我需要修改该下拉框的文本,那只有让它获得焦点,但当鼠标点击下拉框中的文本获得插入点后,此时如果不小心滚动了鼠标滚轮(也有的鼠标只要有震动就可能产生自动滚轮现象),该下拉框的文本就变成该下拉框的其他的Item了。to weill(每天提一问,一天学一点)
谢谢你提供的代码,我也是用该法弹开下拉框,不过我的下拉框的Item中的文字较长,且都要手工修改、添加少许字符,问题就出现在修改文字的时候。to minghui000(绿豆冰好好味)
其实如果使用者注意的话,的确没有必要,但是客户不是计算机高手,而且操作鼠标时手指经常也会无意中碰到滚轮,致命的是如果一旦下拉框的文本发生了改变,客户辛辛苦苦在下拉框中修改输入的文本就消失了,只有重新修改输入了。客户一再抱怨,我也想解决这个问题!请各位在给点意见!谢谢,结贴后肯定送分!
1、打开注册表编辑器。
2、打开下面所示位置。双击右侧窗口中的"WheelScrollLines",并将其数值设置为你想要设置的值。位置:HKEY_CURRENT_USER\Control Panel\Desktop用VB修改注册表就可以了,具体怎么修改可以到网上搜搜,CSDN以前的贴子也都说过了。
如果要防止在其他程序中不屏蔽,可以在程序失去焦点时再改回去,获得焦点时改回来。
当然如果以上两个你都能实现,那么你水平就不错了加油
to mafangsan(mafangsan): 谢谢帮助,很惭愧,我的水平很低,这两种方法我一种都不会,我不知道什么是插队函数,也不知道怎样获得滚轮事件。能推荐些教材给我吗,我要努力学习!
to kob(无助的人):谢谢帮助,问题是我怎样才能获得滚轮事件呢?据我所知在VB里鼠标事件里有Click、dbclick、mousedown等事件,但是没有“滚轮事件”。
to alicky(周松) :有点思路了,但是因为水平低,代码仍然不会写!
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
===================================
''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
int nCode, // hook code
WPARAM wParam, // message identifier
LPARAM lParam // mouse coordinates
);相对来说,反而比我写给你的简单,自己完成吧
谢谢你们的热情帮助,我用你们的方法试一试!我目前的水平很低,向各位大侠学习!
结贴,送分!