Hi, Ich hab gestern etwas mit der Winapi rumgespielt.
Mit diesem Code kann man, wenn ein Chatfenster offen ist, in die Chatbox schreiben.
Ihr Braucht eine Textbox, eine ListBox und einen Button.
Deklarationen:
Da man nur 15000 Zeichen nutzen kann, hab ich die Messages auf meinen Space hochgeladen:
tsuyo.de/files/enums.txt
Spoiler anzeigen
Hier sind die Funktionen und Hilffunktionen die die Handles zurück geben:
Spoiler anzeigen
Die Sub Handles() könnt ihr dann im ButtonKlickEvent aufrufen.
Zur Anmerkung.
Man kann in Icq ja Tabbed Chatten.
Pro Tab, gibt es 4 Handles. Wir benötigen immer den 2ten Handle, somit fällt 1,3 und 4 Weg.
Man könnte nun im Textbox ChangeText event das eintragen:
Und schon landet der Text in der Textbox, vom ausgewählten Handle.
Was ihr Damit macht ist natürlich eure Sache.
Oben in den Deklarationen hab ich bewusst diese Lange liste an WindowsMessages reingesetzt, sowas kann man immer gebrauchen
Kopieren bitte nur bei Erlaubnis.
Mit diesem Code kann man, wenn ein Chatfenster offen ist, in die Chatbox schreiben.
Ihr Braucht eine Textbox, eine ListBox und einen Button.
Deklarationen:
Da man nur 15000 Zeichen nutzen kann, hab ich die Messages auf meinen Space hochgeladen:
tsuyo.de/files/enums.txt
VB.NET-Quellcode
- <DllImport("User32.dll")> _
- Private Shared Function EnumChildWindows _
- (ByVal WindowHandle As IntPtr, ByVal Callback As EnumWindowProcess, ByVal lParam As IntPtr) As Boolean
- End Function
- Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" (ByVal hwnd As IntPtr, ByVal lpString As String, ByVal cch As IntPtr) As IntPtr
- Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" (ByVal hwnd As IntPtr) As IntPtr
- Public Delegate Function EnumWindowProcess(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
- Public Shared Function GetChildWindows(ByVal ParentHandle As IntPtr) As IntPtr()
- Dim ChildrenList As New List(Of IntPtr)
- Dim ListHandle As GCHandle = GCHandle.Alloc(ChildrenList)
- Try
- EnumChildWindows(ParentHandle, AddressOf EnumWindow, GCHandle.ToIntPtr(ListHandle))
- Finally
- If ListHandle.IsAllocated Then ListHandle.Free()
- End Try
- Return ChildrenList.ToArray
- End Function
- Private Shared Function EnumWindow(ByVal Handle As IntPtr, ByVal Parameter As IntPtr) As Boolean
- Dim ChildrenList As List(Of IntPtr) = GCHandle.FromIntPtr(Parameter).Target
- If ChildrenList Is Nothing Then Throw New Exception("GCHandle Target could not be cast as List(Of IntPtr)")
- ChildrenList.Add(Handle)
- Return True
- End Function
Hier sind die Funktionen und Hilffunktionen die die Handles zurück geben:
VB.NET-Quellcode
- Function wn(ByVal id As IntPtr) As String 'Returnt den Fenstertitel
- Try
- Dim a As Integer
- Dim title As String
- Dim Leng As Integer
- a = id
- Leng = GetWindowTextLength(a)
- title = Space(Leng + 1)
- GetWindowText(a, title, Leng + 1)
- Return title
- Catch ex As Exception
- Return "a"
- End Try
- End Function
- Public Class users
- Public handle As IntPtr
- Public title As String
- Public Sub New(ByVal handle_ As IntPtr, ByVal title_ As String)
- handle = handle_
- title = title_
- End Sub
- End Class
- Dim userlist As New List(Of users)
- Public Sub Handles()
- Dim icqhandle As IntPtr = 0
- Dim icqtext As String = Nothing
- For Each pr As Process In Process.GetProcesses
- If pr.ProcessName = "ICQ" Then
- icqhandle = pr.Handle
- icqtext = pr.MainWindowTitle
- Exit For
- End If
- Next
- If icqhandle = 0 Then
- Exit Sub
- End If
- Dim ids() As IntPtr = GetChildWindows(FindWindow(Nothing, icqtext))
- For i As Integer = 0 To ids.Length - 1
- userlist.Clear()
- For a As Integer = 1 To i Step 4
- userlist.Add(New users(ids(a), Nothing))
- Next
- Next
- userlist.Reverse()
- ListBox1.Items.Clear()
- For i As Integer = 0 To userlist.Count - 1
- ListBox1.Items.Add(userlist(i).handle)
- Next
- End Sub
Die Sub Handles() könnt ihr dann im ButtonKlickEvent aufrufen.
Zur Anmerkung.
Man kann in Icq ja Tabbed Chatten.
Pro Tab, gibt es 4 Handles. Wir benötigen immer den 2ten Handle, somit fällt 1,3 und 4 Weg.
Man könnte nun im Textbox ChangeText event das eintragen:
Und schon landet der Text in der Textbox, vom ausgewählten Handle.
Was ihr Damit macht ist natürlich eure Sache.
Oben in den Deklarationen hab ich bewusst diese Lange liste an WindowsMessages reingesetzt, sowas kann man immer gebrauchen
Kopieren bitte nur bei Erlaubnis.