DOBON.NET DOBON.NETプログラミング掲示板過去ログ

WebBrowserを使用してデータの入力 A

環境/言語:[os Vista VB.net 2005]
分類:[.NET]

WebBrowserを使用してデータの入力に挑戦していますが
前スレッド
「WebBrowserを使用してデータの入力」が長くなってしまい
見にくくなってしまいましたので新たに
「WebBrowserを使用してデータの入力 A」として
スレッドを立てさせていただきました。
このようなやりかたがマズイ場合はお知らせいただければ取り下げます。

私は以前、ウエーブカメラを使用して動態検知のプログラムをここで色々
教えていただきながら作成しましたが、今回これを利用してペットの
生態を自分専用の掲示板に自動投稿しようとしています。
撮影間隔はタイマーをかましていますが
それでも画像のUp数が多くとてもハンドでは実現できません。

「経過説明」
掲示板は今のところFc2を想定しており
掲示板の例)http://borokiha1.bbs.fc2.com/
ターゲットとなる画像Up部分のHtmlは
<tr>
<td nowrap="nowrap">画像</td>

<td><input name="file" value="" type="file"></td>
</tr>
<tr>
<td nowrap="nowrap">メールアドレス</td>
<td><input name="email" value="" size="30" type="text"></td>
</tr>
<tr>
<td nowrap="nowrap">ホームページ</td>

<td><input name="site" value="" size="30" type="text"></td>
</tr>
のようになっており、<input name="file" value="" type="file">
問題は ↑の name="file" で今までの経過ではどうもファイル内のデータ(画像)には
(勝手にユーザのファイルをアップロードできるのが問題)← Azulean様
のご指摘にあるようにセキュリティの関係からプログラムからの自動入力は受け付けてくれません。
そこで、ヴァン 様のご意見で
WebBrowser2.Document.GetElementById("file").Focus()
により、自動的にファイル選択ダイアログを表示するところまで漕ぎ付けました。
後は、このダイアログのファイルを選択し、「開く」ボタンが押せれば目的達成なのですが・・・・・・
■No25038に返信(ふろんさんの記事)
> により、自動的にファイル選択ダイアログを表示するところまで漕ぎ付けました。
> 後は、このダイアログのファイルを選択し、「開く」ボタンが押せれば目的達成なのですが・・・・・・

それで、何が分からないのでしょうか?
ファイル名のフルパスとEnterキーをSendKeysなりするということではないのでしょうか?
■No25042に返信(Azuleanさんの記事)
> ■No25038に返信(ふろんさんの記事)
>>により、自動的にファイル選択ダイアログを表示するところまで漕ぎ付けました。
>>後は、このダイアログのファイルを選択し、「開く」ボタンが押せれば目的達成なのですが・・・・・・
>
> それで、何が分からないのでしょうか?
> ファイル名のフルパスとEnterキーをSendKeysなりするということではないのでしょうか?

Azulean様
こんばんわ
Azuleanさんの過去スレッドは拝見させて頂いています。
旧レス最後のご意見も拝見しました。
セキュリティ上、type="file" へのプログラムからの入力を受け付けないのであれば
ダイアログを表示させて、そこでファイル選択と「開く」ボタンを押して
目的を達成したいと思い、何もかも教えてもらうばかりではと
色々関連情報を模索しているところでした。
>ファイル名のフルパスとEnterキーをSendKeysなりするということ
ヒントありがとうございます。

今、SendKeysに関する情報を色々調べているのですが

次の例は、メモ帳を起動してメモ帳に文字を入力します。入力後Alt+[F4]を送ってメモ帳を閉じます。

Sub Sample()
Dim i As Integer
Shell "Notepad.exe", 1
For i = 1 To 3
SendKeys "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
SendKeys "{Enter}"
Next i
SendKeys "%{F4}"
End Sub

こんなのがありましたが、これの応用??
■No25044に返信(ふろんさんの記事)
> ■No25042に返信(Azuleanさんの記事)
>>■No25038に返信(ふろんさんの記事)
> >>により、自動的にファイル選択ダイアログを表示するところまで漕ぎ付けました。
> >>後は、このダイアログのファイルを選択し、「開く」ボタンが押せれば目的達成なのですが・・・・・・
>>
>>それで、何が分からないのでしょうか?
>>ファイル名のフルパスとEnterキーをSendKeysなりするということではないのでしょうか?
>
> Azulean様
> こんばんわ
> Azuleanさんの過去スレッドは拝見させて頂いています。
> 旧レス最後のご意見も拝見しました。
> セキュリティ上、type="file" へのプログラムからの入力を受け付けないのであれば
> ダイアログを表示させて、そこでファイル選択と「開く」ボタンを押して
> 目的を達成したいと思い、何もかも教えてもらうばかりではと
> 色々関連情報を模索しているところでした。
> >ファイル名のフルパスとEnterキーをSendKeysなりするということ
> ヒントありがとうございます。
>
> 今、SendKeysに関する情報を色々調べているのですが
>
> 次の例は、メモ帳を起動してメモ帳に文字を入力します。入力後Alt+[F4]を送ってメモ帳を閉じます。
>
> Sub Sample()
> Dim i As Integer
> Shell "Notepad.exe", 1
> For i = 1 To 3
> SendKeys "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
> SendKeys "{Enter}"
> Next i
> SendKeys "%{F4}"
> End Sub
>
> こんなのがありましたが、これの応用??
>

