-2

アプリケーションで使用可能なすべてのコントロールを見つける方法。アプリケーション間で相互作用することは可能ですか?アプリケーションから、特定のコントロールのシステムで実行されている別のアプリケーション(Windows)に値を設定する必要があります。

4

2 に答える 2

1

このコードは、システムで実行されているプロセスに関連付けられているすべての制御値を取得します。このコードには、2つのファイル1があります。ApiWindowはクラスファイルであり、その他はmain()クラスです。Main()はApiWindowクラスを使用し、Spy++ツールが機能するときにコントロール値を取得します。コントロールを処理し、SendMessage(child.hWnd、WM_SETTEXT、0、 "Ur Value")を使用して特定のコントロールに値を設定できます。このhwndはハンドルIDを取得し、WM_SETTEXTは指定されたテキストを更新するメッセージを渡します。WM_SETTEXTをConstWM_SETTEXT=&HCのようなグローバル変数として宣言します。

注:プログラムの実行中に、VisualStudiaを「管理者として実行」する

コード:

Imports System.Collections.Generic
Imports System.Runtime.InteropServices
Imports System.Text

Public Class ApiWindow
Public MainWindowTitle As String = ""
Public ClassName As String = ""
Public hWnd As Int32
End Class

''' <summary> 
''' Enumerate top-level and child windows 
''' </summary> 
''' <example> 
''' Dim enumerator As New WindowsEnumerator()
''' For Each top As ApiWindow in enumerator.GetTopLevelWindows()
'''    Console.WriteLine(top.MainWindowTitle)
'''    For Each child As ApiWindow child in enumerator.GetChildWindows(top.hWnd) 
'''        Console.WriteLine(" " + child.MainWindowTitle)
'''    Next child
''' Next top
''' </example> 
Public Class WindowsEnumerator

  Private Delegate Function EnumCallBackDelegate(ByVal hwnd As Integer, ByVal lParam As Integer) As Integer

  ' Top-level windows.
  Private Declare Function EnumWindows Lib "user32" _
   (ByVal lpEnumFunc As EnumCallBackDelegate, ByVal lParam As Integer) As Integer

  ' Child windows.
  Private Declare Function EnumChildWindows Lib "user32" _
   (ByVal hWndParent As Integer, ByVal lpEnumFunc As EnumCallBackDelegate, ByVal lParam As Integer) As Integer

  ' Get the window class.
  Private Declare Function GetClassName _
   Lib "user32" Alias "GetClassNameA" _
   (ByVal hwnd As Integer, ByVal lpClassName As StringBuilder, ByVal nMaxCount As Integer) As Integer

  ' Test if the window is visible--only get visible ones.
  Private Declare Function IsWindowVisible Lib "user32" _
   (ByVal hwnd As Integer) As Integer

  ' Test if the window's parent--only get the one's without parents.
  Private Declare Function GetParent Lib "user32" _
   (ByVal hwnd As Integer) As Integer

  ' Get window text length signature.
  Private Declare Function SendMessage _
   Lib "user32" Alias "SendMessageA" _
   (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As Int32) As Int32

  ' Get window text signature.
  Private Declare Function SendMessage _
   Lib "user32" Alias "SendMessageA" _
   (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As StringBuilder) As Int32

  Private _listChildren As New List(Of ApiWindow)
  Private _listTopLevel As New List(Of ApiWindow)

  Private _topLevelClass As String = ""
  Private _childClass As String = ""

  ''' <summary>
  ''' Get all top-level window information
  ''' </summary>
  ''' <returns>List of window information objects</returns>
  Public Overloads Function GetTopLevelWindows() As List(Of ApiWindow)

    EnumWindows(AddressOf EnumWindowProc, &H0)

    Return _listTopLevel

  End Function

  Public Overloads Function GetTopLevelWindows(ByVal className As String) As List(Of ApiWindow)

    _topLevelClass = className

    Return Me.GetTopLevelWindows()

  End Function

  ''' <summary>
  ''' Get all child windows for the specific windows handle (hwnd).
  ''' </summary>
  ''' <returns>List of child windows for parent window</returns>
  Public Overloads Function GetChildWindows(ByVal hwnd As Int32) As List(Of ApiWindow)

    ' Clear the window list.
    _listChildren = New List(Of ApiWindow)

    ' Start the enumeration process.
    EnumChildWindows(hwnd, AddressOf EnumChildWindowProc, &H0)

    ' Return the children list when the process is completed.
    Return _listChildren

  End Function

  Public Overloads Function GetChildWindows(ByVal hwnd As Int32, ByVal childClass As String) As List(Of ApiWindow)

    ' Set the search
    _childClass = childClass

    Return Me.GetChildWindows(hwnd)

  End Function

  ''' <summary>
  ''' Callback function that does the work of enumerating top-level windows.
  ''' </summary>
  ''' <param name="hwnd">Discovered Window handle</param>
  ''' <returns>1=keep going, 0=stop</returns>
  Private Function EnumWindowProc(ByVal hwnd As Int32, ByVal lParam As Int32) As Int32

    ' Eliminate windows that are not top-level.
    If GetParent(hwnd) = 0 AndAlso CBool(IsWindowVisible(hwnd)) Then

      ' Get the window title / class name.
      Dim window As ApiWindow = GetWindowIdentification(hwnd)

      ' Match the class name if searching for a specific window class.
      If _topLevelClass.Length = 0 OrElse window.ClassName.ToLower() = _topLevelClass.ToLower() Then
        _listTopLevel.Add(window)
      End If

    End If

    ' To continue enumeration, return True (1), and to stop enumeration 
    ' return False (0).
    ' When 1 is returned, enumeration continues until there are no 
    ' more windows left.

    Return 1

  End Function

  ''' <summary>
  ''' Callback function that does the work of enumerating child windows.
  ''' </summary>
  ''' <param name="hwnd">Discovered Window handle</param>
  ''' <returns>1=keep going, 0=stop</returns>
  Private Function EnumChildWindowProc(ByVal hwnd As Int32, ByVal lParam As Int32) As Int32

    Dim window As ApiWindow = GetWindowIdentification(hwnd)

    ' Attempt to match the child class, if one was specified, otherwise
    ' enumerate all the child windows.
    If _childClass.Length = 0 OrElse window.ClassName.ToLower() = _childClass.ToLower() Then
      _listChildren.Add(window)
    End If

    Return 1
   End Function

  ''' <summary>
  ''' Build the ApiWindow object to hold information about the Window object.
  ''' </summary>
  Private Function GetWindowIdentification(ByVal hwnd As Integer) As ApiWindow

    Const WM_GETTEXT As Int32 = &HD
    Const WM_GETTEXTLENGTH As Int32 = &HE

    Dim window As New ApiWindow()

    Dim title As New StringBuilder()

    ' Get the size of the string required to hold the window title.
    Dim size As Int32 = SendMessage(hwnd, WM_GETTEXTLENGTH, 0, 0)

    ' If the return is 0, there is no title.
    If size > 0 Then
      title = New StringBuilder(size + 1)

      SendMessage(hwnd, WM_GETTEXT, title.Capacity, title)
    End If

    ' Get the class name for the window.
    Dim classBuilder As New StringBuilder(64)
    GetClassName(hwnd, classBuilder, 64)

    ' Set the properties for the ApiWindow object.
    window.ClassName = classBuilder.ToString()
    window.MainWindowTitle = title.ToString()
    window.hWnd = hwnd

    Return window

  End Function

End Class

'''そこからメインファンクションクラスが始まります

 Imports System.Text

