Listview-Element mit Send weiterverarbeiten

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Listview-Element mit Send weiterverarbeiten

29 May 2020, 02:41

Hallo zusammen,

ich bin dabei, mir für einige Programme die Tastenkürzel oder die Erreichbarkeit bestimmter Funktionen in einer Übersichtstabelle zu notieren. Im folgenden Script beispielsweise für Excel.
Was ich nun suche, ist die Möglichkeit, bei Auswahl einer Zeile (duch Doppelklick oder durch Enter) die dort notierten Tastenkürzel tatsächlich ausführen zu lassen. Ist also beispielsweise in einer Zeile notiert Alt-F, 0, dann soll bei Doppelklick (oder Enter) auf diese Zeile quasi folgendes "Script" (in dem Excel-Fenster) ablaufen:

Code: Select all

Send, !f
Sleep 100	; soll für das "," gelten
Send, 0
Die Events "Doppelklick" und "Enter" habe ich in meinem Script schon abgefangen, aber wie setze ich da mein Vorhaben um? Hier mein Script:

Code: Select all

#NoEnv
#SingleInstance force

; ======================================================================================================================================
; Tastenkombinationen mit Erläuterungen als Liste aufzeigen			'
; ===================================================================
!F1::																; Alt-F1
	Tasten=
	(join`n
	Tastenkürzel|Bedeutung
	Shift-LEERTASTE		|ganze Zeile(n) markieren
	Strg-LEERTASTE		|ganze Spalte(n) markieren
	Alt-NUM-			|Zeile(n) ausblenden
	Strg-9				|Zeile(n) ausblenden
	Alt-NUM+			|Zeile(n) einblenden
	Shift-Strg-9		|Zeile(n) einblenden
	Shift-Alt-NUM-		|Spalte(n) ausblenden
	Strg-8				|Spalte(n) ausblenden
	Shift-Alt-NUM+		|Spalte(n) einblenden
	Shift-Strg-8		|Spalte(n) einblenden
	Alt-R, RZ			|Zellinhalt horizontal zentrieren
	Alt-R, D			|Zellinhalt vertikal zentrieren
	Alt-R, II			|Zellinhalt linksbündig
	Alt-R, RE			|Zellinhalt rechtsbündig
	Shift-Strg-F		|Fettschrift
	Strg-2				|Fettschrift
	Shift-Strg-K		|Kursivschrift
	Strg-3				|Kursivschrift
	Shift-Strg-U		|unterstreichen
	Strg-4				|unterstreichen
	Strg-5				|durchstreichen
	Alt-R, 6			|Einzug vergrößern
	Alt-R, ß			|Zellen verbinden ...
	Alt-R, 5			|Einzug verkleinern
	Alt-R, H1			|Füllfarbe
	Alt-R, AC			|Schriftfarbe
	Alt-R, RR			|Rahmenlinien ...
	Alt-R, FO			|Format übertragen
	Shift-Strg--		|Rahmenlinien außen
	Strg-Ü				|Zellinhalt als 'Überschrift' formatieren
	Shift-Strg-Ü		|Zellinhalt als 'Überschrift' formatieren
	Alt-R, OS			|sortieren/filtern
	Alt-V, U			|sortieren (A-Z)
	Alt-V, F			|sortieren (Z-A)
	Alt-V, Ü			|Datenüberprüfung
	F7					|Rechtschreibung
	Strg-K				|Link bearbeiten
	Shift-Strg-L		|Autofilter ein/aus
	Alt-M				|Microsoft-Suche
	F3					|Dialog: Namen eingeben
	Strg-F3				|Namensmanager
	Shift-F3			|(Zelle mit Formel): Funktionsargumente
	F4					|Zellbearbeitung: absolute/relative Bezüge
	F5					|Dialog: Gehe zu
	Alt-F8				|Dialog: Makro
	Alt-R, 8			|Bedingte Formatierung
	F9					|Formelabschnitt auswerten
	F12					|Summe mark. Bereich in Zwischenablage
	Strg-P				|Seitenansicht (Backstage-Ansicht)
	Strg-R				|Zellen links vom mark. Bereich einfügen
	Strg-U				|Zellen oberhalb des mark. Bereichs einfügen
	Strg-.				|aktuelles Datum einfügen
	Shift-Strg-.		|aktuelle Uhrzeit einfügen
	Strg-,				|Inhalt der Zelle darüber einfügen
	Strg-RÜCKTASTE		|zur Ansicht der aktive Zelle
	Alt-I, B			|Bild einfügen ...
	Alt-I, 2			|Form einfügen ...
	Alt-I, KO			|Kopfzeile(n) einfügen
	Alt-S, X			|Gitternetzlinien anzeigen
	Alt-F, X			|Gitternetzlinien anzeigen
	Alt-4				|Seitenansicht (Vollbild)
	Alt-S, K			|Seite einrichten ...
	Alt-S, 8			|Seitenränder ...
	Alt-S, H			|Druckbereich festlegen/aufheben
	Alt-S, Ü			|Seitenumbruch ...
	Alt-D, OEE Alt-M	|Seitenumbruch ein-/ausblenden
	Alt-S, I			|Drucktitel (Zeilen/Spalten) ...
	Alt-P, S2			|Blatt schützen / Blattschutz aufheben
	Alt-P, E			|Arbeitsmappe schützen ...
	Alt-F, P			|Fenster fixieren / Fixierung aufheben
	Alt-F, 0			|Zoom 100`%
	Alt-W, K			|Makro aufzeichnen
	Alt-W, M			|Excel-Addins
	Alt-W, I			|Steuerelement einfügen
	Alt-W, N			|Entwurfsmodus an/aus
	)

	TastaturZeilen := []
	TastaturFelder := []

	Index := 1
	Loop, Parse, Tasten, `n, `r
	{
		If (A_Index > 1) && (A_LoopField <> "")
		{
			TastaturZeilen[Index] := A_LoopField
			TastaturFelder[Index] := StrSplit(A_LoopField, "|")
			Index++
		}
	}
	Tasten := ""

	GUIBreite := 425
	Gui, EXCEL:New
	Gui, EXCEL:Font, s9, Segoe UI
	Gui, EXCEL:Add, Text,, Mit ESC Suchfeld löschen oder beenden
	Gui, EXCEL:Add, Edit, w%GUIBreite% vSuchText gSuche
	Gui, EXCEL:Add, ListView, Count20 BackgroundCCDDEE Grid r26 w%GUIBreite% vVMeineListe gMyListView, Tastenkürzel|Bedeutung
	Gui, EXCEL:Add, Button, Default, OK
	Gui, EXCEL: +AlwaysOnTop
	Gui, EXCEL:Show, x1900 y200 Autosize, Tastenkürzel

	Gosub, LV_Laden

	GuiControl, -Redraw, VMeineListe
	Loop,  % LV_GetCount("Column")
		LV_ModifyCol(A_Index, "AutoHdr")
	GuiControl, +Redraw, VMeineListe
	Return

	; ------------------------------------------------------------------------------------------------------------------
	Suche:
		GuiControlGet, SuchText
		GoSub, LV_Laden
	Return

	; ------------------------------------------------------------------------------------------------------------------
	LV_Laden:
		GuiControl, -Redraw, VMeineListe
		LV_Delete()
		For i, v In TastaturFelder
		{
			If (Suchtext = "") || InStr(TastaturZeilen[i], SuchText)
				LV_Add("", v*)
		}
		GuiControl, +Redraw, VMeineListe
	Return

	; ------------------------------------------------------------------------------------------------------------------
	ExcelButtonOK:
		GuiControlGet, FocusedControl, Focus
		if FocusedControl <> SysListView321
			Return
		Zeile := LV_GetNext(0, "Focused")
		LV_GetText(RowText, Zeile)  ; Text aus erster Spalte
		RowText := Trim(RowText)
		MsgBox % "Zeilennr.: " . Zeile . "`nText: " . RowText
	Return

	; ------------------------------------------------------------------------------------------------------------------
	MyListView:
	If A_GuiEvent = DoubleClick
	{
		LV_GetText(RowText, A_EventInfo)  ; Get the text from the row's first field.
		RowText := Trim(RowText)
		MsgBox % "Zeilennr.: " . A_EventInfo . "`nText: " . RowText
	}
	Return

	; ------------------------------------------------------------------------------------------------------------------
	EXCELGuiEscape:
		If (Suchtext <> "")			; wenn im Suchfeld etwas steht ...
		{
			GuiControl,, SuchText	; ... Suchfeld löschen
			Return					; und zurück
		}							; wenn im Suchfeld nichts steht ...
	EXCELGuiClose:
		Gui,EXCEL: Destroy