Azulean様 へ
TextBox??.Focus() ← ダイアログのフォーカス指定

以下、ダイアログの指定必要??
SendKeys.Send("Hello! ファイル指定")
SendKeys.Send("{ENTER}")

こんな感じでしょうか?
ダイアログの指定の仕方と
上記のロジックは、ダイアログが表示されてからの実行となると
ダイアログ表示のイベント? をキャッチして実行するのでしょうか?
よろしくご教授願えませんでしょうか。
■No25045に返信(ふろんさんの記事)
> TextBox??.Focus() ← ダイアログのフォーカス指定
>
ダイアログ表示時点でテキストボックスにフォーカスがないのであれば、Tabキーかウィンドウハンドルを指定して、フォーカスを設定するAPIの呼び出しが必要でしょう。

# TextBox??.Focus()といったコードが使えるのは自分でそのコントロールを配置した場合だけです。

> 上記のロジックは、ダイアログが表示されてからの実行となると
> ダイアログ表示のイベント? をキャッチして実行するのでしょうか?
タイマーで、特定のタイトルを持つウィンドウが居るかどうか、定期的にチェックすれば良いのでは?
あるいは一定時間待つでも良いと思います。

ただ、同じタイトルを持つウィンドウが複数存在する可能性もあるので、その辺まで考慮すると大変かと思います。


WebBrowserで楽をするために、何か回りくどいことをしている印象を持たなくもないです。
# WebBrowserを使わない手法(WebClientとか?)も、フォームによっては面倒なことになりますが...。
■No25045に返信(ふろんさんの記事)
> ■No25044に返信(ふろんさんの記事)
>>■No25042に返信(Azuleanさんの記事)
> >>■No25038に返信(ふろんさんの記事)
>>>>により、自動的にファイル選択ダイアログを表示するところまで漕ぎ付けました。
>>>>後は、このダイアログのファイルを選択し、「開く」ボタンが押せれば目的達成なのですが・・・・・・
> >>
> >>それで、何が分からないのでしょうか?
> >>ファイル名のフルパスとEnterキーをSendKeysなりするということではないのでしょうか?
>>
>>Azulean様
>>こんばんわ
>>Azuleanさんの過去スレッドは拝見させて頂いています。
>>旧レス最後のご意見も拝見しました。
>>セキュリティ上、type="file" へのプログラムからの入力を受け付けないのであれば
>>ダイアログを表示させて、そこでファイル選択と「開く」ボタンを押して
>>目的を達成したいと思い、何もかも教えてもらうばかりではと
>>色々関連情報を模索しているところでした。
>>>ファイル名のフルパスとEnterキーをSendKeysなりするということ
>>ヒントありがとうございます。
>>
>>今、SendKeysに関する情報を色々調べているのですが
>>
>>次の例は、メモ帳を起動してメモ帳に文字を入力します。入力後Alt+[F4]を送ってメモ帳を閉じます。
>>
>>Sub Sample()
>> Dim i As Integer
>> Shell "Notepad.exe", 1
>> For i = 1 To 3
>> SendKeys "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
>> SendKeys "{Enter}"
>> Next i
>> SendKeys "%{F4}"
>>End Sub
>>
>>こんなのがありましたが、これの応用??
>>
>
> Azulean様 へ
> TextBox??.Focus() ← ダイアログのフォーカス指定
>
> 以下、ダイアログの指定必要??
> SendKeys.Send("Hello! ファイル指定")
> SendKeys.Send("{ENTER}")
>
> こんな感じでしょうか?
> ダイアログの指定の仕方と
> 上記のロジックは、ダイアログが表示されてからの実行となると
> ダイアログ表示のイベント? をキャッチして実行するのでしょうか?
> よろしくご教授願えませんでしょうか。
>
>
>
Azulean様 へ

その後試行錯誤してましたら

下記の手順で成功しました !!

    SendKeys.Send("対象フォルダにある画像ファイル名")
SendKeys.Send("{ENTER}")
    ↓ ダイアログオープンは最後にする
    WebBrowser2.Document.GetElementById("file").InvokeMember("Click")

