Seite 1 von 1
Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 21.09.2016 05:56
von 3dhubiflieger
Hallo, ich habe da ein Problem wo ich nicht weiter komme.
Ich habe externes Programm, welches mehrere Fenster (Handels hat).
Ich möchte jetzt allerdings, das immer nur ein bestimmtes Fenster den Fokus bekommt, also das Hauptfenster. Welches ist aber das Hauptfenster bei einem externen Programm ? Die Reihenfolge scheint sich auch zu ändern. Je nachdem welches Fenster gerade das andere überdeckt. Da ich anschliessend den Fokus mit setforegroundwindow setze, kommt es immer dazu, dass sich abwechselnd, erst das eine und dann das andere Fenster in den Vordergrund schiebt.
Gibts da hilfreiche Infos ?

Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 21.09.2016 09:38
von RSBasic
Es gibt mehrere Möglichkeiten. Da musst du mal selber ausprobieren, was am besten für dich ist. Bei manchen ist eine kleine Schleife notwendig, um bis zum Hauptfenster zu kommen.
Ich kann dir gerne ein paar Funktionen nennen:
Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 22.09.2016 05:59
von 3dhubiflieger
GetAncestor_(Handle, #GA_ROOT)
Ok, danke , trotzdem weiss ich nicht wie ich einen dieser Befehle richtig anwende. Egal wie ich rumprobiere, es kommt nix dabei raus.
Ist es richtig, dass ich bei Handle irgendein Fenster des externen Programmes angeben kann und die Funktion mir dann das Hauptfenster liefert ? Wie sieht es aus wenn ich das Hauptfenster bei Handle übergebe ? Dann müsste ja das selbe Fenster zurückgegeben werden ?
Aso und warum ändert sich eigentlich die Reihenfolge (Z - Order) unter bestimmten Umständen, obwohl das Programm nicht neu startet ? Wieso bleibt diese nicht gleich ?
Naja..werd mal weiter rumprobieren
Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 22.09.2016 09:14
von RSBasic
Als Beispiel nehme ich mal GetWindowLongPtr_(..., #GWL_HWNDPARENT) und GetWindow_(..., #GW_OWNER):
Code: Alles auswählen
EnableExplicit
If OpenWindow(0, 0, 0, 500, 400, "Window", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
If OpenWindow(1, 0, 0, 400, 300, "SubWindow", #PB_Window_WindowCentered, WindowID(0))
EndIf
Debug WindowID(0)
Debug GetWindowLongPtr_(WindowID(1), #GWL_HWNDPARENT)
Debug GetWindow_(WindowID(1), #GW_OWNER)
Repeat
Select WaitWindowEvent()
Case #PB_Event_CloseWindow
End
EndSelect
ForEver
EndIf
Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 23.09.2016 05:50
von 3dhubiflieger
Danke, in dem Beispiel geht es auch einwandfrei. Allerdings funktioniert das bei dem externen Programm nicht. Ich bekomme bei den Funktionen immer 0 zurück. Bei Getancestor allerdings immer das selbe Handel, wie das übergebene.
Das Programm nennt sich Attractmode (Frontend).
Achso, dass Fenster wovon ich das Haupthandel ermitteln will, ist ein Konsolenfenster.
Das andere Fenster scheint ein Windowed Screen (Hauptfenster) zu sein.
Gibt es da irgendwelche Konstanten, Funktionen, die ein Konsolenfenster eines unbekannten Programmes identifizieren ? Der andere Weg scheint ja nicht zu funktionieren.
Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 23.09.2016 09:28
von RSBasic
Die Anwendung kenne ich nicht.
Möchtest du eigentlich immer auf das Hauptfenster zugreifen? Wenn ja, warum nicht direkt darauf zugreifen?
Versuche mal den Klassennamen des Hauptfensters zu ermitteln:
http://www.rsbasic.de/temp/ShoWin.exe
http://www.rsbasic.de/temp/WinSpy.exe
Wenn du den Klassennamen kennst, kannst du die Handle-Nummer des Hauptfensters mit FindWindow_() auslesen.
Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 23.09.2016 16:34
von 3dhubiflieger
Das mit dem Klassenname war ein Super Tip. Mit ConsoleWindowClass funktioniert es, Danke ! Gibt es eigentlich irgendwo ne Liste über die ganzen Klassen ?
Re: Haupthandel ermitteln wenn mehrere bekannt sind
Verfasst: 23.09.2016 16:44
von RSBasic
Grundsätzlich nein, weil der Klassenname eine optionale Beschreibung ist, die vom Entwickler frei gewählt werden kann. Außer in PB. Dort heißt jedes Fenster immer "WindowClass_#"
Es sei denn, es sind Standard-Controls wie z.B. Buttons, CheckBox, ListIconGadgets u.ä.
Wie die einzelnen Gadgets heißen, findest du hier eine Liste:
https://msdn.microsoft.com/en-us/librar ... s.85).aspx
Ansonsten musst du immer mit einer Anwendung wie ShoWin oder WinSpy den Klassennamen auslesen, um zu wissen, wie du darauf zugreifen kannst.