Fragensteller
Subfenster/Unterfenster eines Fremdprogramms finden!

Frage
-
Hallo,
in meinem in VB2008 geschreibenen Programm muß ich immer wieder feststellen welche Fremdprogramme gerade an meinem Computer laufen. Manche Programme laufen als sog. MDI-Anwenungen, d.h. in einem Hauptfenster werden ein oder mehrere Subfenster angezeigt. Beispiel: wenn man in WORD z.B. ein Dokument drucken will, dann wird ein Subfenster "Drucken" angezeigt
Ich habe schon viele Möglichkeiten gefunden wie ich z.B. laufende Prozeße oder geöffnete Fenster eruieren kann. Leider werden dabei immer nur die Hauptfenster aufgelistet, nicht aber die Subfenster. Weiß jemend vielelicht ein Tipp für mich?
Gruß
Christoph
Alle Antworten
-
Hallo Christoph,
den Code hier habe ich mal irgendwo gefunden und etwas damit rumgespielt. Der könnte dich weiterbringen:
Ich habe den gerade noch mal getestet und diverse Fenster eines Programmes (auch Dialoge etc.) ausprobiert. ...klapptPublic Class Form1 Delegate Function EnumWindowDelegate(ByVal hWnd As IntPtr, ByVal Lparam As IntPtr) As Boolean Private Callback As EnumWindowDelegate = New EnumWindowDelegate(AddressOf EnumWindowProc) Private Function EnumWindowProc(ByVal hWnd As IntPtr, ByVal Lparam As IntPtr) As Boolean If IsWindowVisible(hWnd) Then Dim TheLength As Integer = GetWindowTextLengthA(hWnd) Dim TheReturn(TheLength * 2) As Byte '2x the size of the Max length GetWindowText(hWnd, TheReturn, TheLength + 1) Dim TheText As String = "" For x = 0 To (TheLength - 1) * 2 If TheReturn(x) <> 0 Then TheText &= Chr(TheReturn(x)) End If Next If TheText <> "" Then ListBox1.Items.Add(TheText) Else ListBox1.Items.Add("**** Windows with no text at handle " & CStr(hWnd)) End If End If Return True End Function ' Activate an application window. Declare Auto Function SetForegroundWindow Lib "USER32.DLL" _ (ByVal hWnd As IntPtr) As Boolean Declare Auto Function FindWindow Lib "USER32.DLL" ( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As IntPtr Private Declare Function EnumWindows Lib "User32.dll" (ByVal WNDENUMPROC As EnumWindowDelegate, ByVal lparam As IntPtr) As Boolean Private Declare Auto Function GetWindowText Lib "User32.dll" (ByVal Hwnd As IntPtr, ByVal Txt As Byte(), ByVal Lng As Integer) As Integer Private Declare Function IsWindowVisible Lib "User32.dll" (ByVal hwnd As IntPtr) As Boolean Private Declare Function GetWindowTextLengthA Lib "User32.dll" (ByVal hwnd As IntPtr) As Integer Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load Try Me.Text = "WindowsDetector" Me.Label1.Text = "Alle Fenster ermitteln - hier klicken ..." Me.Label1.Dock = DockStyle.Fill Me.Label1.Font = New Font("Arial", 16, FontStyle.Bold) Me.TableLayoutPanel1.Dock = DockStyle.Fill Me.ListBox1.Dock = DockStyle.Fill Dim Result As Boolean = EnumWindows(Callback, IntPtr.Zero) Catch ex As Exception End Try End Sub Private Sub Label1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Label1.Click Me.ListBox1.Items.Clear() Dim Result As Boolean = EnumWindows(Callback, IntPtr.Zero) End Sub Private Sub ListBox1_MouseDoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Forms.MouseEventArgs) Handles ListBox1.MouseDoubleClick End Sub End Class
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express -
Hallo,
vielen Dank für Deine Antowort! Dein Code funktioniert zwar besser, als alles, was ich bis jetzt gefunden habe, vor allem werde auch die Dialog-Fenster aufgelistet. Leider wird das Subfenster des Fremdprogrammes, um das es mir ging, immer noch nicht gefunden! Ich habe keine Ahung wieso?!
Gruß
Christoph
-
Hallo Christoph,
wie oben geschrieben, habe ich den Code selbst nur gefunden. Es freut mich, dass dieser Fund gut ist. Ich möchte mich aber nicht mit fremden Federn schmücken.
Leider weiß ich auch nicht, ob und wie sich das mit Child-Fenstern verhält. Ob die die Parenteigenschaften beibehalten. Wenn dem so wäre, würde ich als Schuss ins Blaue vermuten, dass deine Anwendung ggf. so arbeitet. Vielleicht hat ja einer der Experten hier eine Idee.
Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express