tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVB6からブラウザ上のフォーカスの位置へ値を送るには?
記事No15656
投稿日: 2013/04/02(Tue) 20:11
投稿者コータ
ブログのログイン処理を自動化しようとしています。

手順は、


1.ボタンを押すと、目的のURLのブラウザが起動。

2.ユーザーIDのテキストボックスへは、手動でカーソルを移動

3.ボタンを押すと、IDとパスワードが自動入力される

4.ログオンボタンは手動で押す

というような処理を考えています。


分からないのは、3番。
すでにフォーカスのあるところへ値を送るには、どうすればいいのでしょうか?

処理としては、自動でユーザーID入力→タブキーを押したのと同じ処理
→パスワード入力

の動作をさせたいです。タブキーを押したのと同じ処理をさせているのは、
たいていカーソルはユーザーID→パスワード欄へと移動するからです。


たとえば、FC2にログオンしようとして、

Set objIE = CreateObject("InternetExplorer.application")
objIE.Visible = True

objIE.Navigate "URLが入る"
Do While objIE.Busy Or (objIE.ReadyState <> 4): Loop

で、ログイン画面を表示させたのち、手動でユーザーIDのテキストボックスへ
カーソルを移動。ここまではできました。


いろんなブログにも対応させたいので、Nameとか取得せずにできないものかと
彷徨っているところです。

よろしくおねがいします。


環境VB6 SP5 OS:XP SP3 最近はプログラムに触れていない状態です

[ツリー表示へ]
タイトルRe: VB6からブラウザ上のフォーカスの位置へ値を送るには?
記事No15657
投稿日: 2013/04/02(Tue) 21:21
投稿者魔界の仮面弁士
> すでにフォーカスのあるところへ値を送るには、どうすればいいのでしょうか?

どんなサイトにも使える汎用的な方法はありませんが、とりあえず
手抜き処理なら SendKeys ですかね。確実性は無いですが…。


相手が <input type="text"> のタグだとしたら、WebBrowser.Document から
activeElement の value プロパティに値を入れれば済むはずですが、
キー入力をスクリプトで横取りして処理しているタイプのサイトだと、
もう一手間必要かも知れません。

また、入力欄が Flash などで構築されている場合は、そうした操作は
基本的に通用しません。無理に行うなら、SendInput API などを併用して、
ユーザー操作をエミュレートするといった操作が必要になるかと思います。

[ツリー表示へ]
タイトルRe: VB6からブラウザ上のフォーカスの位置へ値を送るには?
記事No15661
投稿日: 2013/04/05(Fri) 01:34
投稿者VBレスキュー(花ちゃん)
レスをもらったら速やかに返事をするようにして下さい。

>3.ボタンを押すと、IDとパスワードが自動入力される
下記、DLL を使用すると少しは簡単に操作ができます。
 http://hanatyan.sakura.ne.jp/patio/read.cgi?no=321

[ツリー表示へ]
タイトルRe: VB6からブラウザ上のフォーカスの位置へ値を送るには?
記事No15662
投稿日: 2013/04/05(Fri) 09:54
投稿者コータ

魔界の仮面弁士さん

回答ありがとうございます。

SendKeys を使った方法を調べていますが、プログラムで指定したアプリを立ち上げて、
値を送る方法は分かりました。例:メモ帳

しかし、自由にアプリやブラウザを開いて、現在、フォーカスのある位置へ値を送る方法が
分かりません。たぶん、どんなウィンドウが立ち上がっているかを取得する必要があるのだと
思います。


魔界の仮面弁士さんのご指摘のとおり、Flashを使用しているとお手上げです。

もっかのところは、「どんなウィンドウが立ち上がっているかを取得する」書き方を調べています。


VBレスキュー(花ちゃん)さん

教えていただいたDLLでも確認してみます。

返事が遅くなり、申し訳ありませんでした。

