Entwickler-Ecke
Windows API - Problem beim Verstecken und Wiedereinlenden von Fenstern
LonghornUser - Sa 28.03.09 21:50
Titel: Problem beim Verstecken und Wiedereinlenden von Fenstern
Hallo,
ich habe folgendes Problem.
Ich möchte mit meinem Programm einige Fenster ausblenden. Dies mache ich über deren Titel bzw. Schlagwörter, die in den Titeln der momentan vorhandenen Fenster vorkommen müssen.
Ein und Ausblenden funktionieren so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| List1.Clear; List2.Clear; EnumWindows(@EnumWinProc, 0); for t := 0 to ListBox1.Count-1 do begin for q := 0 to List1.Count-1 do if AnsiContainsText(List1[q],Form9.ListBox1.Items[t]) then List2.Add(List1[q]); if Hide then for q := 0 to List2.Count-1 do ShowWindow(FindWindow(nil, PChar(List2[q])), SW_HIDE); if Show then for q := 0 to List2.Count-1 do ShowWindow(FindWindow(nil, PChar(List2[q])), SW_SHOW); |
Wenn ich nun 1 Fenster (*eines*) habe, dann klappt das auch. Habe ich aber 2 Fenster gleichen Namens, dann klappt das ganze nicht. Angenommen man setzt das Schlagwort "Editor" und hat 2 Fenster, die "Unbenannt - Editor" heißen, dann versteckt er nur 1 Fenster und das andere bleibt offen.
Es liegt sicherlich daran, dass eine Zuordnung über den Titel nicht eindeutig ist. Man bräuchte die ID der Fenster.
Auch ist mir aufgefallen, dass über EnumWindows auch Fenster gelistet werden, die garkeinen Eintrag in der Taskbar haben. Das sind ja dann weniger Fenster als eher Prozesse ??
Habt ihr eine Idee, wie ich das Problem lösen könnte ?
Ciao LHUser
Regan - Sa 28.03.09 22:06
LonghornUser hat folgendes geschrieben : |
Auch ist mir aufgefallen, dass über EnumWindows auch Fenster gelistet werden, die garkeinen Eintrag in der Taskbar haben. Das sind ja dann weniger Fenster als eher Prozesse ?? |
NAja, das sind dann schon noch Fenster, bloß eben ohne Taskbareintrag. Du könntest mit
IsWindowVisible prüfen, ob das Fenster auch wirklich in der Taskleiste ist.
LonghornUser hat folgendes geschrieben : |
Habt ihr eine Idee, wie ich das Problem lösen könnte ? |
Eine For-Schleife, die alle durchgeht?
LonghornUser - Sa 28.03.09 22:17
Ja, aber das macht doch keinen Sinn, wenn ich 2 Fenster habe, die den gleichen Titel habe ?
Bräuchte man da nicht irgendwie den Handle des Fensters ?
---
Moderiert von
Narses: Beiträge zusammengefasst---
Ich glaube, ich habs doch selber hinbekommen. Ich habe die Zuordnung über Handles gemacht und die liefert mir die Funktion EnumWinProc. Nur versteh ich die Funktionsweise dieser Funktion nicht so richtig. Sie funktioniert allem Anschein nach wie eine Schleife, aber sie hat eigentlich nur sequentiellen Charakter:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function EnumWinProc(Wnd: THandle; LParam: LongInt): Bool; stdcall; var WinCaption : string; Len: integer; begin Len := GetWindowTextLength(Wnd); SetLength(WinCaption, Len); GetWindowText(Wnd, PChar(WinCaption), Len+1); showmessage('Test'); if Trim(WinCaption) <> '' then List1.Add(WinCaption); Result := True; end;
EnumWindows(@EnumWinProc, 0); |
Wenn man die Funktion aufruft, bekommt man eine Test-showmessage nach der anderen, sprich, die Funktion arbeitet als Schleife. Nur warum ?
Kann es sein, dass das was mit dem @-Operator zu tun hat ?
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!