- 題名: WebBrowserを使用してデータの入力
- 日時: 2009/07/21 2:33:45
- ID: 24994
- この記事の返信元:
- (なし)
- この記事への返信:
- [24995] Re[1]: WebBrowserを使用してデータの入力2009/07/21 7:23:02
- ツリーを表示
こんにちは。 対象がメモ帳ですがポストしている例がこちらどぼんさんの掲示板のログにあります。 http://dobon.net/vb/bbs/log3-34/21332.html IEのというかWebBrowserコントロールでも、私自身がドラッグアンドドロップした複数のファイルを順に投稿するツールを作って使っているのですが、 そこで以下のようにすることで入力しています。 (とあるブログでひとつの記事に7〜10枚程度の画像をつけるような運用をしているためいちいちひとつひとつ選んで送信するのが面倒で。) 'ファイルパスの入力欄にフォーカスを当て… BrowserUnit.Document.GetElementById("uploadfilename").Focus() Dim ptr As IntPtr = GetChildWindows(Me.BrowserUnit.Handle)(2) '2番目がブラウザのキャンバスというかボディの部分 'ファイル名を一文字ずつ送る For charcounter As Integer = 1 To Len(fname) PostMessage(ptr, WM_CHAR, AscW(Mid(fname, charcounter, 1)), 0) Next '再度フォーカスを当ててDoEvents。 'これをしないと、値がセットされない(見かけ上は確かに入力されているのだが、実際の値が空になっている模様。) BrowserUnit.Document.GetElementById("uploadfilename").Focus() Application.DoEvents() (あ、WM_CHARは&H102です。)
ふろんさん。…ごめんなさい。下を貼ってください。 <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)> _ Private Shared Function PostMessage( _ ByVal hWnd As IntPtr, _ ByVal Msg As UInteger, _ ByVal wParam As IntPtr, _ ByVal lParam As IntPtr) As Boolean End Function <DllImport("User32.dll")> _ Private Shared Function EnumChildWindows _ (ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowProcess, _ ByVal lParam As IntPtr) As Boolean End Function Public Delegate Function EnumWindowProcess(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean Public Shared Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr() Dim ChildrenList As New List(Of IntPtr) Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList) Try EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle)) Finally If ListHandle.IsAllocated Then ListHandle.Free() End Try Return ChildrenList.ToArray End Function Private Shared Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean Dim ChildrenList As List(Of IntPtr) = GCHandle.FromIntPtr(Parameter).Target If ChildrenList Is Nothing Then Throw New Exception("GCHandle Target could not be cast as List(Of IntPtr)") ChildrenList.Add(Handle) Return True End Function
あ、ごめんなさい。 参照の追加は要りませんが、両者はSystem.Runtime.InteropServices内なので System.Runtime.InteropServicesをImportsするか、頭から記述してください。
こんにちは。 IE7なら大丈夫かなと思って書いたのですが…7も駄目っぽいですね。失礼しました。
こんばんは。 ダイアログ自体は Me.Browser.Document.GetElementById("uploadfile").InvokeMember("Click") のようにファイル用の入力欄のClickを発動させるとIE7でも出るかもしれません。 (IE6では出ますがIE7がないので分かりません。) ところで、 「<input name="file" value="" type="file">」が実際の相手だとすると GetElementByIdは使用できません(GetElementsByTagNameを使用して探す必要があります。)が、 実物はidがついているのでしょうか。
こんばんは。 (久々だったのでコンピュータ系での自分の名前を間違ってますね。…。「とん。」じゃないです。) idというのは<input type="file" id="uploadfile">のような記述をしてある際についているもので、 これがないとGetElementByIdでエレメントを見つけることはできません。 nameしかない場合は代わりに ●GetElementsByTagName("input")でHtmlElementCollectionを受け取って中のエレメントをFor Eachループし name属性が"file"と一致するエレメントを探すか、 ●Document.All.GetElementsByName("uploadfile")でHtmlElementCollectionを受け取って中のエレメントをFor Eachループし 何か(タグの種類やら、何かしら。)が一致するエレメントを探すか、 という方法でエレメントを発見する必要があります。(nameもない場合は、大変。) なお、例示のあるそのHTMLなのであれば、 25013にあった「WebBrowser2.Document.GetElementById("file").Focus()」もエラーになるのでは? セキュリティがどうこう、バージョンがどうこう以前に正しく動作しませんよね? >尚、下記をテストしてみましたがエラーでした >WebBrowser2.Document.GetElementById("C:\Pic").InvokeMember("Click") "C:\Pic"というidのついたエレメントが存在しないので、当然エラーになります。 昨年の質問の際に書いたとおり、 GetElementById、GetElementsByTagName、GetElementsByNameの3つ程度は 役割を調べておいて使い分けられるようにしておくといいですよ。でないと、操作できません。
分類:[.NET]
WebBrowserを使用してデータの入力をテストしているのですが
画像ファイルのみ何故か入力が出来ません。
--------------------- Html
<TR>
<td nowrap="nowrap">ホームページ</td>
<td><input name="site" value="" size="30" type="text"></td>
</TR>
<TR>
<td nowrap="nowrap">画像</td>
<td><input name="file" value="" type="file"></td>
</TR>
------------- Prg
' ホームページ 入力
WebBrowser2.Document.GetElementById("site").SetAttribute("value", "http://abcdefg") ← OK
Call WaitCompleted() '表示待ちの部分
' 画像 入力
WebBrowser2.Document.GetElementById("file").SetAttribute("value", "PICUrl") ← NG
※ <input name="file" のときは上の構文とはなにか異なる処理が必要なのでしょうか?
画像のインプットの所のみ入力枠の横にボタンが付いています(ファイルのダイアログ表示)
よろしくご指導お願いします。