注:以下代码是Amoon的原创 '===============| 窗体的代码 |============= Private Sub Form_Load() gHTxtWnd = RichTextBox1.hwnd End SubPrivate Sub mnuFind_Click() Dim szFindString As String ' 要查找的字符串 Dim hCmdBtn As Long ' 对话框上的"查找下一个"按钮的句柄 Dim strArr() As Byte ' API使用的动态字节数组 Dim i As Integer ' 循环变量
'初始化要查找的字符串 szFindString = "Find Me"
'根据字符串长度重新定义数组 ReDim strArr(0 To Len(szFindString) - 1)
'将字符串中的字符的ASCII码存入数组 For i = 1 To Len(szFindString) strArr(i - 1) = Asc(Mid(szFindString, i, 1)) Next i '初始化结构 frText With frText .lpfnHook = 0& .lpTemplateName = 0& .lStructSize = Len(frText) .hwndOwner = Me.hwnd .hInstance = App.hInstance .lpstrFindWhat = VarPtr(strArr(0)) .lpstrReplaceWith = 0& .wFindWhatLen = Len(szFindString) .wReplaceWithLen = 0 .lCustData = 0 End With '显示查找对话框 gHDlg = FindText(frText)
'用FindTextHookProc函数替换"查找下一个"按钮原来的窗口函数(即子类化"查找下一个"按钮) If SetWindowLong(hCmdBtn, GWL_WNDPROC, AddressOf FindTextHookProc) = 0 Then gOldDlgWndHandle = 0 End If End SubPrivate Sub mnuReplace_Click() msgbox "呵呵,就照着查找自己写些吧。" End Sub'获得要被查找的字符串 Private Sub RichTextBox1_Change() gTxtSrc = RichTextBox1.Text End Sub'=========| 模块的代码 |========== Option ExplicitPublic Type FINDREPLACE lStructSize As Long hwndOwner As Long hInstance As Long flags As Long lpstrFindWhat As Long lpstrReplaceWith As Long wFindWhatLen As Integer wReplaceWithLen As Integer lCustData As Long lpfnHook As Long lpTemplateName As Long End TypePublic Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA" (pFindreplace As FINDREPLACE) As Long Public Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" _ (pFindreplace As FINDREPLACE) 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long 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 GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long Public Declare Function IsDlgButtonChecked Lib "user32" (ByVal hDlg As Long, ByVal nIDButton As Long) As Long Public Declare Function GetDlgItemText Lib "user32" Alias "GetDlgItemTextA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String, ByVal nMaxCount As Long) As LongPublic Const GWL_WNDPROC = (-4) Public Const WM_LBUTTONDOWN = &H201Public Const FR_DIALOGTERM = &H40 Public Const FR_DOWN = &H1 Public Const FR_ENABLEHOOK = &H100 Public Const FR_ENABLETEMPLATE = &H200 Public Const FR_ENABLETEMPLATEHANDLE = &H2000 Public Const FR_FINDNEXT = &H8 Public Const FR_HIDEMATCHCASE = &H8000 Public Const FR_HIDEUPDOWN = &H4000 Public Const FR_HIDEWHOLEWORD = &H10000 Public Const FR_MATCHCASE = &H4 Public Const FR_NOMATCHCASE = &H800 Public Const FR_NOUPDOWN = &H400 Public Const FR_NOWHOLEWORD = &H1000 Public Const FR_REPLACE = &H10 Public Const FR_REPLACEALL = &H20 Public Const FR_SHOWHELP = &H80 Public Const FR_WHOLEWORD = &H2Public Const EM_SETSEL = &HB1Public Const MaxPatternLen = 50 ' Maximum Pattern LengthGlobal gOldDlgWndHandle As Long Global frText As FINDREPLACE Global gTxtSrc As String Global gHDlg As Long Global gHTxtWnd As LongFunction FindTextHookProc(ByVal hDlg As Long, ByVal uMsg As Long, _ ByVal wParam As Long, ByVal lParam As Long) As LongDim strPtn As String ' pattern string Dim hTxtBox As Long ' handle of the text box in dialog box Dim ptnLen As Integer ' actual length read by GetWindowString Dim sp As Integer ' start point of matching string Dim ep As Integer ' end point of matchiing string Dim ret As Long ' return value for SendMessagestrPtn = Space(MaxPatternLen) Select Case uMsg Case WM_LBUTTONDOWN ' Get the pattern string ptnLen = GetDlgItemText(gHDlg, &H480, strPtn, MaxPatternLen)
' Call default window procedure If gOldDlgWndHandle <> 0 Then FindTextHookProc = CallWindowProc(gOldDlgWndHandle, _ hDlg, uMsg, wParam, lParam) End If
' Customize the winodw procedure If ptnLen <> 0 Then strPtn = Left(strPtn, ptnLen) SetFocus gHTxtWnd
' Get the MatchCase option If IsDlgButtonChecked(gHDlg, &H411) = 0 Then sp = InStr(LCase(gTxtSrc), LCase(strPtn)) Else sp = InStr(gTxtSrc, strPtn) End If
sp = IIf(sp = 0, -1, sp - 1)
If sp = -1 Then Call MessageNoFound End If
ep = Len(strPtn) ret = SendMessage(gHTxtWnd, EM_SETSEL, sp, sp + ep) End If
Case Else ' Call the default window procedure If gOldDlgWndHandle <> 0 Then FindTextHookProc = CallWindowProc(gOldDlgWndHandle, _ hDlg, uMsg, wParam, lParam) End If End Select End FunctionSub MessageNoFound() MsgBox "呵呵,不要开玩笑啦,根本就没有嘛!" End Sub
'===============| 窗体的代码 |=============
Private Sub Form_Load()
gHTxtWnd = RichTextBox1.hwnd
End SubPrivate Sub mnuFind_Click()
Dim szFindString As String ' 要查找的字符串
Dim hCmdBtn As Long ' 对话框上的"查找下一个"按钮的句柄
Dim strArr() As Byte ' API使用的动态字节数组
Dim i As Integer ' 循环变量
'初始化要查找的字符串
szFindString = "Find Me"
'根据字符串长度重新定义数组
ReDim strArr(0 To Len(szFindString) - 1)
'将字符串中的字符的ASCII码存入数组
For i = 1 To Len(szFindString)
strArr(i - 1) = Asc(Mid(szFindString, i, 1))
Next i '初始化结构 frText
With frText
.lpfnHook = 0&
.lpTemplateName = 0&
.lStructSize = Len(frText)
.hwndOwner = Me.hwnd
.hInstance = App.hInstance
.lpstrFindWhat = VarPtr(strArr(0))
.lpstrReplaceWith = 0&
.wFindWhatLen = Len(szFindString)
.wReplaceWithLen = 0
.lCustData = 0
End With '显示查找对话框
gHDlg = FindText(frText)
'取得"查找下一个"按钮的窗口句柄
hCmdBtn = GetDlgItem(gHDlg, 1)
'取得"查找下一个"按钮原来的窗口函数地址
gOldDlgWndHandle = GetWindowLong(hCmdBtn, GWL_WNDPROC)
'用FindTextHookProc函数替换"查找下一个"按钮原来的窗口函数(即子类化"查找下一个"按钮)
If SetWindowLong(hCmdBtn, GWL_WNDPROC, AddressOf FindTextHookProc) = 0 Then
gOldDlgWndHandle = 0
End If
End SubPrivate Sub mnuReplace_Click()
msgbox "呵呵,就照着查找自己写些吧。"
End Sub'获得要被查找的字符串
Private Sub RichTextBox1_Change()
gTxtSrc = RichTextBox1.Text
End Sub'=========| 模块的代码 |==========
Option ExplicitPublic Type FINDREPLACE
lStructSize As Long
hwndOwner As Long
hInstance As Long
flags As Long
lpstrFindWhat As Long
lpstrReplaceWith As Long
wFindWhatLen As Integer
wReplaceWithLen As Integer
lCustData As Long
lpfnHook As Long
lpTemplateName As Long
End TypePublic Declare Function FindText Lib "comdlg32.dll" Alias "FindTextA" (pFindreplace As FINDREPLACE) As Long
Public Declare Function ReplaceText Lib "comdlg32.dll" Alias "ReplaceTextA" _
(pFindreplace As FINDREPLACE) 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 GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
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 GetDlgItem Lib "user32" (ByVal hDlg As Long, ByVal nIDDlgItem As Long) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function IsDlgButtonChecked Lib "user32" (ByVal hDlg As Long, ByVal nIDButton As Long) As Long
Public Declare Function GetDlgItemText Lib "user32" Alias "GetDlgItemTextA" (ByVal hDlg As Long, ByVal nIDDlgItem As Long, ByVal lpString As String, ByVal nMaxCount As Long) As LongPublic Const GWL_WNDPROC = (-4)
Public Const WM_LBUTTONDOWN = &H201Public Const FR_DIALOGTERM = &H40
Public Const FR_DOWN = &H1
Public Const FR_ENABLEHOOK = &H100
Public Const FR_ENABLETEMPLATE = &H200
Public Const FR_ENABLETEMPLATEHANDLE = &H2000
Public Const FR_FINDNEXT = &H8
Public Const FR_HIDEMATCHCASE = &H8000
Public Const FR_HIDEUPDOWN = &H4000
Public Const FR_HIDEWHOLEWORD = &H10000
Public Const FR_MATCHCASE = &H4
Public Const FR_NOMATCHCASE = &H800
Public Const FR_NOUPDOWN = &H400
Public Const FR_NOWHOLEWORD = &H1000
Public Const FR_REPLACE = &H10
Public Const FR_REPLACEALL = &H20
Public Const FR_SHOWHELP = &H80
Public Const FR_WHOLEWORD = &H2Public Const EM_SETSEL = &HB1Public Const MaxPatternLen = 50 ' Maximum Pattern LengthGlobal gOldDlgWndHandle As Long
Global frText As FINDREPLACE
Global gTxtSrc As String
Global gHDlg As Long
Global gHTxtWnd As LongFunction FindTextHookProc(ByVal hDlg As Long, ByVal uMsg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As LongDim strPtn As String ' pattern string
Dim hTxtBox As Long ' handle of the text box in dialog box
Dim ptnLen As Integer ' actual length read by GetWindowString
Dim sp As Integer ' start point of matching string
Dim ep As Integer ' end point of matchiing string
Dim ret As Long ' return value for SendMessagestrPtn = Space(MaxPatternLen) Select Case uMsg
Case WM_LBUTTONDOWN
' Get the pattern string
ptnLen = GetDlgItemText(gHDlg, &H480, strPtn, MaxPatternLen)
' Call default window procedure
If gOldDlgWndHandle <> 0 Then
FindTextHookProc = CallWindowProc(gOldDlgWndHandle, _
hDlg, uMsg, wParam, lParam)
End If
' Customize the winodw procedure
If ptnLen <> 0 Then
strPtn = Left(strPtn, ptnLen)
SetFocus gHTxtWnd
' Get the MatchCase option
If IsDlgButtonChecked(gHDlg, &H411) = 0 Then
sp = InStr(LCase(gTxtSrc), LCase(strPtn))
Else
sp = InStr(gTxtSrc, strPtn)
End If
sp = IIf(sp = 0, -1, sp - 1)
If sp = -1 Then
Call MessageNoFound
End If
ep = Len(strPtn)
ret = SendMessage(gHTxtWnd, EM_SETSEL, sp, sp + ep)
End If
Case Else
' Call the default window procedure
If gOldDlgWndHandle <> 0 Then
FindTextHookProc = CallWindowProc(gOldDlgWndHandle, _
hDlg, uMsg, wParam, lParam)
End If
End Select
End FunctionSub MessageNoFound()
MsgBox "呵呵,不要开玩笑啦,根本就没有嘛!"
End Sub
dsclub : WebBrowser不适用,一取hwnd就报错“对象HWND的方法IWebBrowser2失败”楼主也是,怎么还给分,纯属误导嘛