Jump to content

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

MultiClipboard mit Gui



  • Please log in to reply
13 replies to this topic
Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013

Hallo zusammen,

 

ich möchte mir ein verbessertes Clipboard bauen das genau auf meine Bedürfnisse zugeschnitten ist. Viele Ansätze habe ich schon gefunden aber leider nichts was in meine Richtung geht. Ich hoffe Ihr könnt mir helfen wink.png

 

Ich fasse mal in Stichpunkten zusammen was mir vorschwebt:

  • Ein Hotkey um die neue Clipboard Funktion allgemein zu aktivieren/deaktiveren
  • Sobald aktiviert wird "Strg+C" abgefangen und löst weitere Aktionen aus
  • Der markierte Text wandert in die Zwischenablage und wird einer Variablen zugewiesen
  • Eine Gui öffnet sich in der ein Button mit Inhalt der Zwischenablage erscheint, für jeden weiteren kopierten Text erscheint ein neuer Button
  • Beim Klick auf einen Button wird der Inhalt der Variable am Cursor wieder eingesetzt

Den genauen Ablauf macht dieses kurze Beispiel relativ klar, zumindest was den kopieren Teil angeht.

^y::
Send ^c
Gui, Add, Button, w100 h40, %clipboard%
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, AutoSize, MultiClipboard
return

 

Woran ich schon scheitere ist das allgemeine aktivieren/deaktiveren und vorallem daran den Buttons die richtigen Variablen zuzuweisen und sie wieder abzurufen.

 

Das ist noch lange nicht das Ende der Probleme aber wenn ich ein grobes Grundgerüst hätte käme ich sicherlich schon weiter. wink.png

 

MfG

Tecron



scoin
  • Members
  • 1 posts
  • Last active: May 16 2019 08:12 AM
  • Joined: 11 Feb 2013

Hi Tecron,

 

ich weiß, man macht das im Autohotkey-Forum nicht. Der Weg ist ja das Ziel. Aber wenn Du wirklich nur ein Tool brauchst, mit dem Du Zeit sparen willst google mal nach ditto+clipboard. Ich habe viele ausprobiert. Diesen Clipboardmanager finde ich am besten...



Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013

Hi scoin,

 

vielen Dank, sofort getestet! wink.png  Aber leider auch nicht das was ich suche...

 

Ich finde es auch sehr lästig für jede kleine Aufgabe gleich ein neues Programm installieren zu müssen.

Alles was ich mir so ausdenke verteile ich als Admin an mehrere Arbeitsplätze und da kommt mir AHK als Multitalent sehr gelegen.

 

Natürlich spricht da jetzt auch der Ehrgeiz aus mir... grin.png Bin die ganze Zeit am tüfteln aber bisher ohne Erfolg...



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012
#Persistent
clip:=[]
Loop
{
Loop,9
{
ClipWait, ,1
Clip[A_Index]:=ClipBoardAll
Clipboard:=""
StringRight, var, clipboard, 10
liste[A_index]:=var
}
}
#v::
For each,var in liste
{
liste2.=var "`n"
}
ToolTip, %Liste%,,,4 ;Anzeige der Liste und warten auf eine Numpad-Ziffentaste
Input, q, L1, {Numpad0}{Numpad1}{Numpad2}{Numpad3}{Numpad4}{Numpad5}{Numpad6}{Numpad7}{Numpad8}{Numpad9}
StringRight, T, ErrorLevel, 1
clsave:=ClipBoardAll 
clipboard:=""
clipboard := clip[T] ; Zwischenablage mit ausgewählten Inhalt füllen
ClipWait, 1, 1 ;Warten bis Zwischenablage gefüllt
ToolTip,,,,4
SendInput,^v
clipboard:=clsave
ClipWait, 1, 1
return

 

Vor zwei drei Tagen hatten wir eine ähnliche Frage.

Diese ist mit Tooltip anstatt mit GUI.

Ich kann es umbauen aber muss ich wissen was dir genau vorschwebt.

