tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトルVBから フォーム外のテキスト入力ボックスへの入力
記事No15487
投稿日: 2012/06/02(Sat) 15:46
投稿者@chie
VB6 SP6、WinXP

インターネットエクスプローラなどのブラウザの
入力テキストボックス(?)へ VBから 書き込みをさせたいのですが
どのようにすればよいのでしょうか

そのボックスの座標の位置などは 前もってクリックして取得できています。
よろしくおねがいいたします

[ツリー表示へ]
タイトル過去に同スレありました
記事No15488
投稿日: 2012/06/02(Sat) 16:13
投稿者@chie
タイトル : ブラウザに文字列を送り込む
記事No : 14468
 が同内容でした 申し訳ありませんでした

サンプル掲示板にあるとのことです

[ツリー表示へ]
タイトルRe: VBから フォーム外のテキスト入力ボックスへの入力
記事No15489
投稿日: 2012/06/02(Sat) 16:21
投稿者魔界の仮面弁士
> そのボックスの座標の位置などは
「など」との事ですが、座標以外にはどのような情報を得られていますか?

IHTMLDocument 経由で、対象の IHTMLInputTextElement を得られているなら、
その value プロパティを使って、テキストボックスの内容を読み書きできます。

対象の IAccessible インターフェイスを取得できているなら、
accValue プロパティが使えるでしょう。


Option Explicit

Private Declare Function AccessibleObjectFromPoint Lib "oleacc" _
   (ByVal xScreen As Long, _
    ByVal yScreen As Long, _
    ByRef ppvObject As Any, _
    ByRef pvarChild As Variant) As Long
    
Private Sub Command1_Click()
    Dim x As Long, y As Long
    x = CLng(Text1.Text)
    y = CLng(Text2.Text)
    Dim acc As IAccessible
    Dim child As Variant
    AccessibleObjectFromPoint x, y, acc, child
    acc.accValue() = "新しい文字列" & CStr(Timer)
End Sub

[ツリー表示へ]
タイトルRe^2: VBから フォーム外のテキスト入力ボックスへの入力
記事No15490
投稿日: 2012/06/03(Sun) 13:08
投稿者@chie
> > そのボックスの座標の位置などは
> 「など」との事ですが、座標以外にはどのような情報を得られていますか?
レスありがとうございます

取得できているのは
アドレスやパスワードを入力するボックスの座標だけです
クリックしてその座標を取得しています

ちなみにそのブラウザは FireFoxです

サンプル探したのですが いまいち使い方がわかりませんでした。
ブラウザは何枚も開けますが
その何枚かのうちの このページを取得して・・・
みたいにやるのでしょうか

[ツリー表示へ]
タイトルFireFoxがIAccessible を受け付けない
記事No15494
投稿日: 2012/06/03(Sun) 17:32
投稿者@chie
いただきましたコードで IEでは入力が可能になりました

ですが使いたかった Firefoxやサファリといったブラウザでは

Firefox→オブジェクトはこの動作をサポートしていません
サファリ→エラーなしで進みますが 入力されません

これはFireFox自体がIAccessible を受け付けないということでしょうか

[ツリー表示へ]
タイトルRe: FireFoxがIAccessible を受け付けない
記事No15495
投稿日: 2012/06/04(Mon) 11:02
投稿者魔界の仮面弁士
> Firefox→オブジェクトはこの動作をサポートしていません
> サファリ→エラーなしで進みますが 入力されません

IAccessible のサポート状況は、それぞれのアプリケーションによって異なります。
どこまで利用可能かどうかは、Accessible Explorer 等で確認してみてください。
http://www.ka-net.org/blog/?p=1131


> これはFireFox自体がIAccessible を受け付けないということでしょうか

get_accValue は受け付けるようなので、参照専用ということのようですね。

それ以外の制御方法としては、Selenium などを使うとか、
SendInput でマウス/キー入力をエミューレートするなどでしょうか。

[ツリー表示へ]
タイトルSendInput検索中
記事No15498
投稿日: 2012/06/05(Tue) 17:17
投稿者@chie
レスいただいたのに 時間かかってすみません

SendInput今検索中です
ワード検索して考えてはいるのですが
SendInputをつかって規定の文字列を送り込む手法に
悪戦苦闘中です

SendInput(入力イベントの数,挿入する入力イベントの配列,構造体のサイズ)

という引数まではわかったのですが 
これを使ってどうやって文字を送り込むのかがわかりません

