Auf ein Control von einem anderen Programm zugreifen
- VB.NET
Sie verwenden einen veralteten Browser (%browser%) mit Sicherheitsschwachstellen und können nicht alle Funktionen dieser Webseite nutzen.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Hier erfahren Sie, wie einfach Sie Ihren Browser aktualisieren können.
Es gibt 28 Antworten in diesem Thema. Der letzte Beitrag () ist von xaverl.
-
-
you'd send a WM_GETTEXT message to the window handle which you'd get with FindWindowEx API if you search the forum for that message or that API then you'll find lots of examples.
bigresource.com/Tracker/Track-vb-MFoDAH7RTn/Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln! -
Ich kann bisher nur Inhalt hinzufügen
VB.NET-Quellcode
- Public Class Form1
- Declare Function GetAsyncKeyState Lib "user32.dll" (ByVal nVirtKey As Keys) As Short
- Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
- Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWndParent As Integer, ByVal hWndChildAfter As Integer, ByVal lpszClass As String, ByVal lpszWindow As String) As Integer
- Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Integer, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
- Private Const WM_CHAR As Integer = &H102
- Private hwnd As IntPtr
- Private f As IntPtr
- Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
- hwnd = FindWindow(vbNullString, "Unbenannt - Editor")
- f = FindWindowEx(hwnd, 0, "Edit", vbNullString)
- End Sub
- Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
- SendMessage(f, WM_CHAR, Asc(e.KeyChar), 0)
- End Sub
- End Class
getestet mit dem Editor. Aber ich will es eigentl. genau anders rum!
Lg Leon -
-
-
Aaaach, heut gibts sources umsonst, was soll der Geiz...
Spoiler anzeigen VB.NET-Quellcode
- Public Class Form1
- Private Declare Function SendMessageByString Lib "user32.dll" Alias _
- "SendMessageA" _
- (ByVal hwnd As IntPtr, _
- ByVal uMsg As Int32, _
- ByVal wParam As IntPtr, _
- ByVal lParam As String) As Integer
- Private Const WM_SETTEXT As Int32 = &HC
- Private Const WM_GETTEXT As Int32 = &HD
- Private Declare Function SendMessageByInt Lib "user32.dll" Alias _
- "SendMessageA" _
- (ByVal hwnd As IntPtr, _
- ByVal uMsg As Int32, _
- ByVal wParam As Int32, _
- ByVal lParam As Int32) As Integer
- Private Const WM_GETTEXTLENGTH As Int32 = &HE
- Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
- (ByVal lpClassName As String, _
- ByVal lpWindowName As String) As IntPtr
- Private Declare Function FindWindowEx Lib "user32.dll" Alias _
- "FindWindowExA" _
- (ByVal hWnd1 As IntPtr, _
- ByVal hWnd2 As IntPtr, _
- ByVal lpsz1 As String, _
- ByVal lpsz2 As String) As IntPtr
- <Runtime.InteropServices.DllImport("user32.dll")> _
- Private Shared Function SendMessage( _
- ByVal hWnd As IntPtr, _
- ByVal Msg As Integer, _
- ByVal wParam As Integer, _
- ByVal lParam As System.Text.StringBuilder) _
- As Integer
- End Function
- Public Function GetHandle(ByVal ClassName As String) As IntPtr
- Dim hwnd As IntPtr = FindWindow(ClassName, Nothing)
- hwnd = FindWindowEx(hwnd, IntPtr.Zero, "Edit", Nothing)
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Return hwnd
- Else
- Return IntPtr.Zero
- End If
- End Function
- Public Sub SetNewText(ByVal hwnd As IntPtr, ByVal txt As String)
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Call SendMessageByString(hwnd, WM_SETTEXT, IntPtr.Zero, txt)
- End If
- End Sub
- Public Function GetNewText(ByVal hwnd As IntPtr) As String
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Dim SB As New System.Text.StringBuilder
- Dim BufferSize As Integer = 32768
- SB.EnsureCapacity(BufferSize)
- SendMessage(hwnd, WM_GETTEXT, BufferSize, SB)
- Return SB.ToString
- Else
- Return ""
- End If
- End Function
- Public Function GetTextLength(ByVal hwnd As IntPtr) As Integer
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Dim Length As Integer = SendMessageByInt(hwnd, WM_GETTEXTLENGTH, 0, _
- 0)
- If Length > 0 Then
- Return Length
- Else
- Return 0
- End If
- End If
- End Function
- Private Sub Button1Click(ByVal sender As System.Object, ByVal e As _
- System.EventArgs) Handles Button1.Click
- Dim hwnd As IntPtr = GetHandle("Notepad")
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- 'Call SetNewText(hwnd, "http://www.visual-basic5.de")
- MsgBox(GetNewText(hwnd))
- Else
- MessageBox.Show("Notepad not found...", "Info")
- End If
- End Sub
- End Class
credits visual-basic5.deFür ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln! -
-
Hallo,
ich kämpfe mich mit einem ähnlichen Problem rum wie Halfbax.
Ich habe versucht den Code von bla auf mich umzuschreiben (Visual Studio 2010) und das SetText habe ich weggelassen.
Jetzt bekomme ich immer die Messagebox angezeigt Notepad not found.
Jetzt wollt ich euch fragen ob er dann den Frame nicht findet, aus dem ich Daten haben will?
Danke -
-
Ich will die Daten aus einem anderen Programm auslesen und verwende natürlich die Classennamen von diesem Programm.
Ich poste dir schnell deinen Code so wie ich ihn momentan habe.
Spoiler anzeigen VB.NET-Quellcode
- Private Declare Function SendMessageByString Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
- 'Private Const WM_SETTEXT As Integer = &HC
- Private Const WM_GETTEXT As Integer = &HD
- Private iHwndForm As IntPtr
- 'Fensterhanlde ermitteln
- Private iHwndFrame As IntPtr
- Private Declare Function SendMessageByInt Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As IntPtr, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
- Private Const WM_GETTEXTLENGTH As Integer = &HE
- Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As IntPtr
- Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" (ByVal hWnd1 As IntPtr, ByVal hWnd2 As IntPtr, ByVal lpsz1 As String, ByVal lpsz2 As String) As IntPtr
- <Runtime.InteropServices.DllImport("user32.dll")>
- Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As Integer, ByVal wParam As Integer, ByVal lParam As System.Text.StringBuilder) As Integer
- End Function
- Public Function GetHandle(ByVal ClassName As String) As IntPtr
- Dim hwnd As IntPtr = FindWindow("Migg", "ThunderRT6FormDC")
- hwnd = FindWindowEx(hwnd, 0, "ThunderRT6Frame", "Messungsergebnis")
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Return hwnd
- Else
- Return 0
- End If
- End Function
- 'Public Sub SetNewText(ByVal hwnd As IntPtr, ByVal txt As String)
- ' If (Not hwnd.Equals(IntPtr.Zero)) Then
- ' Call SendMessageByString(hwnd, WM_SETTEXT, 0, txt)
- ' End If
- 'End Sub
- Public Function GetNewText(ByVal hwnd As IntPtr) As String
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Dim SB As New System.Text.StringBuilder
- Dim BufferSize As Integer = 32768
- SB.EnsureCapacity(BufferSize)
- SendMessage(hwnd, WM_GETTEXT, BufferSize, SB)Return SB.ToString
- Else
- Return ""
- End If
- End Function
- Public Function GetTextLength(ByVal hwnd As IntPtr) As Integer
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- Dim Length As Integer = SendMessageByInt(hwnd, WM_GETTEXTLENGTH, 0, 0)
- If Length > 0 Then
- Return Length
- Else
- Return 0
- End If
- End If
- End Function
- Private Sub Button1Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- ''Fenster Handle ermitteln
- 'iHwndForm = FindWindow(vbNullString, "Migg")
- ''Button Handle ermitteln
- 'iHwndFrame = FindWindowEx(iHwndForm, 0, "ThunderRT6Frame", "Messungsergebnis")
- 'MsgBox(GetNewText("Messungsergebnis"))
- Dim hwnd As IntPtr = GetHandle("Messungsergebnis")
- If (Not hwnd.Equals(IntPtr.Zero)) Then
- 'Call SetNewText(hwnd, "http://www.visual-basic5.de")
- MsgBox(GetNewText(hwnd))
- Else
- MessageBox.Show("Wo sind die verdammten Zahlen")
- End If
- End Sub
- End Class
-
-
-
-
Nach langen rumprobieren bin ich jetzt auf das Problem gestoßen.
Es ist das FindWindowEx da ich damit nur direkte ChildWindows ansprechen kann und der Frame den ich ansprechen will ist jetzt eine Hirachieebene drunter. Weiß jemand mit welcher Funktion man "vererbte Childwindows" ansprechen kann.
Danke -
-
-
VB.NET-Quellcode
- Private Sub Button1Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
- Dim hwnd As IntPtr '= GetHandle("Messungsergebnis")
- Dim childwindow1, childwindow2 As intptr
- hwnd = FindWindow("ThunderRT6FormDC", "Migg")
- childwindow1 = FindWindowEx(hwnd, 0, "ThunderRT6PictureBoxDC", "")
- childwindow2 = FindWindowEx(childwindow1, 0, "ThunderRT6Frame", "Messungsergebnis")
- 'If (Not hwndFrame.Equals(IntPtr.Zero)) Then
- DataGridView1.Rows(0).Cells(0).Value = (GetNewText(childwindow2))
Ich hab jetzt bei meinem hwnd und bei meinem childwindow1 einen Wert.
Bei meinem childwindow2 erhalte ich immer noch keinen Wert.
Mein Problem ist jetzt, dass ich von den ThunderRT6PictureBoxDC 4 Stück habe und die die ich brauch ist die 3. aber ich denke mein Programm steuert immer die 1. an. Über den WindowNamen kann ich es leider nicht ansteuern weil alle 4 Pictureboxen keinen Namen haben. -
ich glaube, wenn es die 3. Picturebox ist, dann musst du 3 mal findwindowex machen. Bin mir aber nicht sicher. Also quasi:
VB.NET-Quellcode
Für ein Mindestmaß an Rechtschreibung, Interpunktion und Majuskeln! -
Ich habs gerade ausprobiert und es geht leider nicht.
Jetzt hab ich mal eine Frage:
Da heißt es jetzt in der msdn Beschreibung das der Teil "in_opt HWND hwndChildAfter" wenn er null ist in mit dem ersten Childwindow beginnt. Kann ich dem jetzt irgendwie sagen beginn erst mit dem dritten? -
Das erste Fenster findest Du mit
das nächste mit
das übernächste mit
usw.Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch
Ein guter .NET-Snippetkonverter (der ist verfügbar).
Programmierfragen über PN / Konversation werden ignoriert!
-
Ähnliche Themen
-
Browser starten und Status (DocumentComplete) abfragen
DerAbsoluteAnfänger - - Internet- und Netzwerkprogrammierung
-
3 Benutzer haben hier geschrieben
- Gast (17)
- bla (11)
- RodFromGermany (1)