Return
Herzliche Grüße aus dem Rheinland
Lucky Joe
BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Listview-Element mit Send weiterverarbeiten

29 May 2020, 13:52

Mir ist nicht wirklich klar wie du diese 'Kommandozeile' extrahieren kannst (ControlGetText?), anschließend wäre wahrscheinlich sowas wie exec()/One Line Command eine Option ...

https://www.autohotkey.com/boards/viewtopic.php?f=76&t=75956
https://autohotkey.com/board/topic/37397-onelinecommands-execute-ahk-code-dynamically/
https://autohotkey.com/board/topic/3152-execute-ahk-code-dynamically/
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Listview-Element mit Send weiterverarbeiten

30 May 2020, 05:20

Moin,

wenn Du das Gui-Fenster anzeigst, wird es automatisch zum aktiven Fenster. Leider kann man sich nicht mehr blind darauf verlassen, dass nach Schließen des Gui-Fenster wieder das zuvor aktive Fenster aktiviert wird. es wäre deshalb gut zu wissen, welches Fenster beim Auslösen des Hotkeys aktiv war. Eine Möglichkeit dafür ist es, den Hotkey kontextabhängig zu machen. Weil Dein Skript ja offensichtlich für Excel gedacht ist, z.B. mit

Code: Select all

#IfWinActive, KriterienFüreinExcelFenster ; z.B. Titel, ahk_exe, ahk_class
Du kannst Dir Dann mit

