Sichtbarkeit eines fremden MDIClient Formulars

Hallo zusammen

Ich möchte gerne prüfen, ob ein MDIClient Formular eines fremden Prozesses zur Zeit angezeigt wird oder nicht.

Ich habe das Zugriffshandle des MDI-Formulars und hab’s mit den API Funktionen IsWindowVisible und IsWindowEnabled versucht doch leider geben diese beiden Funktionen immer 1 (ergo TRUE) zurück, auch wenn das betreffende MDI-Fenster geschlossen ist.

Seltsam auch, dass die API Funktionen getWindowText und auch SendMessage+WM_GETTEXT jeweils einen Nullstring zutage fördern anstatt den erwarteten Fenstertitel. Und dies bei geöffnetem und geschlossenem Zustand des MDI-Fenster.

Gibt es eine andere Möglichkeit die Sichtbarkeit eines MDIClients zu prüfen?

Besten Dank für eure Ideen.
Gruss
Patrick

Hallo Patrick,

also die API liefert schon den richtigen Wert :smile:
Woher beziehst du denn das Handle?
Poste mal bitte ein wenig Code, vorallem wie du an das Handle kommst, nur so koennen wir dir weiterhelfen. Anders nicht.
Das ist das selbe als wenn du fragst. Mein Auto faehrt nicht aber benzin habe ich rein gemacht :s

MfG Alex

Hallo Alex

Nun ja, den Originalcode kann ich nicht grad posten (der ist ziemlich verstreut), aber ich mache es folgendermassen:

  1. Als erstes starte ich ein fremdes Programm mit shell und halte die
    zurückgelieferte Task-ID fest

  2. Durchsuche mit FindWindow/GetWindow alle Fenster:
    das Handle des ersten ‚Haupt‘-Fensters das zum
    gestarteten Task gehört
    (geprüft durch GetWindowThreadProcessId und GetParent 0)
    wird gepflückt, die Schleife abgebrochen.
    [Ob das richtige Fenster gepflückt wurde habe ich bereits geprüft
    in dem ich mir die Caption mit GetWindowText anzeigen lasse -
    soweit positiv]

  3. Dann verwende ich EnumChildWindows um alle Fenster innerhalb
    des Hauptfensters zu enumerieren. In der Callback-Funktion erhalte
    ich jeweils das Fensterhandle des Enumerierten Controls/Windows.
    Wenn das Enumerierte Control/Window von der Klasse „MDIClient“ ist,
    wird über das Control/Window-Handle IsWindowVisible und
    IsWindowEnabled abgeführt. Es wird zwar während der Enumerierung
    ein Control/Window gefunden das von der Klasse „MDIClient“ ist,
    IsWindowEnabled und IsWindowVisible liefern aber jeweils immer 1,
    auch wenn das betreffende MDI-Formular sich im geschlossenen
    oder verstecktem Zustand* befindet.

* Für die ganzen Tests habe ich mir einen Teststumpf-Programm ebenfalls mit VB geschrieben: Ein MDIFormular mit einem MDIChildformular - ein paar Buttons wie MDIChild entladen (unload), laden (load), anzeigen (show), verstecken (hide).

Während ich ich hier schreibe ist mir gerade so eine Vermutung duch den Kopf gegangen: ist die API IsWindowVisible vielleicht nur für die „Hauptformulare“ (sprich letzter Parent) gedacht?

Auch GetWindowText und SendMessage+WM_GETTEXT haben die Formcaption nicht ermitteln können (sie können’s zwar vom Hauptfenster des Teststumpfs, aber nicht vom MDIClient).

Brachte das ein wenig Licht ins dunkel?

Wenn nein … mache ich eine kleine Testroutine (wird aber wahrscheinlich erst im Verlauf der Woche irgendwann dazukommen)

Freu mich auf die Antwort (so oder so :smile:

Besten Dank schon mal
Gruss
Patrick

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo Patrick,

also wenn ich mich recht erinnere, so hast du den Fehler bereits gefunden! Die API liefert dir nur die Werte des HauptFormulares und nicht der Child Clienten :frowning:

Wie das Funktionieren soll, weiss ich adhock auch nicht. Dazu muesste ich auch erst testen und probieren. Wenn du es nicht hinbekommst, so gebe nochmal bescheid und ich setze mich dann die Tage mal an die Sache.

Aber vom Prinzip her waere das ja das selbe, als wenn du versuchst abzufragen ob eine MessageBox in einem fremden Progg auf ist und das geht meines erachtens auch nicht. Zumindest nicht so einfach!

Aber mal was anderes. Wozu brauchst du das? Vielleicht koennen wir das Problem ja ganz anders lösen?

MfG

Hallo Alex

Du hattest recht mit deiner Vermutung, dass isWindowVisible nur für „Hauptformulare“ angewendet wird. Zeigt nämlich das Handle zu einem Childcontrol, wird jeweils dessen Parent (und wenn dieser wieder ein Child ist, dessen Parent u.s.w.) untersucht (ergo zuletzt das Hauptfenster). Weil in meinen Tests, das Hauptfenster natürlich sichtbar war, erhalte ich immer True.

Meine Absicht war eigentlich, das periodische Prüfen einer Fremdapplikation, ob sie inzwischen ein MDIChild geöffnet hat (und entsprechende Benutzerinformation durch Sound etc.). Die Fremdapplikation führt längere Verarbeitungen durch und zeigt jeweils nach Abschluss der Verarbeitung eine MDIChild mit einer Fertigmeldung an. Die Fremdapplikation ist eben nicht von mir, drum kann ich dort nicht direkt eingreifen.

Ein Ansatz wäre allerdings die API SetParent auf das MDIChild der Fremdapplikation anzuwenden (als Parent 0) - damit würde die isWindowVisible das MDIChild als Hauptfenster ansehen und sich für die Sichtbarkeitsprüfung wieder eignen. Allerdings darf man mit einem Fehlverhalten der Fremdapplikation rechnen (diese geht ja davon aus, dass genanntes Formular ein Child ist … :wink:

Muss mal schauen ob es innerhalb des genannten MDI-Child noch irgendwelche Indizien gibt, auf die ich mich abstützten kann.

Auf jeden Fall besten Dank für deine Hinweise!

Gruss
Patrick