Module Module1
 Private Declare Function SendMessage _
   Lib "user32" Alias "SendMessageA" _
   (ByVal hwnd As Int32, ByVal wMsg As Int32, ByVal wParam As Int32, ByVal lParam As String) As Int32

    Const WM_GETTEXT As Int32 = &HD
    Const WM_GETTEXTLENGTH As Int32 = &HE

    Const WM_CREATE As Int32 = &H1
    Const WM_SETTEXT = &HC
    Sub Main()
        Static count As Integer = 0
        Dim enumerator As New WindowsEnumerator()
        Dim sb As New StringBuilder()
        For Each top As ApiWindow In enumerator.GetTopLevelWindows
            count = 0
            Console.WriteLine(top.MainWindowTitle)

            For Each child As ApiWindow In enumerator.GetChildWindows(top.hWnd)
                Console.WriteLine(child.MainWindowTitle)

               'here you can find the value of control you  want and can can set the required

               ' count = count + 1
               ' If (child.MainWindowTitle.Contains("Initial value in text box")) Then
                  '  Console.WriteLine(count.ToString)
                    'Console.ReadKey()

                'End If

                'now find the count of ur control in the sample page and set the values
               ' If (count = 104 And top.MainWindowTitle.Contains("Form1")) Then
                    'SendMessage(child.hWnd, WM_SETTEXT, 0, "required Textbox value")

              '  End If



            Next child

        Next top
        Console.Read()

    End Sub

  End Module
于 2013-03-08T04:22:39.267 に答える
0

1つのアプリからのデータを、許容できると感じる手段に永続化する場合。データベース、テキストファイル、xml。次に、一方のアプリが永続化されたデータストアを更新し、もう一方のアプリがデータストアの情報をチェックします。

于 2013-03-06T06:00:11.587 に答える