z.B. Wie viele Clibboards sollen Maximal gespeichert sein.

Ich persöhnlich würde eine ListView in das Gui einbauen.

Aber probier erst mal die Variante oben.

Sie speichert 9.

Wenn man Strg V drückt erscheint ein Tooltip in dem ein Teil des alten Clipboard Inhalts Enthalten ist.

Nun kann man mit den Numpad Tasten die Gespeicherten Ergebnisse 1-9 auswählen oder garnichts verändern 0.


Visit the new forum ahkscript.org.

http://ahkscript.org


Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013

Ja das habe ich auch gefunden bei meiner Suche hier im Forum.

 

Leider bekomme ich einen Error in Zeile 15 der mein Wissen übersteigt daher konnte ich es bisher nicht testen...



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Das kommt daher, dass du wahrscheinlich kein AHK_L benutzt.

Download dir das neueste von dieser Seite.


Visit the new forum ahkscript.org.

http://ahkscript.org


Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013

Das ist korrekt, jetzt habe ich die neuste Version drauf und folgendes Problem:

 

Er meckert über das "`n" in Zeile "liste2.=var`n"

 

Nehme ich das "`n" raus akzeptiert er das Script aber beim Hotkey #v passiert nichts sichtbares wink.png



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Mein Feher, Habs Verbessert.

Das `n mus in ein "`n" umgewandelt werden.


Visit the new forum ahkscript.org.

http://ahkscript.org


Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013

Das gibts doch nicht, es will einfach nicht laufen bei mir...

Setze ich unten zum Test eine Msgbox rein wird mir diese auch angezeigt, einen Tooltip bekomme ich aber nicht.

Version v1.1.09.03 ist korrekt und kompatibel?

 

Nochmal zum eigentlichen Thema:

Der geplante Ablauf sollte aus dem ersten Post klar werden, wenn ich damit 10 Einträge speichern kann wäre das vollkommend ausreichend.

Ob jetzt mit Buttons oder einer ListView kann man sich immernoch überlegen.

 

EDIT:

So ich bin ein großes Stück weitergekommen, das hier funktioniert vom Prinzip her so wie ich es mir vorstelle:

 

n = 1
^c::
suspend on
Send ^c
suspend off
SavedClip%n% = %clipboard%
StringReplace, SavedLabel, SavedClip%n%, `r`n, , All                    ;ButtonLabel von `r`n befreien
StringLeft, SavedLabel, SavedLabel, 50                                     ;ButtonLabel auf 50 Zeichen kürzen
Gui, Add, Button, w150 h40 vSavedClip%n% gClip%n%, %SavedLabel%
Gui, +ToolWindow +AlwaysOnTop
Gui, Show, x1400 y100 AutoSize, MultiClipboard
n += 1
return

Clip1:
send !{ESC}                                                                ;Zum zuletzt aktiven Fenster wechseln
SendInput %SavedClip1%
return

Clip2:
send !{ESC}                                                                ;Zum zuletzt aktiven Fenster wechseln
SendInput %SavedClip2%
return

Clip3:
send !{ESC}                                                                ;Zum zuletzt aktiven Fenster wechseln
SendInput %SavedClip3%
return

 

Natürlich ist das nur ein statisches Beispiel und auf 3 Einträge begrenzt.

 

Wenn mir jetzt jemand helfen könnte das ganze dynamisch und auf sagen wir mal 10 Einträge auszubauen hätte ich mein Ziel erreicht.

 

Woran ich übrigens am meisten gehangen habe ist wohl die V Option des Buttons, diese habe ich völlig falsch gedeutet. Ich bin davon ausgegangen das der Button eine Variable mit dem Inhalt des Labels erzeugt und nicht das ich dem Button den Wert über V zuweisen muss.



IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Hier ein Ansatz der dynamisch funktioniert. Aktuell kann man eine unbegrenzte Anzahl an Einträgen speichern - da kannst du mit einem "if" noch nachbessern.

 

