Autor Beitrag
LonghornUser
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: Sa 28.03.09 21:50 
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:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
List1.Clear;
List2.Clear;
EnumWindows(@EnumWinProc, 0); // Alle momentan verfügbaren "Fenster" werden in List1 geladen

for t := 0 to ListBox1.Count-1 do begin // enthält Liste der Schlagwörter
  for q := 0 to List1.Count-1 do
    if AnsiContainsText(List1[q],Form9.ListBox1.Items[t]) then
       List2.Add(List1[q]); // Es werden alle Fenster, die eines der Schlagwörter enthalten in List2 getan

    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
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 2157
Erhaltene Danke: 72


Java (Eclipse), Python (Sublimetext 3)
BeitragVerfasst: Sa 28.03.09 22:06 
user profile iconLonghornUser hat folgendes geschrieben Zum zitierten Posting springen:

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.

user profile iconLonghornUser hat folgendes geschrieben Zum zitierten Posting springen:
Habt ihr eine Idee, wie ich das Problem lösen könnte ?

Eine For-Schleife, die alle durchgeht?
LonghornUser Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 796



BeitragVerfasst: 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 user profile iconNarses: 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:
ausblenden 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;

// Aufruf
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 ?