Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Aktive Gui-Nummer


  • Please log in to reply
18 replies to this topic
Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Hallo,

 

gibt es irgendeine Möglichkeit die Gui-Nummer des aktiven Fensters abzufragen?

 

Wenn ich z.B: ein Script habe, welches GUI 1 , GUI 2 , GUI 3 und GUI 4 beinhaltet und ich nun auf ein "OnMessage Event" reagiere muss ich wissen welche GUI gerade aktiv ist.

Ich kann mit A_Gui herausfinden welche Gui die Funktion aufgerufen hat, aber das hilft mir nicht weiter.

 

Die Hwnd der aktiven Gui kann ich auch abfragen, aber diese ändert sich ...warum auch immer.

Da mein Script aus über 8000 Zeilen zzgl. Includes besteht macht es wenig Sinn dieses hier anzuhängen, aber ich versuche mein Problem mal zu erklären:

 

Ich rufe eine GUI auf, in dieser löst etwas ein OnMessage aus. Nun kann ich die Hwnd abfragen und abspeichern ( WindowHwnd := WinExist("A") ), um später festzustellen in welchen GUIs die OnMessage bereits ausgelöst wurde , aber wenn ich die Gui nun schließe und später nochmal öffne hat diese nun eine andere Hwnd.

Ich kann zwar mit A_ScriptHwnd die Hwnd vom Hauptfenster abfragen (diese ändert sich auch nicht), aber ich brauche die Gui-Nummer damit ich weiß ob z.B. für Gui 3 schon etwas ausgeführt wurde.

 

In der Hilfe suche ich inzwischen schon seit knapp einer Stunde aber ich finde einfach nichts um die Gui-Nummer (oder den Gui-Namen) des aktiven Fensters abzufragen.

 

Hat jemand eine Idee wie ich an die Gui-Nummer komme?



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Innerhalb der OnMessage-Funktion ist der Name der Gui, an die die Message gerichtet ist, in der Variablen A_Gui abgelegt.


Prefer ahkscript.org for the time being.


Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

"Schließen" und "öffnen" ist so ziemlich das Einzige, was man mit einem GUI nicht machen kann.

 

Man kann das Ding erzeugen, zerstören, anzeigen oder verstecken. Und von dem, was du machst, hängt auch ab, ob sich das Handle ändert.


All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Innerhalb der OnMessage-Funktion ist der Name der Gui, an die die Message gerichtet ist, in der Variablen A_Gui abgelegt.

Das klappt in meinem Script leider nicht. A_Gui ist leer oder enthält Gui 1.
 

"Schließen" und "öffnen" ist so ziemlich das Einzige, was man mit einem GUI nicht machen kann.

Man kann das Ding erzeugen, zerstören, anzeigen oder verstecken. Und von dem, was du machst, hängt auch ab, ob sich das Handle ändert.

Hmmm, stimmt eigentlich.
Ich hatte halt das Problem dass beim zweiten öffnen der Gui der Fehler kommt dass die Variable schon vergeben ist. Das kann dann aber eigentlich nicht sein, da die Gui welche die Variable nutzt ja schon zerstört wurde.
Der Fehler scheint also irgendwo anders zu sein.

 

Vielen Dank für den Wink mit dem Zaunpfahl wink.png



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Du könntest die Beziehung von HWND und Name/Nummer der Gui in einem globalen Array abspeichern. Innerhalb der Funktion kannst Du mit ActiveHwnd := WinExist("A") das HWND des aktiven Fensters holen und gegen das Array checken. Vielleicht klappt das ja.

 

 


Prefer ahkscript.org for the time being.


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Das ist ja genau mein Problem. Wenn eine Gui zerstört und neu erstellt wird ändert sich die Hwnd und somit ergibt die Array-Prüfung immer dass für diese Hwnd noch nichts angelegt wurde. Das ist ja eigentlich auch richtig, denn für die "neue" Hwnd wurde ja tatsächlich noch nichts angelegt.

Nun habe ich aber 2 andere Probleme:

1.) Im Array wird jedes mal ein weiterer Eintrag erstellt, wenn eine neue Hwnd erstellt wird (weil die Gui ein weiteres mal erstellt wurde) ohne dass "alte" einträge gelöscht werden

2.) Beim mehrmaligen erstellen der Gui bekomme ich eine Fehlermeldung.

 

Ich denke es wäre das einfachste das Array anders aufzubauen.

Statt "Array[Hwnd]" sollte ich besser " Array[GuiNummer|xPos|yPos] verwenden und die dazugehörige hwnd im Array ablegen. So werden nur für die Koordinaten Einträge im Array gemacht und die hwnd immer wieder überschrieben (mit dem aktuellen System werden immer wieder neue Einträge im Array erstellt). Zum anderen kann ich so immer auf das Array zugreifen, da ich die Koordinaten des aktuellen Steuerelements jederzeit abfragen kann.



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Eine Gui wird ausschließlich über die Anweisung Gui, Destroy "zerstört". Ein Wegklicken der Gui sorgt nur dafür, dass sie nicht mehr angezeigt wird.

 