clipboardStore := [] ;// array in which we store all clipboards
clipboardCount := 10 ;// how many clip-boards shall be avaiable
n := 1 ;// current clipboard 


$^c::

	Send ^c
	ClipWait, 1
	clipboardStore[n] := Clipboard
	StringReplace, SavedLabel, Clipboard, `r`n, , All  ;// ButtonLabel von `r`n befreien
	StringLeft, SavedLabel, SavedLabel, 50   ;// ButtonLabel auf 50 Zeichen kürzen
	Gui, Add, Button, w150 h40 vClip_%n% gSendClip, %SavedLabel%
	Gui, +ToolWindow +AlwaysOnTop
	Gui, Show, x1400 y100 AutoSize, MultiClipboard
	n += 1
return

SendClip:
	send !{ESC}
	
	;// Aus A_GuiControl den button-namen holen, und da die Id extrahieren
	StringSplit, out, A_GuiControl, _
	clipId := Trim(out2)
	
	SendInput, % clipboardStore[clipId]
return


^q::
	ExitApp
return


Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013

Vielen vielen Dank, das ist zu 99,9% das was ich wollte!

 

Ich habe den Code noch etwas erweitert und jetzt fehlt mir noch genau eine Sache.

 

Wie oben erwähnt würde ich die gesamte Funktion gerne über einen Hotkey aktivieren/deaktivieren.

Drückt man den Hotkey springt das MultiClipboard auf Strg+C an, drückt man ihn nochmal kann wie gewohnt kopieren und einfügen.

 

clipboardStore := [] ;// array in which we store all clipboards
clipboardCount := 10 ;// how many clip-boards shall be avaiable
n := 1 ;// current clipboard 

$^c::
	Send ^c
	ClipWait, 1
	clipboardStore[n] := Clipboard
	StringReplace, SavedLabel, Clipboard, `r`n, , All  		;// ButtonLabel von `r`n befreien
	StringLeft, SavedLabel, SavedLabel, 50   		;// ButtonLabel auf 50 Zeichen kürzen
	Gui, 2:Add, Button, x5 w150 h40 vClip_%n% gSendClip, %SavedLabel% ;// Clipboard Button erzeugen
	Gui, 2:Add, Button, x+5 w20 h40 vX_%n% gDeleteClip, X 			;// Delete Button erzeugen
	Gui, 2:+ToolWindow +AlwaysOnTop 
	Gui, 2:Show, x1400 y100 AutoSize NoActivate, MultiClipboard
	n += 1
return

SendClip:
	send !{ESC}				;Zum zuletzt aktiven Fenster wechseln
	StringSplit, out, A_GuiControl, _			;// Aus A_GuiControl den button-namen holen, und da die Id extrahieren
	clipId := Trim(out2)
	SendInput, % clipboardStore[clipId]
return

DeleteClip:
	StringSplit, out, A_GuiControl, _			;// Aus A_GuiControl den button-namen holen, und da die Id extrahieren
	clipId := Trim(out2)
	clipboardStore[clipId] = ""
	GuiControl, Hide, Clip_%clipId%			;//Clipboard Button entfernen
	GuiControl, Hide, X_%clipId%			;//Delete Button entfernen
return

2GuiClose:						;// Beim schließen des Clipboards GUI ausblenden und Variablen leeren
clipboardStore[] = ""
Gui, 2:Destroy
return

 

EDIT:

Löse ich GUI und Variablen so eigentlich korrekt und sauber auf?

 

Und gibt es eine Möglichkeit die GUI nach einem "DeleteClip:" zu refreshen damit die entstandene Lücke verschwindet?



IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Und gibt es eine Möglichkeit die GUI nach einem "DeleteClip:" zu refreshen damit die entstandene Lücke verschwindet?

 

Ich empfehle dir folgenden Ansatz:

 

1. Erstelle beim Skript-start dein Gui einmalig, mit allen Buttons die du so benötigst (z.B. 10)

