Liste "echter" Fenster

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
gekkonier
Beiträge: 314
Registriert: 20.04.2007 09:06
Wohnort: Wien

Beitrag von gekkonier »

Vielleicht kann man auch eine Liste aus dem Taskmanager (Tab Applications) übernehmen???
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Mal was Anderes: Funktioniert das überhaupt so? Habt ihr mal mit den flags in der IsVisible-Prozedur rumgespielt?
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
Tafkadasom2k5
Beiträge: 1578
Registriert: 13.08.2005 14:31
Kontaktdaten:

Beitrag von Tafkadasom2k5 »

Nur bei minimierten nicht? Dann ist das Ziel ja garnicht so fern, wie ich dachte?
OpenNetworkConnection() hat geschrieben:Versucht eine Verbindung mit dem angegebenen Server aufzubauen. 'ServerName$' kann eine IP-Adresse oder ein voller Name sein (z.B.: "127.0.0.1" oder "ftp.home.net").
php-freak hat geschrieben:Ich hab die IP von google auch ned rausgefunden!
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag 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
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Benutzeravatar
Kiffi
Beiträge: 10711
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Benutzeravatar
Scarabol
Beiträge: 1427
Registriert: 30.11.2005 21:00

Beitrag von Scarabol »

Wie heißt das Alt+Tab Fenster?

Gruß
Scarabol
Abgeschlossen Projekte:
Schreibmaschine, Bildschirmlupe, Wings3DtoOgreMeshConverter
Watch: PureArea

PB-V: 4
WinXP
Antworten