tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板 [ツリー表示へ]   [Home]
一括表示(VB6.0)
タイトル他アプリのTextBoxの文字取得について
記事No11635
投稿日: 2008/03/04(Tue) 15:39
投稿者
VBで他のアプリのTextBoxに入力された文字を取得したいのですが、
TextBoxが多数あるため、思うように取得することが出来ません
1つだけであれば取得することは出来たのですが、複数ある場合は
どのようになるのでしょうか?

宜しくお願いします
Dim hwindow As Long
Dim hWnd(100) As Long
Dim buf(255) As Byte
Dim ret As Long
Dim s As String
Dim i As Long
Dim str As String

    ' 親ハンドルから子ハンドルを取得
    hwindow = FindWindow(vbNullString, "アプリ名")
    If hwindow <> 0 Then
        For i = 0 To 99
            hWnd(i + 1) = FindWindowEx(hwindow, 0, "ThunderRT6TextBox", vbNullString)
            ' EDPNOを取得
            ret = SendMessage(hWnd(i + 1), WM_GETTEXT, 255, buf(0))
            If ret <> 0 Then
                s = StrConv(buf, vbUnicode)
                ' 代入
                str = Left$(s, ret)                
            End If
        Next
    End If

[ツリー表示へ]
タイトルRe: 他アプリのTextBoxの文字取得について
記事No11641
投稿日: 2008/03/04(Tue) 17:02
投稿者neptune
こんにちは

> 1つだけであれば取得することは出来たのですが、複数ある場合は
> どのようになるのでしょうか?
子ウィンドウのHWNDを列挙するEnumChildWindowsっていうAPIがあります。
クラス名は判っているのでEnumChildProc内でクラス名を判断したらどうでしょうか?「GetClassName」

[ツリー表示へ]
タイトルRe^2: 他アプリのTextBoxの文字取得について
記事No11682
投稿日: 2008/03/06(Thu) 14:00
投稿者
neptuneさん

> 子ウィンドウのHWNDを列挙するEnumChildWindowsっていうAPIがあります。
> クラス名は判っているのでEnumChildProc内でクラス名を判断したらどうでしょうか?「GetClassName」

これで出来ました
ありがとうございました

[ツリー表示へ]
タイトルRe^3: 他アプリのTextBoxの文字取得について
記事No11686
投稿日: 2008/03/06(Thu) 14:45
投稿者
出来たと思ったんですが・・・
実行時エラー49が出ます
ファイルは全て同じディレクトリにありますが、何故なのでしょうか?

呼び出しもと
ret = EnumChildWindows(hWnd, AddressOf EnumChildProc, 0)


コールバック関数
Public Function EnumChildProc(ByVal hWnd As Long) As Long
Dim ret As Long
Dim Leng As Long
Dim Name As String
Dim s As String
Dim buf(255) As Byte


On Error GoTo Ext

    'バッファ確保
    Name = String(255, Chr(0))
    Leng = Len(Name)
    
    
    '名前を取得する
    ret = GetClassName(hWnd, Name, Leng)
    
    If ret <> 0 Then
        If InStr(1, Name, CHILD_CLASS) <> 0 Then
            ret = SendMessage(hWnd, WM_GETTEXT, MAX_BUFF, buf(0))
            s = StrConv(buf, vbUnicode)
            Debug.Print s
      '↑ここで、文字があったときEnd Functionに行くとエラーになる
        End If
    End If
    
    '次にいく
    EnumChildProc = True 

Ext:
End Function

[ツリー表示へ]
タイトルRe^4: 他アプリのTextBoxの文字取得について
記事No11688
投稿日: 2008/03/06(Thu) 15:42
投稿者魔界の仮面弁士
> 実行時エラー49が出ます
ということは、「DLL が正しく呼び出せません。」のエラーでしょうか。


状況を確認したいので、Declare の宣言部も含めて、
コード全体を提示していただけないでしょうか?

[ツリー表示へ]
タイトルRe^5: 他アプリのTextBoxの文字取得について
記事No11691
投稿日: 2008/03/06(Thu) 17:02
投稿者
魔界の仮面弁士さん

ありがとうございます


> 状況を確認したいので、Declare の宣言部も含めて、
> コード全体を提示していただけないでしょうか?