Wenn Du diese Anweisung ausführst, ist der Name / die Nummer der Gui bekannt, und Du kannst sie aus dem Array entfernen. Wenn Du dann die Gui neu erstellst (mit der Option hwndHwndDerGui), fügst Du das neue Paar wieder ins Array ein.


Prefer ahkscript.org for the time being.


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Ich weiß ja vorher nicht ob das Hauptscript, in dem das andere Scritp eingebunden wird, die Gui "weggklickt" oder "zerstört", oder evtl auch beides.

Wenn ich die Koordinaten verwende ist das eigentlich egal, da brauche ich nur zu prüfen ob für diese Koordinaten schon ein Eintrag besteht, wenn nicht muss der halt erstellt werden. Wenn ich mit dem Hwnd arbeite weiß ich das nicht (es existiert nie wenn die Gui neu erstellt wurde).

 

Gibt es denn einen Befehl um die Nummer des aktuell angezeigten GUI zu ermitteln? Wie gesagt, A_Gui funktioniert das nicht zuverlässig, das ist manchmal leer und zeigt manchmal Gui 1 an obwohl Gui 4 aktiv ist, denn es wird ja lediglich der "Aufrufer" angezeigt und nicht der "Aufgerufene".



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012

Hallo!

Mal eine andere Idee:

Kannst du deine Gui's nicht mit eindeutigem (Hidden)Text versehen, den du dann abfragst?

gui, add, text, hidden, #Gui1#
...


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Hmmm, die Idee ist gut.

Leider weiß ich ja vorher nicht um welche Gui es sich handelt, da das Script ja per #Include in andere Scripte eingebettet wird.

Es muss doch irgendeine Möglichkeit geben die GuiNummer oder den GuiNamen zu ermitteln, oder?

Geht das vielleicht per DLLs oder sonst einen Trick?

 

Edit: Ich kann zwar den Window-Titel abfragen, aber das hilft mir leider auch nicht weiter, denn der Titel kann sich ja auch ändern (in dem Script wo dieses Script eingebunden werden soll ändert sich der Titel je nach Auswahl einer DDL).



gregster
  • Members
  • 283 posts
  • Last active: Nov 09 2015 03:08 AM
  • Joined: 19 Mar 2009

Hm, ich versteh nicht, wo das Problem ist. Das müsste sich doch per Array, wie schon mehrmals beschrieben, lösen lassen.

 

Beim Erstellen einer neuen GUI kannst du doch direkt die hwnd per +HwndOutputVar in eine Variable schreiben lassen. Solltest du diese gleiche GUI eventuell mehrmals zerstören und neu erzeugen müssen, dann speicher doch alle Handles, die zu dieser einen, speziellen Gui gehören, in einem Array (obwohl... da müsste eigentlich auch die letzte hwnd pro GUI reichen, oder?). Das machst du für alle unterschiedlichen GUIs, die du hast. Wenn du dann bei Bedarf die hwnd eines aktiven Fensters ermitteln musst (z.B. per WinExist() oder WinGet) , kannst du den Handle gegen die gespeicherten Handles abgleichen. Dann weisst du, ob es sich beim aktiven Fenster um eine Inkarnation von Gui 1 handelt oder von Gui 4 oder von wem auch immer.

 

Wenn das nicht klappt, müsstest du vielleicht mal genauer erklären, was du da überhaupt vor hast und ggf mal die relevanten Skriptausschnitte präsentieren...



Seidenweber
  • Moderators
  • 638 posts
  • Last active: Sep 06 2015 01:51 PM
  • Joined: 10 May 2011

Dr_Holle, ich glaube, du hast im Moment nen Tunnelblick.

 

Ich habe hier mal in Zeitlupe 3 Möglichkeiten aufgeschrieben, immer einen eindeutigen Wert zu haben. Den Namen, das Handle in einer Variablen und das Handle in einem Array.

    GuiArray := []

    Gui, Gui1:New, +HwndGuiHwnd1
    GuiArray[1] := GuiHwnd1

    Gui, Gui2:New, +HwndGuiHwnd2
    GuiArray[2] := GuiHwnd2

    Gui, Gui3:New, +HwndGuiHwnd3
    GuiArray[3] := GuiHwnd3

    Gui, Gui4:New, +HwndGuiHwnd4
    GuiArray[4] := GuiHwnd4

    For i, Handle in GuiArray
        txt .= "Gui" i " -> " Handle "`n"
            
    MsgBox,4160,,% txt

Bei dieser Variante wird ein evtl. vorher existierendes GUI mit demselben Namen zerstört.

 