Code: Select all

!F1::
HEXCEL := WinExist()
das Handle des Excelfensters abgreifen, um es später wieder gezielt aktivieren zu können.

Ansonsten halte ich das Format der 'Steuerungsanweisungen' nicht für besonders günstig. Die Modifikatoren lassen sich leicht ersetzen. Für Begriffe wie LEERTASTE, RÜCKTASTE, NUM+, Num-, etc. muss man aber zusätzliche 'Übersetzungstabellen' erstellen und Zeichenfolgen wie F9 mögen nicht immer eindeutig sein (zwei Zeichen oder die F9-Taste?). Wenn Du das geneigte Publikum nicht mit den AHK-Tastenbezeichnungen der Send-Anweisung verwirren willst, könntest Du ja eine versteckte Spalte mit den AHK-Bezeichner anlegen.
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Listview-Element mit Send weiterverarbeiten

30 May 2020, 12:18

ControlSend würde auch funktionieren wenn Excel nicht aktiv wäre
z.B.

Code: Select all

RowText := StrReplace(RowText, "Strg", "^")
RowText := StrReplace(RowText, "-")
ControlSend , , %RowText%, ahk_class XLMAIN
funktioniert bei mir mit Strg+9

Das müsste natürlich auch für Alt, Shift usw. machen
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Listview-Element mit Send weiterverarbeiten

02 Jun 2020, 12:33

Hallo zusammen,

war über Pfingsten kurzfristig verreist, daher werde ich mich morgen mit euren Vorschlägen auseinandersetzen. Vielen Dank auf jeden Fall schon mal für die Tipps.
Herzliche Grüße aus dem Rheinland
Lucky Joe
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Listview-Element mit Send weiterverarbeiten

04 Jun 2020, 09:57

Hallo,

ich habe mein Script dank eurer Hilfe erweitern können. Von just me habe ich den Vorschlag mit einer zusätzlichen Spalte übernommen, die ich im Folgenden noch eingeblendet lasse. Allerdings bekomme ich es nicht hin, das Handle des Excelfensters später zu verwenden.

Der Vorschlag von KHA mit dem ControlSend funktioniert bei "einzelnen" Tastenkürzeln gut, wenn also eine Taste mit entsprechenden Modifikatoren (Strg, Shift, Alt) gesendet wird. Aber ich habe noch folgende Schwierigkeit:

