Gibt es sowas wie eine Child-Eigenschaft eines handle ?



  • Hallo,

    gibt es eine Möglichkeit, bei einem unter Windows geöffneten Fenster zu erkennen, dass es sich bei diesem Fenster um ein "Unterfenster" bzw. einen Dialog einer Hauptanwendung handelt?

    Zur Verdeutlichung meiner Frage bzw. meines Problemes:

    Ich habe eine Software zur Steuerung von Drittanbietersoftware geschrieben.
    Meiner Software kann man Bearbeitungsroutinen und eine Argumentliste geben.
    Mit dieser Bearbeitungsroutine (z.B.: drücke die Taste ESC, gebe ein "Erfassung", drücke ENTER, gebe ein Argument1, drücke TAB, gebe ein Argument2, etc ...) wird dann die bezeichnete Drittanbietersoftware so lange gefüttert, bis die Argumentliste komplett abgearbeitet ist.

    Mögliches Anwendungsszenario:
    Kunde schickt eine Auftragsliste mit 5.000 Aufträgen im Excelformat, die alle in das eigene System eingegeben werden müssen. Das eigene System unterstützt aber keinen Import, es muss also alles händisch eingegeben werden.
    Diese Aufgabe übernimmt dann meine Anwendung.
    Die Eingaben laufen alle über SendInput, meine eigene Anwendung läuft im Hintergrund.

    Die Software ist schon mehrfach sehr erfolgreich in einem deutschen Großunternehmen gelaufen und hat damit vielen Mitarbeitern viele Stunden stupide Erfassungsarbeit erspart. Dennoch möchte ich sie gerne noch ein wenig weiterentwickeln, man ist ja anspruchsvoll ... 😃

    Da während so einer Erfassungsroutine schon so einiges passieren kann, was mein zu fütterndes Zielfenster stören kann (Popups, Programmstart über Taskplaner, Dienste, etc.), wird vor jedem einzelnen Tastendruck geprüft, ob das Zielfenster noch im Vordergrund ist, falls nicht, wird es wieder in den Vordergrund geholt, bevor die nächste SendInput-Anweisung folgt.

    if( (hWnd != GetForegroundWindow()) && (stop == false))
    {
       // prüfen, welches Fenster im Vordergrund ist
       // falls meine Anwendung -> Nachfrage, ob gestoppt werden soll
       // falls anderes Fenster -> Zielfenster in den Vordergrund holen
    }
    

    hWnd = Handle des Zielfenster

    if( (hWnd == GetForegroundWindow()) && (stop == false) )
    {
       // SendInput  ...
    }
    

    Das klappt alles wunderbar und entspricht voll und ganz meinen Vorstellungen.
    ABER:
    Es lassen sich natürlich auch Tastaturkombinationen vorgeben, wie z.B. Strg + S.
    Damit öffnet sich dann der Dialog "Speichern unter ..."

    Und das war es dann mit meiner Erfassung.
    Meine Anwendung ist nicht im Vordergrund, also würde theoretisch weiter erfasst.
    Die Zielanwendung ist aber auch nicht mehr im Vordergrund, läßt sich aber auch nicht in den Vordergrund holen, weil der "Speichern unter ..." Dialog nicht in den Hintergrund verschoben werden kann.

    Ich würde daher gerne während meiner Erfassung prüfen, ob es sich beim dem Fenster, dass sich gerade im Vordergrund befindet, um ein Dialogfenster oder Unterfenster der Zielanwendung handelt.
    Falls ja, würde ich dann in diesen Unterdialog weiter erfassen.

    Das hätte den charmanten Vorteil, dass meine Anwendung das Erfassungsergebnis
    in der Zielanwendung abspeichern könnte, indem es mit Strg + S den Speichern-Dialog aufruft, einen Dateinamen eingibt und ENTER drückt.

    Und daraus resultiert für mich natürlich jetzt die Frage, kann ich am Handle (oder sonst irgendwo dran) erkennen, dass es sich bei dem Fenster im Vordergrund um ein Dialogfenster oder Unterfenster der Hauptanwendung (Zielanwendung) handelt?

    Danke für Eure Ideen und Vorschläge.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL (C++ Builder) in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • GetParent / GetAncestor



  • Wenn dur nur das Fensterhandle hast kannst du mit EnumChildWindows über die Kindfenster iterieren.



  • Sorry, für das falsche Einstellen und

    vielen lieben Dank für die schnelle Hilfe.


Anmelden zum Antworten