先添加一个模块,将工程的启动对象设为 sub main,在模块中添加如下代码: Option Explicit Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" _ (ByVal lpLibFileName As String) As Long Public Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As LongPublic Declare Function CreateDialogParam Lib "user32.dll" _ Alias "CreateDialogParamA" ( _ ByVal hInstance As Long, ByVal lpName As Long, _ ByVal hWndParent As Long, ByVal lpDialogFunc As Long, _ ByVal lParamInit As Long) As LongPublic Const SW_SHOW As Long = 5 Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long Public Const WM_SYSCOMMAND As Long = &H112 Public Const SC_CLOSE As Long = &HF060& Public Declare Function EndDialog Lib "user32.dll" (ByVal hDlg As Long, ByVal nResult As Long) As Long Public Declare Function GetMessage Lib "user32.dll" Alias "GetMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long Public Declare Function TranslateMessage Lib "user32.dll" (ByRef lpMsg As MSG) As Long Public Declare Function DispatchMessage Lib "user32.dll" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Long Public Declare Sub PostQuitMessage Lib "user32.dll" (ByVal nExitCode As Long) Public Type POINTAPI x As Long y As Long End Type Public Type MSG hwnd As Long message As Long wParam As Long lParam As Long time As Long pt As POINTAPI End TypePublic Function DialogProc( _ ByVal hwndDlg&, ByVal uMsg&, _ ByVal wParam&, ByVal lParam&) As Long If uMsg = WM_SYSCOMMAND Then If wParam = SC_CLOSE Then Call EndDialog(hwndDlg, 0) PostQuitMessage 0 DialogProc = 0 End If End If End Function Public Sub Main() Dim hDlg& Dim tMsg As MSG Dim hIns&hIns = LoadLibrary("input.dll") hDlg = CreateDialogParam(hIns, 511, _ 0, AddressOf DialogProc, 0) FreeLibrary hInsShowWindow hDlg, SW_SHOWWhile GetMessage(tMsg, 0, 0, 0) Call TranslateMessage(tMsg) Call DispatchMessage(tMsg) WendEnd Sub运行程序(最好将程序编译后再测试)
以上仅仅是显示了input.dll中的对话框资源,事实上这个对话框是不能正常工作的
嘿,转了一圈回来了....看来现在就咱俩最活跃啊:)我的思路是模拟鼠标点击.......Option ExplicitPrivate Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long) Private Const GW_CHILD As Long = 5 Private Const GW_HWNDFIRST As Long = 0 Private Const GW_HWNDNEXT As Long = 2 Private Const WM_LBUTTONDOWN As Long = &H201 Private Const WM_LBUTTONUP As Long = &H202Dim tHwnd As LongPrivate Sub TestClick() Dim I As Long, J As Long
I = Shell("RunDll32.exe shell32.dll,Control_RunDLL C:\WINDOWS\system32\input.dll") If I = 0 Then MsgBox "error!" Exit Sub End If I = 0 Do J = FindWindow(vbNullString, "文字服务和输入语言") DoEvents Sleep 20 I = I + 1 If I > 15 Then Exit Sub '超时3秒 If J <> 0 Then Debug.Print J Exit Do End If Loop Call GetHwnd(J) Debug.Print tHwnd If tHwnd = 0 Then Exit Sub PostMessage tHwnd, WM_LBUTTONDOWN, 1, 0 Sleep 50 PostMessage tHwnd, WM_LBUTTONUP, 1, 0 End SubPrivate Sub GetHwnd(hWndParent As Long) Dim hWndChild As Long Dim tmpStr As String * 255, tmpJ As String Dim I As Long
hWndChild = GetWindow(hWndParent, GW_CHILD Or GW_HWNDFIRST)
Do While hWndChild <> 0 I = GetWindowText(hWndChild, tmpStr, 256) tmpJ = Mid(tmpStr, 1, I) If InStr(1, tmpJ, "语言栏", vbTextCompare) > 0 Then tHwnd = hWndChild Exit Do End If GetHwnd hWndChild '递归一下 hWndChild = GetWindow(hWndChild, GW_HWNDNEXT) Loop End Sub调用:Call TestClick
zcsor(偶业余的斗胆写点blog(IE表单自动填写相关内容更新ing)) ( ) 信誉:100 Blog 加为好友 2007-5-19 15:31:55 得分: 0
Option Explicit
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" _
(ByVal lpLibFileName As String) As Long
Public Declare Function FreeLibrary Lib "kernel32.dll" (ByVal hLibModule As Long) As LongPublic Declare Function CreateDialogParam Lib "user32.dll" _
Alias "CreateDialogParamA" ( _
ByVal hInstance As Long, ByVal lpName As Long, _
ByVal hWndParent As Long, ByVal lpDialogFunc As Long, _
ByVal lParamInit As Long) As LongPublic Const SW_SHOW As Long = 5
Public Declare Function ShowWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long
Public Const WM_SYSCOMMAND As Long = &H112
Public Const SC_CLOSE As Long = &HF060&
Public Declare Function EndDialog Lib "user32.dll" (ByVal hDlg As Long, ByVal nResult As Long) As Long
Public Declare Function GetMessage Lib "user32.dll" Alias "GetMessageA" (ByRef lpMsg As MSG, ByVal hwnd As Long, ByVal wMsgFilterMin As Long, ByVal wMsgFilterMax As Long) As Long
Public Declare Function TranslateMessage Lib "user32.dll" (ByRef lpMsg As MSG) As Long
Public Declare Function DispatchMessage Lib "user32.dll" Alias "DispatchMessageA" (ByRef lpMsg As MSG) As Long
Public Declare Sub PostQuitMessage Lib "user32.dll" (ByVal nExitCode As Long)
Public Type POINTAPI
x As Long
y As Long
End Type
Public Type MSG
hwnd As Long
message As Long
wParam As Long
lParam As Long
time As Long
pt As POINTAPI
End TypePublic Function DialogProc( _
ByVal hwndDlg&, ByVal uMsg&, _
ByVal wParam&, ByVal lParam&) As Long
If uMsg = WM_SYSCOMMAND Then
If wParam = SC_CLOSE Then
Call EndDialog(hwndDlg, 0)
PostQuitMessage 0
DialogProc = 0
End If
End If
End Function
Public Sub Main()
Dim hDlg&
Dim tMsg As MSG
Dim hIns&hIns = LoadLibrary("input.dll")
hDlg = CreateDialogParam(hIns, 511, _
0, AddressOf DialogProc, 0)
FreeLibrary hInsShowWindow hDlg, SW_SHOWWhile GetMessage(tMsg, 0, 0, 0)
Call TranslateMessage(tMsg)
Call DispatchMessage(tMsg)
WendEnd Sub运行程序(最好将程序编译后再测试)
Private Declare Function GetWindow Lib "user32.dll" (ByVal hwnd As Long, ByVal wCmd As Long) As Long
Private Declare Function GetWindowText Lib "user32.dll" Alias "GetWindowTextA" (ByVal hwnd As Long, ByVal lpString As String, ByVal cch As Long) As Long
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Private Declare Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
Private Const GW_CHILD As Long = 5
Private Const GW_HWNDFIRST As Long = 0
Private Const GW_HWNDNEXT As Long = 2
Private Const WM_LBUTTONDOWN As Long = &H201
Private Const WM_LBUTTONUP As Long = &H202Dim tHwnd As LongPrivate Sub TestClick()
Dim I As Long, J As Long
I = Shell("RunDll32.exe shell32.dll,Control_RunDLL C:\WINDOWS\system32\input.dll")
If I = 0 Then
MsgBox "error!"
Exit Sub
End If
I = 0
Do
J = FindWindow(vbNullString, "文字服务和输入语言")
DoEvents
Sleep 20
I = I + 1
If I > 15 Then Exit Sub '超时3秒
If J <> 0 Then
Debug.Print J
Exit Do
End If
Loop
Call GetHwnd(J)
Debug.Print tHwnd
If tHwnd = 0 Then Exit Sub
PostMessage tHwnd, WM_LBUTTONDOWN, 1, 0
Sleep 50
PostMessage tHwnd, WM_LBUTTONUP, 1, 0
End SubPrivate Sub GetHwnd(hWndParent As Long)
Dim hWndChild As Long
Dim tmpStr As String * 255, tmpJ As String
Dim I As Long
hWndChild = GetWindow(hWndParent, GW_CHILD Or GW_HWNDFIRST)
Do While hWndChild <> 0
I = GetWindowText(hWndChild, tmpStr, 256)
tmpJ = Mid(tmpStr, 1, I)
If InStr(1, tmpJ, "语言栏", vbTextCompare) > 0 Then
tHwnd = hWndChild
Exit Do
End If
GetHwnd hWndChild '递归一下
hWndChild = GetWindow(hWndChild, GW_HWNDNEXT)
Loop
End Sub调用:Call TestClick
我地天呢...好长
//你是指什么东西.........好"长"........?!