2. Arbeite nun mit Hide/Show für die Buttons

 

Wenn du es geschickt anstellst, dann mapt jeder Array Index zu deinem Button-Index. Wenn der User nun einen Clip mitten drin löscht, dann müssen alle Array-Positionen ebenfalls nachrücken. Damit hast du eine saubere Ausgangslage:

 

Dein Array ist dein Datenmodell, und das GUI stellt dieses graphisch dar. Eine Methode update() aktualisiert dann einfach dein GUI, anhand von dem, was im Array ist.



IsNull
  • Moderators
  • 990 posts
  • Last active: May 15 2014 11:56 AM
  • Joined: 10 May 2007

Na, ich konnte mich nicht zurückhalten:

global clipboardStore := [] ;// array in which we store all clipboardss
global clipboardCount := 10 ;// how many clip-boards shall be avaiable
global n := 1 ;// current clipboard

Gui, 2:+ToolWindow +AlwaysOnTop 

Loop, % clipboardCount
{
	Gui, 2:Add, Button, x5 w150 h40 vClip_%A_index% gSendClip, <empty> ;// Clipboard Button erzeugen
	Gui, 2:Add, Button, x+5 w20 h40 vX_%A_index% gDeleteClip, X 	   ;// Delete Button erzeugen
	
}

return ;// end of auto execution



$^c::
	Send ^c
	ClipWait, 1
	clipboardStore[n] := Clipboard
	n++ ; n um 1 erhöhen
	
	updateGUI()
	Gui, 2:Show, x800 y100 AutoSize NoActivate, MultiClipboard
	
return

DeleteClip:
;// Den Control-Namen holen, und Id extrahieren
	StringSplit, out, A_GuiControl, _ 
	clipId := Trim(out2)

	clipboardStore.Remove(clipId)

	n--

	updateGUI()
return


SendClip:
	send !{ESC}
	
	;// Aus A_GuiControl den button-namen holen, und da die Id extrahieren
	StringSplit, out, A_GuiControl, _
	clipId := Trim(out2)
	
	SendInput, % clipboardStore[clipId]
return


^q::
	ExitApp
return

updateGUI()
{
	global
	i := 1
	
	loop, % clipboardCount
	{
		newLabel := makeButtonLabel(clipboardStore[i])
		GuiControl,2:,Clip_%i%, % newLabel
		
		if(n > i){
			GuiControl,2:Show,Clip_%i%
			GuiControl,2:Show,X_%i%
		}else{
			GuiControl,2:Hide,Clip_%i%
			GuiControl,2:Hide,X_%i%
		}
		i++
	}
}

makeButtonLabel(rawText){
	StringReplace, labelText, rawText, `r`n, , All   ;// ButtonLabel von `r`n befreien
	StringLeft, labelText, labelText, 50  ;// ButtonLabel auf 50 Zeichen kürzen
	return labelText
}


Tecron
  • Members
  • 7 posts
  • Last active: Feb 16 2013 01:06 PM
  • Joined: 11 Feb 2013
✓  Best Answer

Es ist vollbracht, ich habe den Code noch etwas modifiziert, nochmal vielen Dank für die Hilfe.

 

Hier der fertige Code:

 

;// *************************************************************************************************
;// **************************************** MultiClipboard *****************************************
;// *************************************************************************************************

global clipboardStore := [] 		;// Array für Clipboardeinträge
global clipboardCount := 10 		;// Anzahl verfügbare Clipboards
global n := 1 				;// Aktuelles Clipboard
Gui, 2:+ToolWindow +AlwaysOnTop 
Loop, % clipboardCount
{
	Gui, 2:Add, Button, x10 w150 h40 vClip_%A_index% gSendClip, <empty> 		;// Clipboard Button erzeugen
	Gui, 2:Add, Button, x+5 w20 h40 vX_%A_index% gDeleteClip, X 	   		;// Delete Button erzeugen	
}

