|
WEBページに自動入力するサンプル(VB.NET)

|
WEBページのフォームにデータを自動入力するサンプルです。IE専用です。
WEBページの開発時に毎回入力するデータの自動入力に使えると思います。。。
WEBページに自動入力する方法はいろいろありますが、このサンプルは
SendMessageのWM_IME_CHARで一文字ずつ文字送信しています。また、
次項目へ移動する時はPostMessageのWM_KEYDOWNでTABキーを送信しています。
このサンプルではYahooのログインページにユーザIDとパスワードを入力します。
YahooのログインページのユーザIDにフォーカスを設定してお試しください。
WEBページのフォームにデータを自動入力するツールはこちらです。
WEB自動入力ツール(WebFormInput)はWEBページに入力したデータを
保存し次回以降は自動入力するツールです。事前登録情報のフォーカス位置に
コピーする事も出来ます。このサンプルとはちょっと違う方法でWEBページの
自動入力を実現しています。
★フォームモジュール(Form1.vb)
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
' YahooのログインページにユーザIDとパスワードを設定するサンプル
Dim colData As New Collection
colData.Add("あいうえ") ' ユーザID
colData.Add("1234") ' パスワード
' WEBページのフォームにデータ設定
SetWebFormValue(colData)
End Sub
End Class
★標準モジュール(Form1.vb)
Module Module1
' APIの定義
Private Const WM_KEYDOWN = &H100
Private Const WM_IME_CHAR = &H286
Private Delegate Function D_EnumWindowsProc(ByVal hWnd As Integer, ByVal lParam As Integer) As Integer
Private Delegate Function D_EnumChildWindowsProc(ByVal hWnd As Integer, ByVal lParam As Integer) As Integer
Private Declare Function EnumWindows Lib "user32.dll" (ByVal lpEnumFunc As D_EnumWindowsProc, ByVal lParam As Integer) As Integer
Private Declare Function EnumChildWindows Lib "user32.dll" (ByVal hwndParent As Integer, ByVal lpEnumFunc As D_EnumChildWindowsProc, ByVal lParam As Integer) As Integer
Private Declare Function GetClassName Lib "user32.dll" Alias "GetClassNameA" (ByVal hWnd As Integer, ByVal lpClassName As Byte(), ByVal nMaxCount As Integer) As Integer
Private Declare Function PostMessage Lib "user32.dll" Alias "PostMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hWnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
' WEBページのフォームに設定するデータのコレクション
Private colFormVal As New Collection
' 終了フラグ
Private blnEndFlag As Boolean = False
' 最前面のWEBページのフォームにデータ設定
Public Sub SetWebFormValue(ByVal col As Collection)
' フォームに設定するデータのコレクション
colFormVal = col
' 終了フラグ
blnEndFlag = False
' トップレベルウィンドウの全てハンドル取得して、
' 最前面のWEBページのフォームにデータ設定
Dim intRet As Integer = EnumWindows(AddressOf EnumWindowsProc, 0)
End Sub
' トップレベルウィンドウの全てハンドル取得して、最前面のWEBページのフォームにデータ設定
Public Function EnumWindowsProc(ByVal hWnd As Integer, ByVal lParam As Integer) As Integer
' 指定された親ウィンドウに属するWEBページのフォームにデータ設定
EnumChildWindows(hWnd, AddressOf EnumChildWindowsProc, 0)
If blnEndFlag Then
' リターン
Return 0
End If
' リターン
Return 1
End Function
' 指定された親ウィンドウに属するWEBページのフォームにデータ設定
Private Function EnumChildWindowsProc(ByVal hWnd As Integer, ByVal lParam As Integer) As Integer
Dim stt As StackTrace = New StackTrace(False)
Dim cls As String = stt.GetFrame(0).GetMethod().ReflectedType.FullName
Dim mth As String = stt.GetFrame(0).GetMethod().Name
' クラス名取得
Dim bytClass As Byte() = New Byte(255) {}
Dim strClass As String = ""
GetClassName(hWnd, bytClass, 255)
strClass = StripNulls(bytClass)
' IEチェック
If strClass.ToLower = "internet explorer_server" Then
' WEBページのフォームにデータ設定
For i As Integer = 1 To colFormVal.Count
' フォームのカーソル位置に1文字づつ入力
Dim strDat As String = colFormVal(i)
For j As Integer = 0 To strDat.Length - 1
SendMessage(hWnd, WM_IME_CHAR, Asc(strDat.Substring(j, 1)), 0)
Next
' 文字列の入力が完了したらTAB送信(次項目へ)
PostMessage(hWnd, WM_KEYDOWN, Asc(vbTab), &H1E)
Next
' 最前面のWEBページのみ対象なので終了
blnEndFlag = True
' リターン
Return 0
End If
' リターン
Return 1
End Function
' 文字列からNULL文字以降をカット
Private Function StripNulls(ByVal bytOrg As Byte()) As String
Dim strOrg As String = System.Text.Encoding.GetEncoding("SHIFT-JIS").GetString(bytOrg)
Dim pt As Integer = strOrg.IndexOf(Chr(0))
If pt >= 0 Then strOrg = strOrg.Substring(0, pt)
Return strOrg
End Function
End Module