Haupthandel ermitteln wenn mehrere bekannt sind

Für allgemeine Fragen zur Programmierung mit PureBasic.
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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 ? :roll:
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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:

Code: Alles auswählen

GetAncestor_(Handle, #GA_ROOT)

Code: Alles auswählen

GetWindowLongPtr_(Handle, #GWL_HWNDPARENT)

Code: Alles auswählen

GetParent_(Handle)

Code: Alles auswählen

GetWindow_(Handle, #GW_OWNER)
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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.
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
3dhubiflieger
Beiträge: 123
Registriert: 27.10.2013 12:13

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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 ?
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Haupthandel ermitteln wenn mehrere bekannt sind

Beitrag 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.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Antworten