ausgelagert aus Wie funktionieren bestimmte API's richtig? ~VaporiZed
Hallo zusammen
Ich muss leider zugeben, dass für mich das Problem wohl nicht Zugriff auf die API ist, sondern eben diese Delegate Geschichte. Das hier ist wohl ein gutes Beispiel, das zu erlernen, für mich ist das momentan leider zu viel.
Ich habe mir mal überlegt, möglichst viel von diesem Delgate zu entfernen. Ich bin leider Anfänger, habe nun ewigs gebraucht und der Code ist vielleicht falsch. In den nächsten Tagen werde ich mal schauen, wie ich von diesem vereinfachten Code wieder auf den ursprünglichen Code zurückkomme. Ich muss das mal verdauen.
Ich habe den Code für mich geschrieben, damit ich das erlernen kann. Falls jemand Fehler entdeckt, bitte melden - ich möchte etwas lernen. Aufgefallen ist mir noch, dass eben oft der MainWindowsHandle = 0 ist - das habe ich abgefangen, damit es nicht so viele Ausgaben gibt.
Ich habe mal meinen Code hier eingestellt.
und hier noch mein Modul (ich habe Modul gewählt und nicht Klasse - leider kenne ich den Unterschied nicht)
Hallo zusammen
Ich muss leider zugeben, dass für mich das Problem wohl nicht Zugriff auf die API ist, sondern eben diese Delegate Geschichte. Das hier ist wohl ein gutes Beispiel, das zu erlernen, für mich ist das momentan leider zu viel.
Ich habe mir mal überlegt, möglichst viel von diesem Delgate zu entfernen. Ich bin leider Anfänger, habe nun ewigs gebraucht und der Code ist vielleicht falsch. In den nächsten Tagen werde ich mal schauen, wie ich von diesem vereinfachten Code wieder auf den ursprünglichen Code zurückkomme. Ich muss das mal verdauen.
Ich habe den Code für mich geschrieben, damit ich das erlernen kann. Falls jemand Fehler entdeckt, bitte melden - ich möchte etwas lernen. Aufgefallen ist mir noch, dass eben oft der MainWindowsHandle = 0 ist - das habe ich abgefangen, damit es nicht so viele Ausgaben gibt.
Ich habe mal meinen Code hier eingestellt.
VB.NET-Quellcode
- Imports System.Diagnostics
- Imports Microsoft.VisualBasic
- Public Class Form2
- Dim dt As New DataTable
- Dim dv As New DataView(dt)
- Dim Parent_Handle_str As String
- Dim Handle_0 As Boolean
- Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
- With dt.Columns
- .Add("Handle", Type.GetType("System.Int64"))
- .Add("Handle_child", Type.GetType("System.Int64"))
- .Add("lparam", Type.GetType("System.Int64"))
- .Add("MainWindowTitle", Type.GetType("System.String"))
- .Add("ProcessID", Type.GetType("System.String"))
- .Add("HandleCount", Type.GetType("System.String"))
- .Add("MainModule", Type.GetType("System.String"))
- .Add("ProcessName", Type.GetType("System.String"))
- End With
- DataGridView1.DataSource = dv
- ' alle Prozesse durchlaufen
- Handle_0 = False
- For Each oProcess As Process In Process.GetProcesses
- ' Prozess-Infos ermitteln und im ListView anzeigen
- Dim windowHandle As IntPtr = oProcess.MainWindowHandle
- Dim row As DataRow = dt.NewRow()
- '' 1. Eintrag
- Try
- row!Handle = windowHandle.ToString
- Catch
- row!Handle = ""
- End Try
- If Len(row!Handle.ToString) > 0 Then
- '' 2. Eintrag
- row!MainWindowTitle = GetActiveWindowText(windowHandle) 'oProcess.MainWindowTitle.ToString
- '3. Eintrag
- Try
- row!ProcessID = CInt(oProcess.Id.ToString)
- Catch
- row!ProcessID = ""
- End Try
- '4. Êintrag
- Try
- row!HandleCount = oProcess.HandleCount.ToString
- Catch
- row!HandleCount = ""
- End Try
- Try
- row!MainModule = oProcess.MainModule.ToString
- Catch
- row!MainModule = ""
- End Try
- Try
- row!ProcessName = oProcess.ProcessName.ToString
- Catch
- row!ProcessName = ""
- End Try
- dt.Rows.Add(row)
- Parent_Handle_str = row!Handle.ToString
- 'Nur 1 x Handle 0..
- If windowHandle.ToInt64 = 0 Then
- If Handle_0 Then
- Else
- Handle_0 = True
- GetChild(windowHandle)
- End If
- Else
- GetChild(windowHandle)
- End If
- End If
- Next
- End Sub
- Public Function Enumerate(hWnd As IntPtr, lParam As IntPtr) As Boolean
- Dim row As DataRow = dt.NewRow()
- row!Handle = Parent_Handle_str
- row!Handle_child = hWnd.ToInt64
- row!MainWindowTitle = GetActiveWindowText(hWnd)
- dt.Rows.Add(row)
- Return True
- End Function
- Public Function GetChild(hwnd As IntPtr) As Boolean
- Dim x As Boolean
- x = EnumChildWindows(hwnd, AddressOf Enumerate, CType(0, IntPtr))
- Return True
- End Function
- End Class
und hier noch mein Modul (ich habe Modul gewählt und nicht Klasse - leider kenne ich den Unterschied nicht)
VB.NET-Quellcode
- Imports System.Runtime.InteropServices
- Imports System.Text
- Module Module1
- <DllImport("user32.dll", SetLastError:=True)>
- Private Function GetForegroundWindow() As IntPtr
- End Function
- <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
- Private Function GetWindowText(ByVal hwnd As IntPtr, ByVal lpString As StringBuilder, ByVal cch As Integer) As Integer
- End Function
- <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
- Private Function GetWindowTextLength(ByVal hwnd As IntPtr) As Integer
- End Function
- 'no specific Charset APIs
- <DllImport("user32.dll", SetLastError:=True)>
- Public Function EnumChildWindows(hWndParent As IntPtr, lpEnumFunc As EnumWindowsProc, lParam As IntPtr) As Boolean
- End Function
- Public Delegate Function EnumWindowsProc(hWnd As IntPtr, lParam As IntPtr) As Boolean
- Public Function GetActiveWindowText(hWnd As IntPtr) As String
- Dim length As Integer ', hWnd As IntPtr = GetForegroundWindow()
- If hWnd.ToInt32 = 0 Then
- Return Nothing
- End If
- length = GetWindowTextLength(hWnd)
- If length = 0 Then
- Return Nothing
- End If
- Dim sb As New System.Text.StringBuilder("", length)
- GetWindowText(hWnd, sb, sb.Capacity + 1)
- Return sb.ToString()
- End Function
- End Module
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „VaporiZed“ ()