Irgendwie versteht Excel die meisten "Alt-" Kürzel nicht. Ich hatte vor, notierte Tastenkürzel, die ein "," beinhalten, zu splitten und dann einzeln zu verarbeiten, aber mit den Alt-Tasten klappt das nicht. Hat jemand dazu eine Idee?

Ein kleiner "Schönheitsfehler" ist ebenfalls noch dabei:
Wie bekomme ich es hin, dass nach einer Suche (und damit einer Filterung) nach dem Senden des Tastenkürzels das GUI so geschlossen wird, dass beim nächsten Aufruf die Filterung nicht mehr drin ist? Derzeit ist es so, dass ich nach einer Filterung und Senden des Tastenkürzels bei erneutem Aufruf (mit Alt-F1) die Liste gefiltert ist. Zum Testen:

Alt-F1 öffnet meine Liste,
"se" im Suchfeld eingeben: die Liste wird gefiltert (6 Einträge),
Doppelklick auf den 1. Eintrag (Strg-P) ruft die Seitenansicht auf, die Liste ist weg.
Erneutes Aufrufen der Liste mit Alt-F1: die Liste erscheint wie zuvor mit der gefilterten Ansicht.

Code: Select all

#IfWinActive, ahk_exe EXCEL.EXE 										; nur wenn Excel aktiv

	; ======================================================================================================================================
	; Tastenkombinationen mit Erläuterungen als Liste aufzeigen			'
	; ===================================================================
	!F1::																; Alt-F1
		hEXCEL := WinExist()											; Fenster-Handling speichern
		Tasten=
		(join`n
		Tastenkürzel|Bedeutung|AHK-Bezeichner
		Shift-LEERTASTE		|ganze Zeile(n) markieren						|+{SPACE}
		Strg-LEERTASTE		|ganze Spalte(n) markieren						|^{SPACE}
		Alt-NUM-			|Zeile(n) ausblenden							|!{NumpadSub}
		Strg-9				|Zeile(n) ausblenden							|^9
		Alt-NUM+			|Zeile(n) einblenden							|!{NumpadAdd}
		Shift-Strg-9		|Zeile(n) einblenden							|+^9
		Shift-Alt-NUM-		|Spalte(n) ausblenden							|+!{NumpadSub}
		Strg-8				|Spalte(n) ausblenden							|^8
		Shift-Alt-NUM+		|Spalte(n) einblenden							|+!{NumpadAdd}
		Shift-Strg-8		|Spalte(n) einblenden							|+^8
		Alt-R, RZ			|Zellinhalt horizontal zentrieren				|!r,rz
		Alt-R, D			|Zellinhalt vertikal zentrieren					|!r,d
		Alt-R, II			|Zellinhalt linksbündig							|!r,ii
		Alt-R, RE			|Zellinhalt rechtsbündig						|!r,re
		Shift-Strg-F		|Fettschrift									|+^f
		Strg-2				|Fettschrift									|^2
		Shift-Strg-K		|Kursivschrift									|+^k
		Strg-3				|Kursivschrift									|^3
		Shift-Strg-U		|unterstreichen									|+^u
		Strg-4				|unterstreichen									|^4
		Strg-5				|durchstreichen									|^5
		Alt-R, 6			|Einzug vergrößern								|!r,6
		Alt-R, ß			|Zellen verbinden ...							|!r,ß
		Alt-R, 5			|Einzug verkleinern								|!r,5
		Alt-R, H1			|Füllfarbe										|!r,h1
		Alt-R, AC			|Schriftfarbe									|!r,ac
		Alt-R, RR			|Rahmenlinien ...								|!r,rr
		Alt-R, FO			|Format übertragen								|!r,fo
		Shift-Strg--		|Rahmenlinien außen								|+^-
		Strg-Ü				|Zellinhalt als 'Überschrift' formatieren		|^ü
		Shift-Strg-Ü		|Zellinhalt als 'Überschrift' formatieren		|+^ü
		Alt-R, OS			|sortieren/filtern								|!r,os
		Alt-V, U			|sortieren (A-Z)								|!v,u
		Alt-V, F			|sortieren (Z-A)								|!v,f
		Alt-V, Ü			|Datenüberprüfung								|!v,ü
		F7					|Rechtschreibung								|{F7}
		Strg-K				|Link bearbeiten								|^k
		Shift-Strg-L		|Autofilter ein/aus								|+^l
		Alt-M				|Microsoft-Suche								|!m
		F3					|Dialog: Namen eingeben							|{F3}
		Strg-F3				|Namensmanager									|^{F3}
		Shift-F3			|(Zelle mit Formel): Funktionsargumente			|+{F3}
		F4					|Zellbearbeitung: absolute/relative Bezüge		|{F4}
		F5					|Dialog: Gehe zu								|{F5}
		Alt-F8				|Dialog: Makro									|!{F8}
		Alt-R, 8			|Bedingte Formatierung							|!r,8
		F9					|Formelabschnitt auswerten						|{F9}
		F12					|Summe mark. Bereich in Zwischenablage			|{F12}
		Strg-P				|Seitenansicht (Backstage-Ansicht)				|^p
		Strg-R				|Zellen links vom mark. Bereich einfügen		|^r
		Strg-U				|Zellen oberhalb des mark. Bereichs einfügen	|^u
		Strg-.				|aktuelles Datum einfügen						|^.
		Shift-Strg-.		|aktuelle Uhrzeit einfügen						|+^.
		Strg-,				|Inhalt der Zelle darüber einfügen				|^,
		Strg-RÜCKTASTE		|zur Ansicht der aktive Zelle					|^{BACKSPACE}
		Alt-I, B			|Bild einfügen ...								|!i,b
		Alt-I, 2			|Form einfügen ...								|!i,2
		Alt-I, KO			|Kopfzeile(n) einfügen							|!i,ko
		Alt-S, X			|Gitternetzlinien anzeigen						|!s,x
		Alt-F, X			|Gitternetzlinien anzeigen						|!f,x
		Alt-4				|Seitenansicht (Vollbild)						|!4
		Alt-S, K			|Seite einrichten ...							|!s,k
		Alt-S, 8			|Seitenränder ...								|!s,8
		Alt-S, H			|Druckbereich festlegen/aufheben				|!s,h
		Alt-S, Ü			|Seitenumbruch ...								|!s,ü
		Alt-D, OEE, Alt-M	|Seitenumbruch ein-/ausblenden					|!d,oee,!m
		Alt-S, I			|Drucktitel (Zeilen/Spalten) ...				|!s,i
		Alt-P, S2			|Blatt schützen / Blattschutz aufheben			|!p,s2
		Alt-P, E			|Arbeitsmappe schützen ...						|!p,e
		Alt-F, P			|Fenster fixieren / Fixierung aufheben			|!f,P
		Alt-F, 0			|Zoom 100`%										|!f,0
		Alt-W, K			|Makro aufzeichnen								|!w,k
		Alt-W, M			|Excel-Addins									|!w,m
		Alt-W, I			|Steuerelement einfügen							|!w,i
		Alt-W, N			|Entwurfsmodus an/aus							|!w,n
		)

		TastaturZeilen := []
		TastaturFelder := []

		Index := 1
		Loop, Parse, Tasten, `n, `r
		{
			If (A_Index > 1) && (A_LoopField <> "")
			{
				TastaturZeilen[Index] := A_LoopField
				TastaturFelder[Index] := StrSplit(A_LoopField, "|")
				Index++
			}
		}
		Tasten := ""

		GUIBreite := 525
		Gui, EXCEL:New
		Gui, EXCEL:Font, s9, Segoe UI
		Gui, EXCEL:Add, Text,, Mit ESC Suchfeld löschen oder beenden
		Gui, EXCEL:Add, Edit, w%GUIBreite% vSuchText gSuche
		Gui, EXCEL:Add, ListView, Count20 BackgroundCCDDEE Grid r26 w%GUIBreite% vVMeineListe gMyListView, Tastenkürzel|Bedeutung|AHK-Bezeichner
		Gui, EXCEL:Add, Button, Hidden Default, OK
		Gui, EXCEL: +AlwaysOnTop
		Gui, EXCEL:Show, x1900 y200 h610, Tastenkürzel

		Gosub, LV_Laden

		GuiControl, -Redraw, VMeineListe
		Loop,  % LV_GetCount("Column")
			LV_ModifyCol(A_Index, "AutoHdr")
		; LV_ModifyCol(3, 0)
		GuiControl, +Redraw, VMeineListe
		Return

		; ------------------------------------------------------------------------------------------------------------------
		Suche:
			GuiControlGet, SuchText
			GoSub, LV_Laden
		Return

		; ------------------------------------------------------------------------------------------------------------------
		LV_Laden:
			GuiControl, -Redraw, VMeineListe
			LV_Delete()
			For i, v In TastaturFelder
			{
				If (Suchtext = "") || InStr(TastaturZeilen[i], SuchText)
					LV_Add("", v*)
			}
			GuiControl, +Redraw, VMeineListe
		Return

		; ------------------------------------------------------------------------------------------------------------------
		MyListView:
		If A_GuiEvent = DoubleClick
		{
			LV_GetText(RowText, A_EventInfo, 3)		; Text aus 3. Spalte
			RowText := Trim(RowText)
			SendeTasten(RowText)
			Goto EXCELGuiClose
		}
		Return

		; ------------------------------------------------------------------------------------------------------------------
		ExcelButtonOK:
			GuiControlGet, FokussiertesSteuerelement, FocusV
			If (FokussiertesSteuerelement != "VMeineListe")
				Return
			Zeile := LV_GetNext(0, "Focused")
			LV_GetText(RowText, Zeile, 3)  			; Text aus 3. Spalte
			RowText := Trim(RowText)
			SendeTasten(RowText)
			Goto EXCELGuiClose
		Return

		; ------------------------------------------------------------------------------------------------------------------
		SendeTasten(TKuerzel)
		{
			aTKuerzel := StrSplit(TKuerzel, ",")
			Loop % aTKuerzel.MaxIndex()
				If % aTKuerzel.MaxIndex() = 1
					ControlSend,, %TKuerzel%, ahk_class XLMAIN
				Else
				{
					TKuerzel := aTKuerzel[a_index]
					ControlSend,, %TKuerzel%, ahk_class XLMAIN
				}
			Return
		}

		; ------------------------------------------------------------------------------------------------------------------
		EXCELGuiEscape:
			If (Suchtext <> "")
			{
				GuiControl,, SuchText				; Suchfeld löschen
				Return
			}

		EXCELGuiClose:
			Gui,EXCEL: Destroy
	Return

