用的是xp sp3和VB 6.0鼠标移动的WM_MOUSEMOVE=&H200以及鼠标滚轮按下的消息&H207我都可以截获到但鼠标滚轮滚动的WM_MOUSEWHEEL=&H20A我截获不到啊!!!!如果截获到会弹出一个msgbox告诉我,并且我用timer控件一直在text1中显示截获的msg,我滑动滚轮时text1没有任何变化,但我按滚轮,移动鼠标等操作是有变化的,详见下面程序代码!!!!程序如下(想要实现datagrid支持滚轮):'-------bas模块部分代码
Option Explicit
Public Conn As ADODB.Connection
Public Rst As ADODB.Recordset
Public umsg1 As Long'bas里的代码:(钩子得用GetWindowLong、SetWindowLong、CallWindowProc三个API,SetWindowLong要用到AddressOf回调自己的窗口函数,故要在工程里建立标准模块。好像有点废话呀)Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H207Public lpWndProc As LongPublic Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WindowProc '装载WM_MOUSEWHEEL消息的处理过程到窗口函数
End SubPublic Sub UnHook(hwnd As Long) SetWindowLong hwnd, GWL_WNDPROC, lpWndProc '御掉Hook,还原原始窗口函数End SubFunction WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'处理WM_MOUSEWHEEL消息的窗口函数
umsg1 = uMsg
If uMsg = WM_MOUSEWHEEL Then
MsgBox "nimei", vbInformation
Dim wzDelta As Integer
wzDelta = HIWORD(wParam)
If Sgn(wzDelta) = 1 Then
Form1.DataGrid.Scroll 0, -1
Else
Form1.DataGrid.Scroll 0, 1
End If
End If
WindowProc = CallWindowProc(lpWndProc, hwnd, uMsg, wParam, lParam)End FunctionPublic Function HIWORD(MsgParam As Long) As Integer
'取出32位值的高16位
HIWORD = (MsgParam And &HFFFF0000) \ &H10000
End Function'----------------form1窗体代码
Option ExplicitPrivate Sub Form_Load()
Set Conn = New ADODB.Connection
Set Rst = New ADODB.Recordset
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\soken.mdb"
Rst.CursorLocation = adUseClient
Rst.Open "select * from 111209", "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\soken.mdb", adOpenKeyset, adLockPessimistic
Set DataGrid.DataSource = Rst
Hook DataGrid.hwnd
End SubPrivate Sub Form_Unload(Cancel As Integer)
UnHook DataGrid.hwnd
End SubPrivate Sub Timer1_Timer()
Text1.Text = umsg1
End Sub
Option Explicit
Public Conn As ADODB.Connection
Public Rst As ADODB.Recordset
Public umsg1 As Long'bas里的代码:(钩子得用GetWindowLong、SetWindowLong、CallWindowProc三个API,SetWindowLong要用到AddressOf回调自己的窗口函数,故要在工程里建立标准模块。好像有点废话呀)Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_MOUSEWHEEL = &H207Public lpWndProc As LongPublic Sub Hook(hwnd As Long)
lpWndProc = GetWindowLong(hwnd, GWL_WNDPROC) '获得原始窗口函数句柄
SetWindowLong hwnd, GWL_WNDPROC, AddressOf WindowProc '装载WM_MOUSEWHEEL消息的处理过程到窗口函数
End SubPublic Sub UnHook(hwnd As Long) SetWindowLong hwnd, GWL_WNDPROC, lpWndProc '御掉Hook,还原原始窗口函数End SubFunction WindowProc(ByVal hwnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
'处理WM_MOUSEWHEEL消息的窗口函数
umsg1 = uMsg
If uMsg = WM_MOUSEWHEEL Then
MsgBox "nimei", vbInformation
Dim wzDelta As Integer
wzDelta = HIWORD(wParam)
If Sgn(wzDelta) = 1 Then
Form1.DataGrid.Scroll 0, -1
Else
Form1.DataGrid.Scroll 0, 1
End If
End If
WindowProc = CallWindowProc(lpWndProc, hwnd, uMsg, wParam, lParam)End FunctionPublic Function HIWORD(MsgParam As Long) As Integer
'取出32位值的高16位
HIWORD = (MsgParam And &HFFFF0000) \ &H10000
End Function'----------------form1窗体代码
Option ExplicitPrivate Sub Form_Load()
Set Conn = New ADODB.Connection
Set Rst = New ADODB.Recordset
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\soken.mdb"
Rst.CursorLocation = adUseClient
Rst.Open "select * from 111209", "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\soken.mdb", adOpenKeyset, adLockPessimistic
Set DataGrid.DataSource = Rst
Hook DataGrid.hwnd
End SubPrivate Sub Form_Unload(Cancel As Integer)
UnHook DataGrid.hwnd
End SubPrivate Sub Timer1_Timer()
Text1.Text = umsg1
End Sub
解决方案 »
- 文件属性问题?
- 如何提高读取Access数据库的效率?
- 求教如何写取得表中某列中数值最大值得sql代码,谢谢!!!
- 常数表示问题
- 使用drawtextex绘制文字时,如何设置文字字体属性?
- 求救!!!:为什么用net8测试Oracle数据库正常,但是用CreateDataSource("","","")连接时却返回False?
- 毕业设计 房地产项目管理系统
- ◆LINK : warning LNK4089: all references to "SHELL32.dll" discarded by /OPT:REF
- 随机函数的编写
- 怎样在VB中频蔽掉“开始”菜单和工具栏?(UP有分)
- vb如何实现按F1键就出现*
- 如何对这样的字符进行操作
我现在问题是截获不到&H20A这个消息,如果能截获到,怎么处理我是知道的
不过用你的程序就可以了诶,难道setwindowlong本来就不行吗?
我知道原因了,我把一下语句注释掉就好了:Set Conn = New ADODB.Connection
Set Rst = New ADODB.Recordset
Conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\soken.mdb"
Rst.CursorLocation = adUseClient
Rst.Open "select * from 111209", "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=D:\soken.mdb", adOpenKeyset, adLockPessimistic
Set DataGrid.DataSource = Rst但让datagrid读取数据库就读不到滚轮的消息,还没找到根本原因啊我试过加一行Set Rst = Nothing: Set Conn = Nothing也没什么用处,有没有大神知道为什么啊