Seite 1 von 1
Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 11:40
von Thomas
Hallo,
ich möchte dauerhaft von einem Fenster (Fremdes Programm) den WindowTitle abfragen.
Der erste Teil des "Title"'s ist mir bekannt und daran kann ich's erkennen.
Dafür hab ich auch ein paar coole Code-Schnipsel im Forum hier gefunden z.B.:
Code: Alles auswählen
Procedure EnumWindows(hwnd,lParam)
Protected Title.s{128}
SendMessage_(hwnd,#WM_GETTEXT,128,@Title) ; <--
If Len(Title)
Debug Title
;Debug hwnd
EndIf
ProcedureReturn #True
EndProcedure
EnumWindows_(@EnumWindows(),0)
End
Mit
fange ich mir mein Fenster heraus.
- Aber wie lasse ich das Ganze in Dauerschleife (evtl. im Hintergrund) laufen ohne dass die CPU-Last in die Höhe schießt?
- Wäre es einfacher über den "*.exe"-Namen das Fenster bewusst abzufragen und nicht alle nach einem Schlüsselwort zu durchsuchen?
ich steh mal wieder voll am Schlauch ...
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 11:45
von RSBasic
Oh der Thomas ist auch mal wieder da, nach 6 Jahren. Wo warst du denn die ganze Zeit? Willkommen zurück.
Was genau möchtest du denn machen? Warum ist es notwendig, in einer Schleife stets nach einem Fenster mit Hilfe eines Titels zu suchen? Reicht da nicht einmal oder was ist das für ein Fenster? Ist es dein Fenster oder ein fremdes Fenster?
Mit Hilfe des Prozessnamens deiner Executable-Datei bekommst du erstmal nur die PID-Nummer, aber nicht die Handle-Nummer des Fensters. Das Herausfinden der Fenster-Handle-Nummer eines Prozesses mit Hilfe der PID-Nummer ist zwar auch möglich, aber aufwendiger.
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 11:49
von NicTheQuick
Du musst ja nur einmal EnumWindows_() nutzen. Wenn du das WindowHandle hwnd dann einmal gefunden hast, musst du es ja nicht wieder finden. hwnd ändert sich nicht wieder, solange das Fenster offen bleibt. Und dann kannst du regelmäßig den Namen des Fensters darüber abfragen.
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 12:02
von Thomas
@RSBasic
Dir entgeht auch nix
Schon 6 Jahre - omg - Der Job hatte mich fest in seinen Fängen

- aber für hier und da mal ein kleines Script war PB immer dabei
Ich habe eine Fotobox-Software, die für mich als einzige Schnittstelle den Fenstertitel (der immer schön den Status enthält) hat. Den möchte ich nutzen um meine Hardware (LEDs, ...) anzusteuern.
In der Szene ist Autohotkey sehr verbreitet, aber wenn du PB, C, PHP, ... gewohnt bist bekommst bei dem Syntax nen Anfall
Unterm strich geht's darum den Fenstertitel permanent abzugreifen und auf Veränderungen zu reagieren, diese dann über den COM-Port (USB) Daten rauszuschicken. Letzeres funktioniert soweit schon.
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 12:05
von RSBasic
Ist die Fotobox-Software die ganze Zeit offen? Wenn ja, dann musst du, wie NicTheQuick bereits schrieb, nur einmal die Handle-Nummer dieses Fensters ermitteln und dann kannst du in deiner Eventschleife oder in einem separaten Thread den Fenstertitel auslesen. Im Thread kannst du in der Schleife ein Delay(500) oder Delay(1000) setzen. Dann verbraucht es keine CPU-Last.
Thomas' Signatur hat geschrieben:v5.11
Es gibt inzwischen 5.62 bzw. 5.70, falls du noch nicht geupdatet hast.
Und deine Website existiert auch schon lange nicht mehr.
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 12:35
von Thomas
Ja, "normal" ist die Software andauernd geöffnet, aber in irgendeiner Form abzufragen obs den Handle noch gibt, ist mit Sicherheit kein Schaden (um dann gegebenfalls den Handle neu ermitteln zu können)
Ja, an das Delay habe ich auch schon gedacht, obwohl ich da eher unter Delay(100) bleiben sollte.
Muss ich mal antesten. Könnte aber interessant werden Threads hab ich bisher immer gemieden
Windows-API war ja für mich damals schon ein spanisches Dorf:
Wie muss ich diese Codezeile verstehen, warum wird die Funktion öfter aufgerufen und keine Parameter übergeben?
Ja, die Website ist schon draußen, wenn ich meinen Zugang noch finde, update ich mal
@RSBasic, @NicTheQuick, echt cool, dass ihr alle noch hier seid, gibt's @Stargate auch noch?

Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 13:22
von RSBasic
Thomas hat geschrieben:Ja, "normal" ist die Software andauernd geöffnet, aber in irgendeiner Form abzufragen obs den Handle noch gibt
Dafür gibt es IsWindow_(), um zu prüfen, ob die Handle-Nummer des Fensters noch gültig ist. Du bekommst 1 zurück, wenn das Fenster noch existiert, ansonsten 0.
Thomas hat geschrieben:warum wird die Funktion öfter aufgerufen und keine Parameter übergeben?
Es ist, wie der Funktionsname lautet, eine Enumerationsfunktion. D.h. die Funkton wird von Windows selbst so lange aufgerufen, bis alle Vorgänge abgeschlossen wurden. In dem Fall alle Fenster, die gefunden wurden. Du kannst aber mit ProcedureReturn #False den Vorgang abbrechen, nachdem dein Fenster gefunden wurde.
Ansonsten gibt es FindWindow_() für ein direktes Finden.
Thomas hat geschrieben:gibt's @Stargate auch noch?

Ja, den gibt es auch noch und ist noch aktiv.
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 12.06.2018 14:52
von Thomas
sooo, vielen Dank euch Beiden, ich bin zu meinem Ergebnis gekommen.
Damit auch noch andere davon profitieren können:
Code: Alles auswählen
Global window_title$ = ""
Global window_hWnd = 0
Global window$ = "Fenster das den Titel ändert"
Procedure EnumWindows(hWnd,Visibility=#True) ;Prozedur, die die Handles der Fenster erhält
Static title.s{1024},class.s{1024},PID.l=0
GetWindowText_(hWnd,@title,1024) ;Fenstertitel auslesen
GetClassName_(hWnd,@class,1024) ;Fensterklasse auslesen
GetWindowThreadProcessId_(hWnd,@PID) ;PID des zugehörigen Prozesses auslesen
If FindString(title, window$)
Debug "[Title]= "+title+" [hWnd]= "+Str(hWnd)+" [ClassName]= "+class+" [PID]= "+Str(PID) ;Werte ausgeben
window_title$ = title
window_hWnd = hWnd
ProcedureReturn #False
EndIf
ProcedureReturn #True
EndProcedure
Procedure GetNewTitle(Parameter)
Static title.s{1024}
Repeat
If IsWindow_(window_hWnd)
GetWindowText_(window_hWnd,@title,1024)
If Not window_title$ = title
window_title$ = title
Debug "Titel: "+window_title$
EndIf
Else
Debug "Programm scheinbar geschlossen"
EnumWindows_(@EnumWindows(),#True)
Delay(1000)
EndIf
Delay(100)
ForEver
EndProcedure
If OpenWindow(0, 100, 200, 850, 200, "Fenster", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget)
EnumWindows_(@EnumWindows(),#True)
CreateThread(@GetNewTitle(), 0)
Repeat
Event = WaitWindowEvent()
If Event = #PB_Event_Gadget
Select EventGadget()
Case 0
EndSelect
EndIf
Until Event = #PB_Event_CloseWindow
EndIf
End
Re: Fenster-Titel dauerhaft abfragen ohne Mega-CPU-Last
Verfasst: 13.06.2018 00:18
von TheCube
Danke für den Codeschnipsel ... wird in meiner Sammlung sicher irgendwo mal nützlich sein.
Je nachdem leg ich es dann nicht-casesenitiv aus, also findet Fenster "CalcPi" und "calcpi" etc. ...
P.S: Auch herunter auf Delay(1) (von Delay(100)) hat man noch keine merkliche CPU-Last, selbst auf einem alten Atom-PC.
Trotzdem natürlich besser nur so oft abzufragen wie nötig.