#IfWinActive
Herzliche Grüße aus dem Rheinland
Lucky Joe
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Listview-Element mit Send weiterverarbeiten

05 Jun 2020, 03:19

Code: Select all

		Gui, EXCEL:New
		Gui, EXCEL:Font, s9, Segoe UI
		Gui, EXCEL:Add, Text,, Mit ESC Suchfeld löschen oder beenden
		Gui, EXCEL:Add, Edit, w%GUIBreite% vSuchText gSuche
		Gui, EXCEL:Add, ListView, Count20 BackgroundCCDDEE Grid r26 w%GUIBreite% vVMeineListe gMyListView, Tastenkürzel|Bedeutung|AHK-Bezeichner
		Gui, EXCEL:Add, Button, Hidden Default, OK
		Gui, EXCEL: +AlwaysOnTop
		Gui, EXCEL:Show, x1900 y200 h610, Tastenkürzel
		
		SuchText := ""          ; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
		Gosub, LV_Laden
Moin,

Du könntest die Arrays mit den Tastaturkürzeln auch nur einmal beim Start des Skripts aufbauen. Sie verändern sich ja nicht. Das gilt auch für das Fenster, einmal erstellen und in der Hotkeyroutine nur noch initialisieren und anzeigen bzw. verstecken.

Goto EXCELGuiClose würde ich durch Gosub EXCELGuiClose ersetzen.
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Listview-Element mit Send weiterverarbeiten