その通りです
    Private Declare Function FindWindowA Lib "USER32" (ByVal cnm As String, ByVal cap As String) As Long
    Private Declare Function FindWindowW Lib "USER32" (ByVal cnm As String, ByVal cap As String) As Long
    Private Declare Function FindWindowExA Lib "USER32" (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
    Private Declare Function FindWindowExW Lib "USER32" (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
    Private Declare Function GetWindowTextA Lib "USER32" (ByVal hwd As Long, ByVal buf As String, ByVal bln As Long) As Long
    Private Declare Function GetWindowTextW Lib "USER32" (ByVal hwd As Long, ByVal buf As String, ByVal bln As Long) As Long
    Public Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
    Private Declare Function PostMessageA Lib "USER32" (ByVal hwd As Long, ByVal msg As Long, ByVal wpara As Long, ByVal lpara As Long) As Long
    Private Declare Function PostMessageW Lib "USER32" (ByVal hwd As Long, ByVal msg As Long, ByVal wpara As Long, ByVal lpara As Long) As Long
    Private Declare Function GetForegroundWindow Lib "USER32" () As Long
    Private Declare Function SetForegroundWindow Lib "USER32" (ByVal hWnd As Long) As Long
    Public Declare Function EnumChildWindows Lib "USER32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
    Public Declare Function GetClassName Lib "USER32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long


' 子クラスの列挙
Public Function EnumChildProc(ByVal hWnd As Long) As Long
Dim ret As Long
Dim Leng As Long
Dim Name As String
Dim s As String
Dim buf(255) As Byte


On Error GoTo Ext

    'バッファ確保
    Name = String(255, Chr(0))
    Leng = Len(Name)
    
    
    '名前を取得する
    'ret = GetWindowText(hWnd, Name, Leng)
    ret = GetClassName(hWnd, Name, Leng)
    
    'リストボックスに追加していく
    If ret <> 0 Then
        If InStr(1, Name, CHILD_CLASS) <> 0 Then
            ret = SendMessage(hWnd, WM_GETTEXT, MAX_BUFF, buf(0))
            s = StrConv(buf, vbUnicode)
            Debug.Print s
            If Len(Trim(Left$(s, 9))) = 9 Then
                s = Left$(s, 9)                
                Form1.Label11.Caption = s  
            End If
        End If
    End If
    
    '次にいく
    EnumChildProc = True

Ext:
End Function

[ツリー表示へ]
タイトルRe^6: 他アプリのTextBoxの文字取得について
記事No11695
投稿日: 2008/03/06(Thu) 17:40
投稿者魔界の仮面弁士
> > 状況を確認したいので、Declare の宣言部も含めて、
> > コード全体を提示していただけないでしょうか?
> その通りです

EnumChildWindows の呼び出し部分や、定数定義等も含めた
完全なコードでお願いできますでしょうか。

# 動作するコードだというのであれば、宣言等も類推できますけれど、
# 期待動作しない場合には、宣言の間違い等も疑わねばならないので…。

[ツリー表示へ]
タイトルRe^6: 他アプリのTextBoxの文字取得について
記事No11698
投稿日: 2008/03/07(Fri) 07:57
投稿者
> 魔界の仮面弁士さん
>
> ありがとうございます
>
>
> > 状況を確認したいので、Declare の宣言部も含めて、
> > コード全体を提示していただけないでしょうか?
>
>
> その通りです
>     Private Declare Function FindWindowA Lib "USER32" (ByVal cnm As String, ByVal cap As String) As Long
>     Private Declare Function FindWindowW Lib "USER32" (ByVal cnm As String, ByVal cap As String) As Long
>     Private Declare Function FindWindowExA Lib "USER32" (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
>     Private Declare Function FindWindowExW Lib "USER32" (ByVal hpar As Long, ByVal hchi As Long, ByVal cnm As String, ByVal cap As String) As Long
>     Private Declare Function GetWindowTextA Lib "USER32" (ByVal hwd As Long, ByVal buf As String, ByVal bln As Long) As Long
>     Private Declare Function GetWindowTextW Lib "USER32" (ByVal hwd As Long, ByVal buf As String, ByVal bln As Long) As Long
>     Public Declare Function SendMessage Lib "USER32" Alias "SendMessageA" (ByVal hWnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
>     Private Declare Function PostMessageA Lib "USER32" (ByVal hwd As Long, ByVal msg As Long, ByVal wpara As Long, ByVal lpara As Long) As Long
>     Private Declare Function PostMessageW Lib "USER32" (ByVal hwd As Long, ByVal msg As Long, ByVal wpara As Long, ByVal lpara As Long) As Long
>     Private Declare Function GetForegroundWindow Lib "USER32" () As Long
>     Private Declare Function SetForegroundWindow Lib "USER32" (ByVal hWnd As Long) As Long
>     Public Declare Function EnumChildWindows Lib "USER32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
>     Public Declare Function GetClassName Lib "USER32" Alias "GetClassNameA" (ByVal hWnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
>
>
> ' 子クラスの列挙
> Public Function EnumChildProc(ByVal hWnd As Long) As Long
> Dim ret As Long
> Dim Leng As Long
> Dim Name As String
> Dim s As String
> Dim buf(255) As Byte
>
>
> On Error GoTo Ext
>
>     'バッファ確保
>     Name = String(255, Chr(0))
>     Leng = Len(Name)
>    
>    
>     '名前を取得する
>     'ret = GetWindowText(hWnd, Name, Leng)
>     ret = GetClassName(hWnd, Name, Leng)
>    
>     'リストボックスに追加していく
>     If ret <> 0 Then
>         If InStr(1, Name, CHILD_CLASS) <> 0 Then
>             ret = SendMessage(hWnd, WM_GETTEXT, MAX_BUFF, buf(0))
>             s = StrConv(buf, vbUnicode)
>             Debug.Print s
>             If Len(Trim(Left$(s, 9))) = 9 Then
>                 s = Left$(s, 9)                
>                 Form1.Label11.Caption = s  
>             End If
>         End If
>     End If
>    
>     '次にいく
>     EnumChildProc = True
>
> Ext:
> End Function

[ツリー表示へ]
タイトルRe^7: 他アプリのTextBoxの文字取得について
記事No11699
投稿日: 2008/03/07(Fri) 07:59
投稿者
魔界の仮面弁士さん
ありがとうございます

呼び出し元です
Dim hWnd As Long
Dim ret As Long
    
    hWnd = FindWindow(vbNullString, Label4.Caption)
    If hWnd = Me.hWnd Then Exit Sub                     ' 自分は対象外
    ret = EnumChildWindows(hWnd, AddressOf EnumChildProc, 0)

[ツリー表示へ]