[ツリー表示へ]
タイトルRe: SendInput検索中
記事No15499
投稿日: 2012/06/05(Tue) 19:01
投稿者魔界の仮面弁士
> これを使ってどうやって文字を送り込むのかがわかりません
さして珍しい API では無いですし、サンプルや解説記事は、国内外・VB/非VB を含め
比較的容易に見つけられると思います。

実際、検索エンジン等でそれらを探し当てることろまではできていると思いますが、
そこからさらに進んで、それらを調査・実験してみたうえで、
具体的にどの部分が理解できないのか、あるいは、その API を使うために
どういった情報・資料を欲しているのかなど、不明な点をより具体的に質問してみてください。

まずは、ここのサイトのサンプルでいうとこのあたりでしょうか。
http://hanatyan.sakura.ne.jp/vbhlp/SendInput.htm
http://hanatyan.sakura.ne.jp/vbhlp/SendMous.htm

VB から FireFox を制御するという事例は、IE の操作事例に比べると少ないので、
Firefox に限定した具体的なコードというのは、そうそう無いと思います。
各種情報をかき集めて、try & error でチャレンジしてみてください。


> SendInput(入力イベントの数,挿入する入力イベントの配列,構造体のサイズ)
> という引数まではわかったのですが 
この場合のイベントとは、キーボード操作やマウス操作を表す共用体な構造体です。

もっとも、VB6で共用体は作れないので、バイト配列で代用するか、もしくは、
マウス用とキーボード用とで、個別のユーザー定義型を用意することになるでしょう。

具体的なコードは、上記の URL を参考にしてみてください。
サンプルコード中で不明な点があれば、その点を質問してみてください。


> これを使ってどうやって文字を送り込むのかがわかりません
文字を送り込むというか、マウス操作/キーボード操作をエミュレートするというものですね。

たとえば、テキストボックスをクリックして "abc" と入力するために、
 ・マウスカーソル位置を絶対座標指定で移動
 ・左マウスボタンを押す
 ・左マウスボタンを離す
 ・aキーを押す
 ・aキーを離す
 ・bキーを押す
 ・bキーを離す
 ・cキーを押す
 ・cキーを離す
という 9 要素の構造体配列を渡すことになります(1個ずつ9回呼んでも良いですけど)。

ただしこの時、Caps Lock の状態も調べておかないと、"abc" ではなく
"ABC" になるかも知れませんので、注意しください。

(あるいは、多少行儀が悪いですが、クリップボード経由で送り込むという手法も)

[ツリー表示へ]
タイトルRe^2: SendInput検索中
記事No15500
投稿日: 2012/06/05(Tue) 22:43
投稿者@chie
ありがとうございます

ここのサンプルの別のところを探し出してがんばっていたのですが
そこのソースがVB.NET用でうまく作動せず
難儀していました

もう少し出来上がるまでお時間ください

[ツリー表示へ]
タイトルRe^2: SendInput検索中
記事No15501
投稿日: 2012/06/07(Thu) 13:45
投稿者@chie
文字をメモ帳などに打ち出すところまではできました

今行き詰っているのは
文字をABC→vbKeyA vbKeyb vbKeyc に
変換する関数がわかりません 
Asciiコードと同じではない見たいです。
出力すると数字が表示されてしまいました

先に「お行儀が悪い」とおっしゃっていた
貼り付け機能を使えれば そちらのほうが楽なのかもしれません




以下サンプルを抜き出して使わせていただいてる抜粋です
----------------------------------------------------
Private Sub CommandSTR_Click()
On Error GoTo errSTR
Dim x As Long, y As Long
    x = CLng(Label1.Caption)
    y = CLng(Label2.Caption)

        SetCursorPos x, y
        mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
        mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
    

Dim wVkKey() As Integer
  
    
    Dim strAddress As String
    Dim LenAddress As Integer
    
    Dim i As Long
    
    strAddress = "aaa.bbb@ccc.com"
    
    LenAddress = Len(strAddress)
    LenPassword = Len(strPassword)
    
     Dim UpDown() As Integer
     Dim tempAscii As Integer
    
    ReDim wVkKey(LenAddress * 2 - 1) As Integer
    ReDim UpDown(LenAddress * 2 - 1) As Integer
    
    For i = 0 To LenAddress - 1
        tempAscii = Asc(Mid(strAddress, i + 1, 1))
    
        wVkKey(i * 2 + 0) = tempAscii: UpDown(i * 2 + 0) = 0 'UpDown(0) = 0 は省略可
        wVkKey(i * 2 + 1) = tempAscii:   UpDown(i * 2 + 1) = 1  '0 以外は keyUP
    
    Next i
    
    sKeyEventSet LenAddress * 2, wVkKey, UpDown
    