05 Jun 2020, 05:22

@just me: Danke für die Zeile SuchText := "" - so einfach kann die Lösung sein :-)
Dass ich das Array mit den Tastaturkürzeln und das GUI-Fenster nur einmal beim Start des Skripts aufbauen brauche, ist für mich in der Theorie nachvollziehbar, aber die Praxis ...? Mein Script wird mit #Include von einem "Hauptscript" eingebunden, da ich die ganzen Tastenkürzel für unterschiedliche Anwendungen "ausgelagert" habe.
Herzliche Grüße aus dem Rheinland
Lucky Joe
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Listview-Element mit Send weiterverarbeiten

05 Jun 2020, 05:58

LuckyJoe wrote:... aber mit den Alt-Tasten klappt das nicht. Hat jemand dazu eine Idee?
Du holst Dir ja beim Start der Hotkeyroutine das HWND des Excel-Fensters. Hast Du mal versucht, Excel damit wieder zu aktivieren, bevor Du die Tasten sendest? Wahrscheinlich geht das dann auch mit dem normalen Send Kommando, möglicherweise auch mit z.B. Send, !ros ; sortieren/filtern
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Listview-Element mit Send weiterverarbeiten

05 Jun 2020, 07:25

Hallo just me,

Ich hatte deinen Vorschlag im Hinblick auf das HWND des Excel-Fensters zunächst ignoriert, weil es nicht funktionierte und die ControlSend zumindest für die meisten Tastenkürzel funktionierte. Jetzt habe ich mich noch einmal mit deinem Tipp auseinandergesetzt und festgestellt, dass die am Anfang des Scriptes geholte Variable hEXCEL in meiner Funktion immer leer ist ... ja klar, ist ja keine globale Variable.
:headwall:
Nun hole ich die HWND des Excel-Fensters erst innerhalb der Funktion und dann klappt es auch mit Send :)
Auch das Handling, dass bei Komma-getrennten (oder komma-getrennten?) Tastenkürzeln die Tasten mit einer kleinen Pause gesendet werden, funktioniert selbst bei !d,oee,!m.
Hier der Auszug mit besagte Funktion:

