Autor Beitrag
bockwurst
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 02.12.05 11:23 
Fenster finden

Hallo ich suche nach einem Fenster (genauer dem Handle), den Titel kenne ich nicht, nur die Klasse. Leider geht nicht FindWindow. Dazu möchte ich NICHT EnumWindows benutzen. Gibt es eine andere Möglichkeit.

Vielen Dank
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.12.05 13:04 
user profile iconbockwurst hat folgendes geschrieben:
Dazu möchte ich NICHT EnumWindows benutzen.

Und warum bitte sehr nicht? Das ist die einzig sinnvolle Lösung.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 02.12.05 14:08 
EnumWindow ist eine CallBackFunktion. Ich selbst muß auf eine Nachricht antworten. Ich suche nach den Windows einträgen (inode-Listen). Wieso soll ich mir jedesmal eine Funktion für jedes Fenster anspringen lassen. Bei 1000 fenster wären das dann 1000 Funtionsaufrufe. Deshalb
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.12.05 14:57 
1000 Funktionsaufrufe sind heutzutage gar nichts. Und eine andrer sicher Möglichkeit die top-level Fenster zu enumerieren gibt es nicht. Und warum geht FindWindows nun auch nicht? Dort kannst du auch die Klasse angeben von dem fenster, dass du suchst.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 02.12.05 15:11 
Findwindow(TKlasse, nil) geht wohl nur bei Applications / das Programmfenster. Bei ganz normalen Fenster geht es nicht (bei mir jedenfalls). Obwohl in der Beschreibung etwas anderes steht.

Vielleicht kannst du mir helfen. Die Fenster ändern sich immer. Also muß ich zur Laufzeit mein Fenster/Handle suchen. Es ist soagr noch einfacher. Es gibt nur ein Fenster mit der Klasse mit unbekanntem Titel.

Ich brauche soetwas
ausblenden Delphi-Quelltext
1:
  MyHandle := FindWindowHandleOhneTitel('TKlassenName');					
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.12.05 15:24 
user profile iconbockwurst hat folgendes geschrieben:
Findwindow(TKlasse, nil) geht wohl nur bei Applications / das Programmfenster.

alle Fenster unter Windows haben einen Klassennamen, das bedingt schon der Aufbau des Fenstersystems unter Windows.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 02.12.05 15:28 
nehmen wir mal an, mein Fenster vom Formular heißt TForm. Den Titel kenne ich nicht.
Wüßte ich den Titel würde ich mein Fensterhandle mit

ausblenden Delphi-Quelltext
1:
  FindWindow('TForm','Titelcaption');					

finden können.

Wenn ich nun aber
ausblenden Delphi-Quelltext
1:
  FindWindow('TForm',nil);					

eingebe, bekomme ich immer 0 zurück, auch wenn das Fenster da ist.
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: Fr 02.12.05 15:33 
Ich verwende EnumWindows, um Fenster (z.B. vom IE) zu finden, deren Klasse bekannt, aber deren Titel sich ständig ändert. Das war für einen 'Popup-Blocker'. Klappt gut. Das scannen meiner Fensterliste dauert -weiss nich- 1 ms? Hab dich nich so :mrgreen: , oder arbeitest Du noch mit 286?

_________________
Na denn, dann. Bis dann, denn.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.12.05 15:35 
Klappt wie vorhergesehen:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
procedure TForm1.Button1Click(Sender: TObject);
begin
  ShowMessage(IntToStr(FindWindow('TForm1',nil)));
end;
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 02.12.05 15:36 
Bei mir nicht! Bei mir handelt sich es um zwei verschiedene Programme. Bei dir auch sicherlich. Ich benutzte Win98 und Delphi5.

Vielleicht, aber warum geht FindWindow nicht. Dann würde mein 286 deinen 986 doch schlagen, oder?!
In der Hilfe sthet folgendes:

The FindWindow function retrieves the handle to the top-level window whose class name and window name match the specified strings. This function does not search child windows.

HWND FindWindow(

LPCTSTR lpClassName, // pointer to class name
LPCTSTR lpWindowName // pointer to window name
);


Parameters

lpClassName

Points to a null-terminated string that specifies the class name or is an atom that identifies the class-name string. If this parameter is an atom, it must be a global atom created by a previous call to the GlobalAddAtom function. The atom, a 16-bit value, must be placed in the low-order word of lpClassName; the high-order word must be zero.

lpWindowName

Points to a null-terminated string that specifies the window name (the window's title). If this parameter is NULL, all window names match.



Return Values

If the function succeeds, the return value is the handle to the window that has the specified class name and window name.
If the function fails, the return value is NULL. To get extended error information, call GetLastError.
Luckie
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Fr 02.12.05 15:42 
user profile iconbockwurst hat folgendes geschrieben:
This function does not search child windows.

Ist es vielleicht das? Wenn du das Handle eines Kindfensters brauchst musst du Suche im MSDN FINDWINDOWEX benutzen.
bockwurst Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 191

win98 /XP
D1 D5 Prof DE2005PE
BeitragVerfasst: Fr 02.12.05 15:54 
Nein,es ist schon ein Hauptfenster, aber ich habe "meinen Fehler" gefunden.
Mein Hauptprogramm ist noch ein 16bit Programm (delphi 1). Da geht es leider nicht. Dann muß ich wohl enumWindows benutzen. Mal schauen ob, dies klappt! Oder gibt es noch etwas besseres?