Und hier etwas zum Spielen. Vielleicht wird das damit etwas deutlicher

    GuiArray := Object()

    F9::CreateGui(1)
    F10::CreateGui(2)
    F11::CreateGui(3)
    F12::CreateGui(4)

    CreateGui(g) {
        global
        Gui, Gui%g%:New, +HwndGuiHwnd%g% -MinimizeBox
        Gui, Add, Button, gWhoAmI,Shoot me!
        Gui, Show,% "x" A_ScreenWidth / 5 * g ,% A_Space
        GuiArray[g] := GuiHwnd%g%
    }

    WhoAmI:
        For GuiNumber, Handle in GuiArray
            If WinExist(A) = GuiArray[GuiNumber]
                ToolTip % Handle " (Nr. " GuiNumber ")"
    Return

All questions & answers are related to AHK 1.1.19.03 x64 Unicode

 


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Vielen Dank für die Tipps, aber ich habe mich leider etwas unglücklich ausgedrückt.

Ich binde das Script per Include ein und weiß deswegen nicht welche HWND-Namen vergeben sind (und ob überhaupt welche vergeben sind).

 

Hier ist mal ein Beispiel...

 

Haupt-Script mit den GUIs:

Gui , add , Button , x10 y10 w200 default g2, Weiter zur Gui 2
Gui , add , Button , xp y+10 w200 default g3, Weiter zur Gui 3
Gui , add , Button , xp y+10 w200 default g4, Weiter zur Gui 4
Gui , add , Button , xp y+10 w200 default g5, Weiter zur Gui 5
Gui, Show , Center, Dies ist Gui 1
#include Gui-Erkennung.ahk
return

2:
3:
4:
5:
	Gui, 1:+Disabled
	Gui, %A_ThisLabel%:+Owner1
	Gui, %A_ThisLabel%:add , Text , x10 y10 w200 , Dies ist Gui %A_ThisLabel%
	Gui, %A_ThisLabel%:add , Button , x10 y+10 w200 default, OK
	Gui, %A_ThisLabel%:Show , Center, Dies ist Gui %A_ThisLabel%
return

2ButtonOK:
2GuiClose:
3ButtonOK:
3GuiClose:
4ButtonOK:
4GuiClose:
5ButtonOK:
5GuiClose:
	StringLeft, Nummer,A_ThisLabel,1
	Gui %Nummer%:Destroy
	Gui, 1:-Disabled
	Gui, 1:Show
return

GuiClose:
ExitApp 

Das Script welches die aktive GUI erkennen soll:

F6::
	WindowHwnd := WinExist("A") 
	MsgBox Die hwnd des aktuellen Fensters ist %WindowHwnd%`nDie Aktuelle Gui ist ???
return

Das Script kennt also nicht die Namen der HWND-Variablen und weiß auch nicht ob überhaupt welche vergeben sind.

Ich kann zwar die HWND abfragen, aber wie komme ich an die Gui-Nummer (bzw. den GuiNamen) ?

Wenn man das Hauptscript startet kann man mit F6 vom aktuellen Fenster die HWND abfragen. Damit arbeite ich aktuell. Das Problem ist aber dass diese ich ändert, also brauche ich die Gui-Nummer.

 

Edit:

Die von gregster empfohlene Methode mit +HwndOutputVar ist ja ganz gut, aber da ich nicht weiß ob für diese GUI bereits eine HWND-Variable vergeben ist kann ich das nicht nutzen.

Ich könnte das zwar abfragen und wenn eine HWND-Variable vorhanden ist kann ich diese nutzen und wenn nicht eine hinzufügen, aber was passiert wenn im Hauptscript selber später noch eine Hwnd-Variable hinzugefügt werden soll?

OK, notfalls müsste ich das Risiko in Kauf nehmen, aber lieber wäre mir wenn man den Gui-Namen direkt abfragen kann (vielleicht per SendMessage oder per DLL-Aufruf).



just me
  • Members
  • 1496 posts
  • Last active: Nov 03 2015 04:32 PM
  • Joined: 28 May 2011

Guten Morgen,

 

man kann als Namen einer AHK Gui auch das HWND verwenden. Und Du kannst herausfinden, ob das aktive Fenster eine AHK Gui ist, die zum laufenden Skript gehört:

 

Spoiler

Für das andere Thema brauche ich noch etwas Zeit.


Prefer ahkscript.org for the time being.


Dr_Holle
  • Members
  • 105 posts
  • Last active: Mar 26 2014 10:10 AM
  • Joined: 18 Dec 2012

Ja, aber die Hwnd ändert sich ja, wenn man eine Gui das 2. mal aufruft (siehe Test-Script).

Der Titel hilft mir leider auch nicht weiter weil der im Hauptscript dynamisch erstellt wird (abhängig von der Auswahl).

Selbst wenn ich die Control-Namen verwenden würde wäre ich von dem Gui-Namen abhängig, denn die wiederholen sich ja auch (Edit1,Edit2,Edit3 in Gui2 und Edit1,Edit2,... in Gui2 , usw.)

Ist es denn nicht möglich die Gui-Nummer (oder den Gui-Namen) der aktiven Gui zu ermitteln? Wenn ich an den Namen komme wäre der Rest eindeutig zuzuordnen.