在webbrowser控件加载网页的时候,有些网页自己设定了自己的鼠标指针样式,有没有方法只要鼠标样式改变了(比如箭头指针变成手型指针),就提示鼠标样式改变了

kala11234 2009-04-17 01:56:31
在webbrowser控件加载网页的时候,有些网页自己设定了自己的鼠标指针样式,有没有方法只要鼠标样式改变了(比如箭头指针变成手型指针),就提示鼠标样式改变了
所以我想只要能捕获加载网页时的鼠标样式就行了
我看的一些资料说:Windows编程中有两种方法改变指针:一种是当应用的主窗口类注册时,为WNDCLASS结构提供一个全程光标指针(HCURSOR),另外一种方法是在程序中处理WM_SETCURSOR消息来设置鼠标光标。标准的MFC应用程序使用第一种方法自动在主窗口注册时将光标指针设置为一个箭头。如果要改变光标指针,则可以通过在主窗口或子窗口中重载消息WM_SETCURSOR的处理函数来重新设置鼠标指针。(http://www.vckbase.com/vckbase/vckbase9/vc/nonctrls/dialog_11/0911001.htm)


我要的结果是知道鼠标样式是否改变了
那么只要截获WM_SETCURSOR消息就可以的到鼠标的样式,下面是我的方法:

'通用模块

Option Explicit
'窗口函数的地址可以通过AddressOf操作符获得。值得注意的是,第一,窗口函数必须是
'Visual Basic工程中标准模块中的一个函数;第二,窗口必须是自己进程中的,若不是,
'则不能AddressOf操作符对它进行子类处理。

Public 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 Long
Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Public Declare Function LoadCursorFromFile Lib "user32" Alias "LoadCursorFromFileA" (ByVal lpFileName As String) As Long
Public Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

Public Const WM_SETCURSOR = &H20
Public Const GWL_WNDPROC = (-4)
Dim frmWnd As Long
Dim webWnd As Long
Dim OldProc As Long
Public asd As Long
Public runing As Boolean
Dim a As Integer
Public Sub SetCursorForm(hWnd As Long, wwnd As Long) '子窗口句柄,webbrowser1句柄
If OldProc <> 0 Then Exit Sub
frmWnd = hWnd
webWnd = wwnd
OldProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf MyWndProc) '改变窗口函数,备份原来的窗口函数
asd = OldProc
End Sub

'新的窗口函数
Public Function MyWndProc(ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

If wMsg = WM_SETCURSOR Then
a = a + 1
Form1.Text1.Text = a & " " & lParam '在text1记录变化
End If

MyWndProc = CallWindowProc(OldProc, hWnd, wMsg, wParam, lParam)
End Function


Public Sub Release()
If OldProc = 0 Or frmWnd = 0 Then Exit Sub '恢复窗口的默认窗口函数
SetWindowLong frmWnd, GWL_WNDPROC, OldProc
OldProc = 0
frmWnd = 0
End Sub



'-----------------------------------------------------

'在form1上新建一个webbrowser和text控件,在代码框输入以下代码


Option Explicit
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Dim hwndPeer As Long 'webbrowser的句柄

Private Sub Form_Load()
Show
WebBrowser1.Visible = True
WebBrowser1.Navigate ("http://www.hao123.com/")

'获得webbrowser的句柄
hwndPeer = FindWindowEx(Me.hWnd, 0, "Shell Embedding", vbNullString) '网上很多帮助就找到这里就结束了,那是不能收到消息的。
hwndPeer = FindWindowEx(hwndPeer, 0, "Shell DocObject View", vbNullString)
hwndPeer = FindWindowEx(hwndPeer, 0, "Internet Explorer_Server", vbNullString)
SetCursorForm Me.hWnd, webWnd
End Sub

Private Sub Form_Unload(Cancel As Integer)
If asd <> 0 Then Release
End Sub



但是我试的发现与我想的不对,上面的记录变量a和lParam只在鼠标在webbrowser外form1内才发生改变,好像鼠标样式与WM_SETCURSOR无关,但是根据msdn的说法:
lParam
The low-order word of lParam specifies the hit-test code.
The high-order word of lParam specifies the identifier of the mouse message.
high-order就是了~~~
还是wParam不应该是webbrowser的句柄,也不知道是不是其他原因,各位大大帮我找一下原因...........
还有最就是能不能后台截获,就是鼠标不在该控件上,如果在webbrowser控件上指针改变了,那么怎么知道鼠标样式改变了????


...全文
796 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hchack 2009-08-31
  • 打赏
  • 举报
回复
Mark一下
lyserver 2009-04-19
  • 打赏
  • 举报
回复
首先使用FindWindowEx查找类名为"Internet Explorer_Server"的Document的,然后使用GetWindowLong(ieDoc.hwnd,GCL_HCURSOR)获得并保存原来的鼠标,再HOOK Document的消息,在WM_SETCURSOR事件里再次获取鼠标句柄,判断与原来的是否一样,如果不一样,则说明鼠标发生了变化。
PctGL 2009-04-19
  • 打赏
  • 举报
回复
http://www.vbgood.com/viewthread.php?tid=75825&page=1#pid378908

..... 我也找了半天
kala11234 2009-04-17
  • 打赏
  • 举报
回复
搜了很久,找不到啊~~~~~发个地址来啦~~~~
PctGL 2009-04-17
  • 打赏
  • 举报
回复

vbgood 人问过,去搜搜看

1,488

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