Code: Select all

SendeTasten(TKuerzel)
{
	hEXCEL := WinExist("ahk_class XLMAIN")
	WinActivate, ahk_id %hEXCEL%
	aTKuerzel := StrSplit(TKuerzel, ",")
	Loop % aTKuerzel.MaxIndex()
		If % aTKuerzel.MaxIndex() = 1
			Send, %TKuerzel%
		Else
		{
			TKuerzel := aTKuerzel[a_index]
			Sleep, 50
			Send, %TKuerzel%
		}
	Return
}
Danke dir vielmals! Du bleibst für mich "The Godfather of AHK" :lol:
Herzliche Grüße aus dem Rheinland
Lucky Joe
just me
Posts: 9453
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Listview-Element mit Send weiterverarbeiten

06 Jun 2020, 03:41

Moin Lucky,

ich hatte gar nicht wirklich registriert, dass sich zwischen den Labels eine Funktion verbirgt. Die kann zwar nicht ohne Weiteres auf globale Variable zugreifen, man kann ihr aber das 'außen' gefundene Fensterhandle ais Parameter übergeben.

Zur aktuellen Funktion:

Code: Select all

SendeTasten(TKuerzel)
{
	hEXCEL := WinExist("ahk_class XLMAIN")
	WinActivate, ahk_id %hEXCEL%
Was soll passieren, wenn aus welchem Grund auch immer kein Excelfenster gefunden wird? Ich schlage folgende Änderung vor:

Code: Select all

SendeTasten(TKuerzel)
{
	If WinExist("ahk_class XLMAIN") ; setzt ggf. das 'zuletzt-gefundene-Fenster'
	{
		WinActivate
		WinWaitActive, , , 1 ; 1 Sekunde auf Aktivierung warten (evtl. anpassen)
	}
	Else
		ErrorLevel := 1
	If (Errorlevel) ; kein aktives Excelfenster
	{
		MsgBox, 16, Fehler!, Es konnte kein Excelfenster gefunden bzw. aktiviert werden.
		Return 0
	}
	...
Den Klassennamen XLMain solltest Du auch im #IfWinActive, ... verwenden.
User avatar
LuckyJoe
Posts: 341
Joined: 02 Oct 2013, 09:52

Re: Listview-Element mit Send weiterverarbeiten

06 Jun 2020, 04:06

... wird immer perfekter :)
Danke nochmals.
Herzliche Grüße aus dem Rheinland
Lucky Joe

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 98 guests