EnumWindows?

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

Der Eisvogel

Betreff: EnumWindows?

BeitragMo, Mai 04, 2009 17:25
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo
Wie kann ich die Funktion EnumWindows in BB nutzen? (Code?)
Kann ich sie überhaupt benutzen? Mein Problem liegt beim ersten Parameter der ein Funktion erwartet, ich weiß nicht wie ich die übergeben soll.

Gibt es eine andere Möglichkeit alle Fenster aufzulisten?

MfG
Der Eisvogel
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.
 

ChristianK

BeitragMo, Mai 04, 2009 17:36
Antworten mit Zitat
Benutzer-Profile anzeigen
Funktionen kannst du nicht als Parameter benutzen, weil es in BB keine Funktionszeiger gibt.
Musst du wohl mit einer anderen Sprache machen oder FindWindow benutzen, wenn dir die Fensterklasse bekannt ist.
AdvanceLcd
Intel Core 2 Duo 3.2 GHz, 4 GB RAM, GeForce 8800 GTX | MacBook Pro 15,4″ Intel Core 2 Duo 2.4 GHz, 2 GB RAM, GeForce 8600M GT

Chester

BeitragMo, Mai 04, 2009 17:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit GetWindow kann man auch das Handle des nächsten Fenster herausbekommen. Das kann man dann natürlich solange wiederholen, bis sich ein Handle wiederholt. Wäre wahrscheinlich einfacher als sich ne Dll für EnumWindows zu schreiben.

Der Eisvogel

