none
Subfenster/Unterfenster eines Fremdprogramms finden! RRS feed

  • 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

     

    Mittwoch, 1. Dezember 2010 10:09

Alle Antworten

  • Hallo Christoph,

    den Code hier habe ich mal irgendwo gefunden und etwas damit rumgespielt. Der könnte dich weiterbringen:

    Public 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
    
    
    
    Ich habe den gerade noch mal getestet und diverse Fenster eines Programmes (auch Dialoge etc.) ausprobiert. ...klappt
    Liebe Grüße Stefan | Cheers Stefan I'm using VB 2008 Express
    Montag, 6. Dezember 2010 17:15
  • 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

    Dienstag, 7. Dezember 2010 13:48
  • 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
    Donnerstag, 9. Dezember 2010 13:27