Exit Sub
errSTR:
    MsgBox Error
    Err.Clear
End Sub

Public Sub sKeyEventSet(nInput As Long, _
                         wVkKey() As Integer, UpDown() As Integer)
    Dim inputevents() As INPUT_TYPE
    Dim keyevent As KEYBDINPUT
    Dim Count As Integer
    ReDim inputevents(nInput - 1) As INPUT_TYPE
    For Count = 0 To nInput - 1
        With keyevent
            .wVk = wVkKey(Count)        '操作キーコード
            .wScan = MapVirtualKey(wVkKey(Count), 0)  'スキャンコードを指定
            If UpDown(Count) = 0 Then   'キーDown
                .dwFlags = KEYEVENTF_EXTENDEDKEY Or 0
            Else                        'キーUP
                .dwFlags = KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP
            End If
            .time = 0
            .dwExtraInfo = 0
        End With
        inputevents(Count).dwType = INPUT_KEYBOARD
        CopyMemory inputevents(Count).xi(0), keyevent, Len(keyevent)
    Next Count
    Call SendInput(nInput, inputevents(0), Len(inputevents(0)))
End Sub

[ツリー表示へ]
タイトルRe^3: SendInput検索中
記事No15502
投稿日: 2012/06/07(Thu) 16:33
投稿者魔界の仮面弁士
> 文字をABC→vbKeyA vbKeyb vbKeyc に
公式の一覧表としてはこれにあたります。
http://msdn.microsoft.com/en-us/library/ms927178.aspx


> 変換する関数がわかりません 
無いと思います。MapVirtualKeyEx API だと、
 スキャンコード → 仮想キーコード
 仮想キーコード → スキャンコード
 仮想キーコード → 文字値
はできますが、その逆の
 文字値 → 仮想キーコード
はできないんですよね…。

Num Lock、Kana Lock、Caps Lock、IME のOn/Off などによって、
キー入力した内容と実際に入力される内容は変わってきますので、
入力させたい文字列が固定的でない場合は、変換には苦労しそうです。
(特に、漢字を入力させるような場合など)



> Asciiコードと同じではない見たいです。
KeyPress イベントの KeyAscii 引数が ASCII コード。
KeyDown/KeyUp イベントの引数がキーコードに相当します。
ASCII と一致するもの(A〜Z など)もありますが、基本的には別物ですね。


http://msdn.microsoft.com/ja-jp/library/gg153546.aspx

》一般に、仮想キー コードは、ASCII コードなどの他の文字エンコード標準には
》対応づけられていません。同じキーで異なる文字が入力される点や、
》ファンクション キーなどの一部のキーはどの文字にも対応していないことを
》考えれば、このことは明らかです。
》ただし、次の仮想キー コードは、相当する ASCII 値とマッピングされています。
》 ・ 0 〜 9 のキー = ASCII 値の '0' 〜 '9' (0x30 〜 0x39)
》 ・ A 〜 Z のキー = ASCII 値の 'A' 〜 'Z' (0x41 〜 0x5A)
》このマッピングはある意味で混乱の元になります。先ほど説明したように、
》仮想キー コードは決して文字と解釈するべきではないためです。



> 先に「お行儀が悪い」とおっしゃっていた
> 貼り付け機能を使えれば そちらのほうが楽なのかもしれません
そうかも知れませんね。クリップボード経由で行うのなら、
[Shift]+[Insert] か [Ctrl]+[V] を送出すればいけそうです。
貼り付けを禁止するように設計された Web サイトは駄目かも知れませんが。

[ツリー表示へ]
タイトルブラウザへの文字列の書き込みできました 
記事No15503
投稿日: 2012/06/07(Thu) 16:52
投稿者@chie
ブラウザへの文字列の書き込みできました 
クリップボード貼り付けは
カコのサンプルからつぎはぎしながらやってみました

ただしFireFoxは結局入力を受け付けなかったので
ブラウザはGoogle Chromeを使用しました

魔界の仮面弁士さん 花ちゃんさん ありがとうございました

-------------------------------------------------------------------


'マウスカーソルの位置を設定する(P389)
Private Declare Function SetCursorPos Lib "user32" _
    (ByVal x As Long, ByVal y As Long) As Long