[ツリー表示へ]
タイトルRe^2: VB6からブラウザ上のフォーカスの位置へ値を送るには?
記事No15666
投稿日: 2013/04/05(Fri) 16:27
投稿者VBレスキュー(花ちゃん)
> 教えていただいたDLLでも確認してみます。
私は、ID や パスワードの保存と登録用にVB2010 で作ってはいるのですが...。

VB6.0 での簡単な動作確認なら下記のようなかんじになるかと。
Command1 をクリックして、この掲示板の新規投稿画面の[なまえ]のところのテキストボックスを
クリックして見て下さい。
(先のリンクのところのDLLをダウンロードして参照設定しておいて下さい)

Option Explicit

Private Myhwnd As Long  '対象ウィンドウのハンドル
Private SI As New SendInputV6.Class1

Private Sub Command1_Click()
   Myhwnd = SI.fGetForGrdWindow(1000)
  
   If Myhwnd <> 0 Then
      Call SI.fSetForGrdWindow(Myhwnd)
      Call SI.WaitTime(200)
      Call SetData("氏名", "タイトル")

      Call SI.WaitTime(50)
      Call SI.KeyReSet
      Call SI.KeyDown(vbKeyTab)
      Call SI.KeyUp(vbKeyTab)
      Call SI.KeyStroke
      Call SetData("メッセージを" & vbCrLf & "書き込みました。", "")
   End If

End Sub

Private Sub SetData(ByVal myData1 As String, ByVal myData2 As String)
   Clipboard.Clear
   Clipboard.SetText myData1
   Call SI.WaitTime(100)
  
   Call SI.KeyReSet
   Call SI.KeyDown(vbKeyControl)
   Call SI.KeyDown(vbKeyV)
   Call SI.KeyUp(vbKeyV)
   Call SI.KeyUp(vbKeyControl)
   Call SI.KeyDown(vbKeyTab)
   Call SI.KeyUp(vbKeyTab)
   Call SI.KeyStroke
   Call SI.WaitTime(100)
  
   If Len(myData2) > 0 Then
      Clipboard.Clear
      Clipboard.SetText myData2
      Call SI.WaitTime(100)
      
      Call SI.KeyReSet
      Call SI.KeyDown(vbKeyControl)
      Call SI.KeyDown(vbKeyV)
      Call SI.KeyUp(vbKeyV)
      Call SI.KeyUp(vbKeyControl)
      Call SI.KeyDown(vbKeyTab)
      Call SI.KeyUp(vbKeyTab)
      Call SI.KeyStroke
   End If
End Sub

尚、Do While objIE.Busy Or (objIE.ReadyState <> 4): Loop のような表示待ちは
お勧めできるような方法ではありませんので、DocumentComplete イベントを使った方法に
変更して下さい。
http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=176&no=0

[ツリー表示へ]
タイトルRe^3: VB6からブラウザ上のフォーカスの位置へ値を送るには?
記事No15669
投稿日: 2013/04/06(Sat) 11:16
投稿者コータ
VBレスキュー(花ちゃん)さま

ご回答ありがとうございました。

掲載していただいたコードで、目的が達成できました。

1文字ずつ入力させる方法を探っていると、アルファベットや数字、「.」(ピリオド)などは、
入力できても、「@」(アットマーク)を入力する方法がわからず、またコピーして貼り付ける
ような方法はないものかと考えていました。


> 尚、Do While objIE.Busy Or (objIE.ReadyState <> 4): Loop のような表示待ちは
> お勧めできるような方法ではありませんので、DocumentComplete イベントを使った方法に
> 変更して下さい。
> http://hanatyan.sakura.ne.jp/patio/read.cgi?mode=view2&f=176&no=0

ありがとうございます。
が、表示する処理(ボタン)と、アカウント入力の処理(ボタン)を別々にしてもいいので
問題ありません。

Do While文を表示完了確認で使うのは、わたしも不自然だと思いますので、表示→入力までを
自動化する場合には、ご指摘のようにしたいと考えています。


ありがとうございました。

[ツリー表示へ]