以上、ここでかなり四苦八苦するのを覚悟していましたが
あまりにも、あっさりとできてしまいましたので、上記ロジックで本当に
問題ないのか心配です。
何かありましたらよろしくご指摘お願いします。
■No25046に返信(Azuleanさんの記事)
> ■No25045に返信(ふろんさんの記事)
>> TextBox??.Focus() ← ダイアログのフォーカス指定
>>
> ダイアログ表示時点でテキストボックスにフォーカスがないのであれば、Tabキーかウィンドウハンドルを指定して、フォーカスを設定するAPIの呼び出しが必要でしょう。
>
> # TextBox??.Focus()といったコードが使えるのは自分でそのコントロールを配置した場合だけです。
>
>>上記のロジックは、ダイアログが表示されてからの実行となると
>>ダイアログ表示のイベント? をキャッチして実行するのでしょうか?
> タイマーで、特定のタイトルを持つウィンドウが居るかどうか、定期的にチェックすれば良いのでは?
> あるいは一定時間待つでも良いと思います。
>
> ただ、同じタイトルを持つウィンドウが複数存在する可能性もあるので、その辺まで考慮すると大変かと思います。
>
>
> WebBrowserで楽をするために、何か回りくどいことをしている印象を持たなくもないです。
> # WebBrowserを使わない手法(WebClientとか?)も、フォームによっては面倒なことになりますが...。

どうも、返信が先後してしまったようですね

>WebBrowserで楽をするために、何か回りくどいことをしている印象を持たなくもないです。

正にその通りです!!
他の記事で、WebBrowserで,、type="file"をtype="text"に書き換えてなんてのもあり
やってみましたが、全く受け付けなかったです。

マイクロソフトのセキュリティの穴を突くとなるとそうとう難解なことになるなと
覚悟していましたが、結果的にこんなに簡単に解決しようとは思ってもいませんでした。
しかしながら、セキュリティの面から何時までこんなことが許されるのか少し心配です。

これで、最大の難所? 画像Upの自動化にメドが着きました。
後は、
@バッファーフォルダーへ画像セット
A画像の自動Up
Bバッファーの画像ファイル削除
Cタイマー Next画像撮影 @へループ
のような手順で何とかなりそうです!!

これも、色々な方からご指導やアイデアを頂き解決が出来ました。
深く御礼申し上げます
ありがとうございました。
■No25048に返信(ふろんさんの記事)
> ■No25046に返信(Azuleanさんの記事)
>>■No25045に返信(ふろんさんの記事)
> >> TextBox??.Focus() ← ダイアログのフォーカス指定
> >>
>>ダイアログ表示時点でテキストボックスにフォーカスがないのであれば、Tabキーかウィンドウハンドルを指定して、フォーカスを設定するAPIの呼び出しが必要でしょう。
>>
>># TextBox??.Focus()といったコードが使えるのは自分でそのコントロールを配置した場合だけです。
>>
> >>上記のロジックは、ダイアログが表示されてからの実行となると
> >>ダイアログ表示のイベント? をキャッチして実行するのでしょうか?
>>タイマーで、特定のタイトルを持つウィンドウが居るかどうか、定期的にチェックすれば良いのでは?
>>あるいは一定時間待つでも良いと思います。
>>
>>ただ、同じタイトルを持つウィンドウが複数存在する可能性もあるので、その辺まで考慮すると大変かと思います。
>>
>>
>>WebBrowserで楽をするために、何か回りくどいことをしている印象を持たなくもないです。
>># WebBrowserを使わない手法(WebClientとか?)も、フォームによっては面倒なことになりますが...。
>
> どうも、返信が先後してしまったようですね
>
> >WebBrowserで楽をするために、何か回りくどいことをしている印象を持たなくもないです。
>
> 正にその通りです!!
> 他の記事で、WebBrowserで,、type="file"をtype="text"に書き換えてなんてのもあり
> やってみましたが、全く受け付けなかったです。
>
> マイクロソフトのセキュリティの穴を突くとなるとそうとう難解なことになるなと
> 覚悟していましたが、結果的にこんなに簡単に解決しようとは思ってもいませんでした。
> しかしながら、セキュリティの面から何時までこんなことが許されるのか少し心配です。
>
> これで、最大の難所? 画像Upの自動化にメドが着きました。
> 後は、
> @バッファーフォルダーへ画像セット
> A画像の自動Up
> Bバッファーの画像ファイル削除
> Cタイマー Next画像撮影 @へループ
> のような手順で何とかなりそうです!!
>
> これも、色々な方からご指導やアイデアを頂き解決が出来ました。
> 深く御礼申し上げます
> ありがとうございました。
>
その後、実用化に向けて色々テストを繰り返していますが
SendKeysステートメントは何か不安定ですね
アクティブなフォームにフォーカスが当たっているので
その指定は必要ないですが
やはり手順としては
ダイアログを先に表示させてタイマーによるマルチスレッド
でダイアログへの入力→実行の必要がありそうです。

実験をして見ますが、取り合えず 解決とします。
ありがとうございました。
解決済み!

DOBON.NET | プログラミング道 | プログラミング掲示板