'キーストロークをシミュレートする(P1065)
Private Declare Sub keybd_event Lib "user32.dll" _
   (ByVal bVk As Byte, ByVal bScan As Byte, _
    ByVal dwFlags As Long, ByVal dwExtraInfo As Long)
Private Const KEYEVENTF_KEYUP = &H2         'キーアップ
Private Const KEYEVENTF_EXTENDEDKEY = &H1   'スキャンコードは拡張コード
    
'仮想キーコード・ASCII値・スキャンコード間でコードを変換する(P1067)
Private Declare Function MapVirtualKey Lib "user32" _
    Alias "MapVirtualKeyA" (ByVal wCode As Long, _
    ByVal wMapType As Long) As Long


Private Sub AutoNyuryoku()
dim x1 As Long
dim y1 As Long
  x1 =100
    y1= 200
    
    '文字入力欄にマウスをもってくる
    SetCursorPos x1, y1
    mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
    mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0

    '入力貼り付け
     Call sSetSendKeys(strAddress, vbKeyControl, vbKeyV)    
    'Tab移動
    Call TabPush
     Call sSetSendKeys(strPssword, vbKeyControl, vbKeyV) '貼り付け
    
    

End Sub


’文字列をクリップボードに入れて何かに書き出す
Public Sub sSetSendKeys(Inputstr As String, bVk1 As Long, _
                Optional bVk2 As Long = 0, Optional bVk3 As Long = 0)
                
Clipboard.Clear
Clipboard.SetText Inputstr
                
                
'SendKeys と同様にアクティブウィンドウにキーストロークを送る
'以下のパターンは必要により追加して下さい。
    If bVk2 = 0& And bVk3 = 0& Then
    'キーを1個だけ送る
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
            Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    ElseIf bVk3 = 0& Then
    'キーの複合操作 [Alt] + [E] 等
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
            Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
            Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    ElseIf (bVk1 <> 0&) And (bVk2 <> 0&) And (bVk3 <> 0&) Then
    'SendKeys "%(EA)" と同様の操作
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
        Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
        Call keybd_event(CByte(bVk2), MapVirtualKey(CByte(bVk2), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        Call keybd_event(CByte(bVk3), MapVirtualKey(CByte(bVk3), 0), _
                        KEYEVENTF_EXTENDEDKEY Or 0, 0)
        Call keybd_event(CByte(bVk3), MapVirtualKey(CByte(bVk3), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
        Call keybd_event(CByte(bVk1), MapVirtualKey(CByte(bVk1), 0), _
                        KEYEVENTF_EXTENDEDKEY Or KEYEVENTF_KEYUP, 0)
    End If
   StopTime (50)     '連続処理した場合を考慮
End Sub
Private Sub TabPush(Optional i As Integer = 1)
    
    ReDim wVkKey(1) As Integer
    ReDim UpDown(1) As Integer
        wVkKey(0) = vbKeyTab: UpDown(0) = 0    'TAB キーダウン
        wVkKey(1) = vbKeyTab: UpDown(1) = 1     'TAB キーアップ
    For i = 1 To i
        sKeyEventSet 2, wVkKey, UpDown
            StopTime (50)     '連続処理した場合を考慮
    Next i
End Sub

[ツリー表示へ]
タイトルRe^2: VBから フォーム外のテキスト入力ボックスへの入力
記事No15491
投稿日: 2012/06/03(Sun) 13:33
投稿者@chie
いただいた ソースをつかってみましたところ

Dim acc As IAccessibleで

ユーザー定義型が定義されていないエラーがでます
参照設定ができていないのだと思うのですが

IAccessibleを定義するにはどの参照設定を選べばよいのでしょうか


AccessibilityCplAdmin 1.0 Type Libraryは選択済みですがエラーがでます

初歩的な質問でもうしわけありません

[ツリー表示へ]
タイトルRe^3: VBから フォーム外のテキスト入力ボックスへの入力
記事No15492
投稿日: 2012/06/03(Sun) 16:19
投稿者VBレスキュー(花ちゃん)
> IAccessibleを定義するにはどの参照設定を選べばよいのでしょうか

[ワード検索]で IAccessible をキーに検索して見て下さい。

[ツリー表示へ]
タイトルIAccessible
記事No15493
投稿日: 2012/06/03(Sun) 16:48
投稿者@chie
探せました

oleacc.dllというのを
参照設定→参照から開くことによって

参照可能なライブラリファイルの一覧に
Accessibilityという項目がでてきました

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

引き続き本題に取りかかれそうです

[ツリー表示へ]