BeitragMo, Mai 04, 2009 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
So OK. Ich hab das mit dem GetWindow mal ausprobiert, aber das geht nicht, den gleich das erste Handle, das ich mit GetWindow hole existiert nicht. ;(
Code: [AUSKLAPPEN]
hWnd=GetDesktopWindow()
DebugLog hWnd
hWnd=GetWindow(hWnd,GW_HWNDFIRST)
DebugLog hWnd

While hWnd<>0
   title_length=GetWindowTextLength(hWnd)+1 ;Fenstertitellänge ermitteln
   title_buffer=CreateBank(title_length) ;Bank für den Fenstertitel erstellen
   GetwindowText(hWnd,title_buffer,title_length) ;Fenstertitel ermitteln
   title=PeekString(title_buffer,0) ;Fenstertitel speichern
   FreeBank title_buffer ;Bank für den Fenstertitel löschen
   
   DebugLog title
   
   hWnd=GetWindow(hWnd,GW_HWNDNEXT)
Wend

Entweder bin ich zu blöd oder das geht nicht.
Ich brauch diese Funktion auf jeden Fall sehr dringend, wenn also nix anderes mehr möglich ist muss ich auf ne extra Dll zurückgreifen Sad
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Chester

BeitragMo, Mai 04, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Hier ein kurzes Beispiel, das allerdings alles - und ich meine wirklich alles - auflistet:

Code: [AUSKLAPPEN]

;------------------------------------------
;----- user32.decls -------------------
;GetWindow% (p1%,p2%) : "GetWindow"
;GetWindowText%(hwnd%,string*,max%):"GetWindowTextA"
;GetActiveWindow% () : "GetActiveWindow"
;------------------------------------------

Const GW_HWNDFIRST = 0
Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Const GW_HWNDPREV = 3
Const GW_OWNER = 4
Const GW_Child = 5

EnumWindows()
WaitKey()
End

Function EnumWindows()
   Local hwnd_first = GetWindow(GetActiveWindow(),GW_HWNDFIRST)
   Local hwnd_temp = hwnd_first

   Repeat
      ; Nächstes Fenster
      hwnd_temp = GetWindow(hwnd_temp,GW_HWNDNEXT)
      
      ;Name Herausfinden
      bank_temp = CreateBank(255)
      sdf=GetWindowText(hwnd_temp,bank_temp,255)
      
      Local pos%=0,name$=""
      
      Repeat
         byte=PeekByte(bank_temp,pos)
         pos=pos+1
         If byte=0 Then Exit
         name$=name$+Chr(byte)
      Forever

      If name$ <> "" Then Print hwnd_temp + ": "+name$
      FreeBank bank_temp
   Until hwnd_temp =0
      
End Function

Der Eisvogel

BeitragMo, Mai 04, 2009 23:03
Antworten mit Zitat
Benutzer-Profile anzeigen
So das funktioniert jetzt.
Wie kann ich jetzt überprüfen ob das Fenster, deren Handle ich habe, nach 5 Minuten noch nicht geschlossen wurde? 5 Minuten warten versteht sich. Das Handle verfällt ja nie. Aber ob das Handle noch auf einen Ordner oder ein anderes Fenster zeigt ist nicht klar. Ich dachte ich kann das mit SendMessage machen, indem ich einen Nachricht schicke, die eine Antwort zurück schickt, aber irgenwie klappt das nicht, oder ich verwende die flaschen Nachrichten.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Chester

BeitragSa, Mai 09, 2009 19:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich versteh zwar irgendwie immer noch nicht, auf was du hinaus willst, aber du kannst, um herauszufinden, ob ein Fenster geschlossen wurde, ein wenig tricksen in dem du abfragst, ob das Fenster noch einen Device Kontext besitzt.

Da ich ja so lieb bin, hier wieder ein Beispielcode:
Code: [AUSKLAPPEN]

;------------------------------------------
;--------- user32.decls -------------------
;GetWindow% (p1%,p2%) : "GetWindow"
;GetWindowText%(hwnd%,string*,max%):"GetWindowTextA"
;GetActiveWindow% () : "GetActiveWindow"
;GetWindowDC%(hwnd%):"GetWindowDC"
;------------------------------------------


; Systemordner öffnen
ExecFile(SystemProperty("SYSTEMDIR"))

Graphics 800,600,32,2:SetBuffer BackBuffer()

; Handle & Name
Global DIR_Handle%,DIR_Name$

;Aufgrund der Verzögerung des Öffnens
;solange abfragen, bis das Handle existiert
Repeat
   GetDirHandle()
Until DIR_Handle<>0


Repeat
   
   Text 0,45,"Fenster geöffnet: "+WindowExists(DIR_Handle)
   Text 0,30,"Fenster Name: "+DIR_Name$
   Text 0,15,"Fenster Handle: "+DIR_Handle
   
   Flip : Cls
Until KeyHit(1)

Function WindowExists%(hwnd%)
   Return GetWindowDC(hwnd%)<>0
End Function

; EnumWindows ein wenig modifiziert
Function GetDirHandle()
   Local hwnd_temp =  GetWindow(GetActiveWindow(),GW_HWNDFIRST)
   Repeat
      hwnd_temp = GetWindow(hwnd_temp,GW_HWNDNEXT)
      bank_temp = CreateBank(255)
      sdf=GetWindowText(hwnd_temp,bank_temp,255)
      Local pos%=0,name$=""
      Repeat
         byte=PeekByte(bank_temp,pos)
         pos=pos+1
         If byte=0 Then Exit
         name$=name$+Chr(byte)
      Forever
      FreeBank bank_temp
      If Instr(name$,"system32")>0 Then
         DIR_Handle=hwnd_temp
         DIR_Name$ = name$
         Exit
      EndIf
   Until hwnd_temp=0
End Function

Const GW_HWNDFIRST = 0
Const GW_HWNDLAST = 1
Const GW_HWNDNEXT = 2
Const GW_HWNDPREV = 3
Const GW_OWNER = 4
Const GW_CHILD = 5

Der Eisvogel

BeitragSa, Mai 09, 2009 20:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich habe das ganze jetzt darüber gelöst, indem ich die Liste der Fenster nach einer Handle-Übereinstimmung gesucht habe und wenn es nicht mehr gefunden wurde, dann ist das Fenser geschlossen.
Gebrahct habe ich das für meinen Window-Crasher. Siehe Showcase.
Ungarische Notation kann nützlich sein.
BlitzMax ; Blitz3D
Win 7 Pro 64 Bit ; Intel Core i7-860 ; 8 GB Ram ; ATI HD 5750 1 GB
Projekte: Window-Crasher
Ich liebe es mit der WinAPI zu spielen.

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group