Hotkey, ^c, Off 		;// Default: MultiClipboard Hotkey deaktivieren
MultiClipboardState = 0		;// Default: MultiClipboard Status auf deaktiviert setzen
return 									

;// --------------- Ende AutoExec ---------------

#F1::					            ;// Win+F1 MultiClipboard aktivieren/deaktivieren Hotkey
MultiClipboardState := !MultiClipboardState
If MultiClipboardState
	GoSub MultiClipboardOn
Else
	GoSub MultiClipboardOff
Return

MultiClipboardOn:
	Hotkey, ^c, On				        ;// Strg+C Hotkey aktivieren
	OSD("MultiClipboard aktiviert")			;// OSD einblenden
Return

MultiClipboardOff:
	Hotkey, ^c, Off 				;// Strg+C Hotkey deaktivieren
	OSD("MultiClipboard deaktiviert")		;// OSD einblenden
Return

$^c::
	Send ^c
	ClipWait, 1
	clipboardStore[n] := trim(Clipboard)
	n++ 	                                        ;// n um 1 erhöhen
	updateGUI()
	Gui, 2:Show, x1400 y100 AutoSize NoActivate, MultiClipboard		;// GUI einblenden
return

DeleteClip:
	StringSplit, out, A_GuiControl, _ 		;// Aus A_GuiControl den Button-Namen holen, und da die ID extrahieren
	clipId := Trim(out2)
	clipboardStore.Remove(clipId)
	n--				                ;// n um 1 reduzieren
	updateGUI()
return

SendClip:
	send !{ESC}
	StringSplit, out, A_GuiControl, _		;// Aus A_GuiControl den Button-Namen holen, und da die ID extrahieren
	clipId := Trim(out2)	
	SendInput, % clipboardStore[clipId]
return

updateGUI()					        ;// GUI aktualisieren
{
	global
	i := 1
	loop, % clipboardCount
	{
		newLabel := makeButtonLabel(clipboardStore[i])
		GuiControl,2:,Clip_%i%, % newLabel
		
		if(n > i){
			GuiControl,2:Show,Clip_%i%
			GuiControl,2:Show,X_%i%
		}else{
			GuiControl,2:Hide,Clip_%i%
			GuiControl,2:Hide,X_%i%
		}
		i++
	}
}

2GuiClose:						;// Beim schließen des Clipboards GUI ausblenden und Variablen leeren
	clipboardStore := []				;// ClipboardStore leeren
	Clipboard = 					;// Clipboard leeren
	Gui, 2:Destroy					;// GUI zerstören
	n = 1						;// n zurücksetzen
	Gui, 2:+ToolWindow +AlwaysOnTop 	        ;// Neue GUI vorbereiten
	Loop, % clipboardCount
	{
		Gui, 2:Add, Button, x10 w150 h40 vClip_%A_index% gSendClip, <empty> 		;// Clipboard Button erzeugen
		Gui, 2:Add, Button, x+5 w20 h40 vX_%A_index% gDeleteClip, X 	   		;// Delete Button erzeugen	
	}
return

makeButtonLabel(rawText){
	StringReplace, labelText, rawText, `r`n, , All   		;// ButtonLabel von `r`n befreien
	StringLeft, labelText, labelText, 50  				;// ButtonLabel auf 50 Zeichen kürzen
	return labelText
}

OSD(osdText){
	CustomColor = 999999  
	Gui 10:+LastFound +AlwaysOnTop -Caption +ToolWindow 
	Gui, 10:Color, %CustomColor%
	Gui, 10:Font, s32 
	Gui, 10:Add, Text,, %osdText%				;// Den an die Funktion übergebenen String als OSD einblenden
	WinSet, TransColor, %CustomColor% 150
	Gui, 10:Show, Center NoActivate  
	Sleep, 500
	Gui, 10:Cancel
	Gui, 10:Destroy
	return
}


;// *************************************************************************************************
;// **************************************** /MultiClipboard ****************************************
;// *************************************************************************************************