Seite 2 von 3

Verfasst: 05.10.2007 11:30
von Scarabol
Du musst den Pointer übergeben:

Code: Alles auswählen

;Originalcode von Kiffi
;modifiziert am 05.10.2007 von Tafkadasom2k5
;Kein Compiler zur Hand, von daher bitte überprüfen ;)

;Flags, die unter Umständen beim GetWindowPlacement herauskommen könnten
#SW_HIDE            = 0
#SW_SHOWNORMAL      = 1
#SW_NORMAL          = 1
#SW_SHOWMINIMIZED   = 2
#SW_SHOWMAXIMIZED   = 3
#SW_MAXIMIZE        = 3
#SW_SHOWNOACTIVATE  = 4
#SW_SHOW            = 5
#SW_MINIMIZE        = 6
#SW_SHOWMINNOACTIVE = 7
#SW_SHOWNA          = 8
#SW_RESTORE         = 9
#SW_SHOWDEFAULT     = 10
#SW_FORCEMINIMIZE   = 11
CompilerIf Defined(SW_MAX, #PB_Constant) = 0
  #SW_MAX             = 11
CompilerEndIf


;Zusätzliche Strukturen, sofern noch nicht definiert
CompilerIf Defined(RECT, #PB_Structure) = 0
  Structure RECT
    left.l
    top.l
    right.l
    bottom.l
  EndStructure
CompilerEndIf

CompilerIf Defined(POINT, #PB_Structure) = 0
  Structure POINT
      x.l
      y.l
  EndStructure
CompilerEndIf

CompilerIf Defined(WINDOWPLACEMENT, #PB_Structure) = 0
  Structure WINDOWPLACEMENT
    length.l
    flags.l
    showCmd.l
    ptMinPosition.point
    ptMaxPosition.point
    rcNormalPosition.rect
  EndStructure
CompilerEndIf

Structure Window
  Childs.l
  Rekursion.l
 
  ;Window
  Handle.l
  Process.l
  Name.s
  Class.s
  WinAttributes.WINDOWPLACEMENT ;Bauen wir noch zusätzlich rein.
EndStructure

#BufferSize = 2048

Global NewList Window.Window()
 
Procedure.s GetClassName(Handle.l)
  Class.s = Space(#BufferSize)
  GetClassName_(Handle, @Class, Len(Class))
  ProcedureReturn Left(Class, Len(Class))
EndProcedure

Procedure.s GetTitle(Handle)
  Name.s = Space(#BufferSize)
  GetWindowText_(Handle, @Name, Len(Name))
  ProcedureReturn Left(Name, Len(Name))
EndProcedure

;Hinzugefügte Prozedur zum Ermitteln, ob Fenster existent. Notfalls mal mt den Flags herumprobieren.
Procedure IsVisibleWindow(*myWindow.Window)
   showCommand.l = *myWindow\WinAttributes\showCmd
   If showCommand <> #SW_HIDE And showCommand =  #SW_SHOWMAXIMIZED Or showCommand =  #SW_MAXIMIZE Or showCommand =  #SW_SHOWMINIMIZED Or showCommand =  #SW_MINIMIZE
      ProcedureReturn #True
   Else
      ProcedureReturn #False
   EndIf
EndProcedure
   
Procedure EnumProc(Handle.l, lParam.l)
  AddElement(Window())
 
  Window()\Handle = Handle
  Window()\Process = 0
  GetWindowThreadProcessId_(Handle, @Window()\Process)
  Window()\Name = GetTitle(Handle)
  Window()\Class = GetClassName(Handle)
 
  ;Windowattribute zusätzlich hinzufügen
  Window()\WinAttributes\length = SizeOf(WINDOWPLACEMENT)
  GetWindowPlacement_(Handle, @Window()\WinAttributes)
 
  If lParam
    *tmp.Window = lParam
    *tmp\Childs + 1
    Window()\Rekursion = *tmp\Rekursion + 1
  Else
    Window()\Rekursion = 0
  EndIf
 
  ; EnumChildWindows_(Handle, @EnumProc(), @Window())
 
  ProcedureReturn #True
 
EndProcedure

Procedure EnumAllWindows()
  Protected TmpL.l
  ClearList(Window())
  TmpL = EnumWindows_(@EnumProc(), 0)
EndProcedure

;-
lCounter.l
EnumAllWindows()

ForEach Window()
 
  If IsVisibleWindow(Window())
    Debug "--------------"
    Debug Window()\Handle
    Debug Window()\Name
    Debug Window()\Class
    Debug "--------------"
  EndIf

Next
[edit]
Wie macht dieses ALT+TAB Fenster das?
Kann man eventuell auch das abfragen?
[/edit]

Gruß
Scarabol

Verfasst: 05.10.2007 11:33
von Kiffi
Tafkadasom2k5 hat geschrieben:Merke gerade, dass sich keine Strukturen an Funktionen übergeben lassen.
#SW_MAX, Structure RECT, Structure POINT und Structure
WINDOWPLACEMENT brauchst Du auch nicht zu definieren ;-)

Grüße ... Kiffi

Verfasst: 05.10.2007 11:35
von gekkonier
Vielleicht kann man auch eine Liste aus dem Taskmanager (Tab Applications) übernehmen???

Verfasst: 05.10.2007 11:44
von Tafkadasom2k5
Mal was Anderes: Funktioniert das überhaupt so? Habt ihr mal mit den flags in der IsVisible-Prozedur rumgespielt?

Verfasst: 05.10.2007 11:51
von Scarabol
Ne funktioniert nicht, wenn man Desktop-anzeigen aus der Shortcutleiste aufruft.... :cry:

Vielleicht solltet ihr euer Augenmerk auf dieses Alt+Tab Fenster lenken, das funzt immer....
Muss jetzt weg, aber vielleicht kann einer mal die API Calls von dem Program herausfinden...

Gruß
Scarabol

Verfasst: 05.10.2007 11:57
von Kiffi
Scarabol hat geschrieben:Ne funktioniert nicht, wenn man Desktop-anzeigen aus der Shortcutleiste aufruft.... :cry:
mit anderen Worten: Funktioniert nicht bei minimierten Fenstern.

Grüße ... Kiffi

Verfasst: 05.10.2007 11:58
von Tafkadasom2k5
Nur bei minimierten nicht? Dann ist das Ziel ja garnicht so fern, wie ich dachte?

Verfasst: 05.10.2007 15:47
von Scarabol
Ne Kiffi, da liegste falsch....

Ich hab in der Schnellstartleiste ein Verknüpfung die da heißt: "Desktop anzeigen"

Wenn man darauf klickt, wird das Desktop Fenster in den Vordergrund geholt, aber es ist was anderes als wenn die Fenster von Hand minimiert werden..., da funktionierts...

Gruß
Scarabol

Verfasst: 05.10.2007 15:59
von Kiffi
Scarabol hat geschrieben:aber es ist was anderes als wenn die Fenster von Hand minimiert werden..., da funktionierts...
... bei mir nicht. Die 'handminimierten' Fenster werden nicht aufgelistet.

(und mein VNCviewer (obwohl nicht minimiert) übrigens auch nicht.)

Grüße ... Kiffi

Verfasst: 05.10.2007 17:09
von Scarabol
Wie heißt das Alt+Tab Fenster?

Gruß
Scarabol