Link an einer bestimmten Desktop-Position erstellen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Link an einer bestimmten Desktop-Position erstellen

Post by halweg » 01 Dec 2020, 12:03

Hallo zusammen,

unter Windows habe ich mir eine universelle Verlinkungssystematik gebaut. Ich kann nun ein beliebiges Element mit WIN-l als Link aufnehmen und mit STRG+e,h an einer beliebigen Stelle einfügen kann. Das Ganze funktioniert gut und ich habe es mit der Zeit weitestgehend perfektioniert, so dass ich neben Internetseiten, Dateien, Verzeichnissen auch auf Outlook-Elemente, einzelne Seiten einer pdf-Datei und Textstellen verlinken kann.
Die Links entstehen je nach Kontext innerhalb einer Office-Datei, eines Outlook-Elements oder in einer Dateiverzeichnis. Falls jemand ähnliches vorhat, kann ich gern helfen.

Als Perfektionist bräuchte ich an einem Punkt aber selber Hilfe:
Wenn ich in einem Dateiverzeichnis einen Hyperlink einfüge, kann ich das ganz gut mit FileCreateShortcut. Dabei kann ich z. B. auch ein Icon für die entstehende Linkdatei angeben.

Nun erzeuge ich häufig auch Links auf meinem Desktop. Hier allerdings sollen die dort entstehen, wo gerade die Maus ist (da ich ich bei den beiden großen Bildschirmen, die den Desktop bilden, sonst lange suchen muss). Um das zu realisieren, erzeuge ich hier eine Verknüpfung mit Send - Befehlen (imitiere also das "rechte Maustaste - neu - Verknüpfung"). Auch das funktioniert, ist aber nicht so hübsch, da ich dabei kein Icon auswählen kann.
Wenn ich FileCreateShortcut verwende, kann ich zwar ein Icon auswählen, aber nicht die Position.

Die Frage ist also: Habt Ihr eine Idee, wie man auf dem Windows-Desktop direkt unter der aktuellen Mausposition einen neuen Link erstellen und ihm ein spezielles Symbol zuweisen kann (ohne das er die Position verändert).


Viele Grüße, Halweg

fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

Re: Link an einer bestimmten Desktop-Position erstellen

Post by fredchf » 01 Dec 2020, 12:22

Hallo Halweg,
Teil eins deines Projektes hast du ja schon mit FileCreateShortcut umgesetzt. Um die Position des neuen Shortcuts zu ändern, schau dir mal Folgendes an. Funktioniert bei mir prima.

https://www.autohotkey.com/boards/viewtopic.php?f=6&t=3529

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Link an einer bestimmten Desktop-Position erstellen

Post by BoBo » 01 Dec 2020, 12:36

Ich würde mal denken das es bei der umgekehrten Vorgehensweise bleiben wird: Erstellung des Verknüpfunglinks, verschieben desselben an Mausposition?!
In grauer Vorzeit hatte ich mir mal einen Satz Hotkeys gesetzt, welche abhängig von der jeweiligen Dateiendung, die Dateiattribute von auszublendenden Dateien auf 'hidden' gesetzt haben. So hatte ich auf Knopfdruck wahlweise PDFs, docs, xls, TXT, ... ein- bzw. ausgeblendet.
Wenn du alle Dateien am Desktop ausblendest bis auf den dir bekannten/zu suchenden Link, dürfte das Auffinden nicht allzu schwer sein, auch ohne umpositionieren.

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Link an einer bestimmten Desktop-Position erstellen

Post by halweg » 02 Dec 2020, 04:43

Danke für Eure wie immer sehr schnellen Rückmeldungen.

@BoBo: Das mit dem Ausblenden ist eine gute Idee, um die Arbeit im Explorer effizienter zu gestalten. Hier nützt mir das aber wenig, denn, die Hyperlinks entstehen ja aus der Arbeit mit verschiedenen Anwendungen (meist gleichzeitig) heraus. Entsprechend ist vom Desktop meist nur eine Ecke sichtbar. Oder ich schiebe mir den Bereich, wo der Hyperlink hingehört (mein Desktop hat "Zonen") kurzfristig frei. Für das Auffinden eines neues Elementes müsste ich den ganzen Desktop sehen und dafür müsste ich alle Fenster minimieren, was in meiner Arbeitsweise fast einem Neustart gleichkommt.

@fredchf: Ja,das geht in die Richtung, die ich mir vorstellte. Allerdings ist das durch die Zugriffe auf das Windows Objekt- und Messagemodell für mich doch recht schwer zu verstehen. Insbesondere kann ich im Moment noch nicht die Stelle finden, wo ich für ein konkretes Symbol (Wie erkennen?) eine konkrete Position mit x- und y-Koordinaten angeben könnte.

Viele Grüße, Halweg

fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

Re: Link an einer bestimmten Desktop-Position erstellen

Post by fredchf » 04 Dec 2020, 11:38

Hallo Halweg, das ist wirklich einfach (auch ohne Objekt-Kenntnisse).
Rufe die Funktion mal ohne Parameter auf, dann siehst du wie die Symbole und ihre Koordinaten zurückgegeben werden. Auf gleiche Art und Weise musst du deine Neuen mit Koordinaten übergeben.

Code: Select all

MsgBox, % DeskIcons()	; gibt die Koordinaten aller Desktopsymbole zurück

MsgBox, % DeskIcons("Papierkorb:131105")	; Papierkorb nach links oben
ExitApp

just me
Posts: 9560
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Link an einer bestimmten Desktop-Position erstellen

Post by just me » 04 Dec 2020, 11:51

Als kleine Ergänzung:

Wenn Du konkrete X/Y-Koordinaten übergeben willst, ist

Code: Select all

XY := ((Y << 16) | (X & 0xFFFF)

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Link an einer bestimmten Desktop-Position erstellen

Post by halweg » 04 Dec 2020, 12:32

Danke!
Mir ging es eigentlich darum, den verlinkten Code auf das zu reduzieren,was ich für die Einstellung einer konkreten Icon-Position benötige. Evtl. habe ich dazu nun alles, bin mir aber nicht sicher.
just me wrote:
04 Dec 2020, 11:51
Wenn Du konkrete X/Y-Koordinaten übergeben willst, ist

Code: Select all

XY := ((Y << 16) | (X & 0xFFFF)
Sorry, aber das verstehe ich nicht.
Bezieht sich das auf das Beispiel von fredchf?
Kombinierst du hier binär zwei 16 Bit Werte?
Muss ich bei X und Y meine Wunschkoordinaten eintragen?
Fehlt da eine Klammer?

fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

Re: Link an einer bestimmten Desktop-Position erstellen

Post by fredchf » 04 Dec 2020, 12:47

Hallo nochmal!
Was Just me da geschrieb nhat, verstehe ich leider auch nicht. Wie du die zu übergebenen Koordinaten errechnen kannst in folgendem Script (heiße Nadel).

Code: Select all

xkoord := 1173
ykoord := 537
;~ MsgBox, % auffuellen_links(dez2z_sys(ykoord, "0123456789ABCDEF"), 0, 4) auffuellen_links(dez2z_sys(xkoord, "0123456789ABCDEF"), 0, 4)
MsgBox, % z_sys2dez(auffuellen_links(dez2z_sys(ykoord, "0123456789ABCDEF"), 0, 4) auffuellen_links(dez2z_sys(xkoord, "0123456789ABCDEF"), 0, 4),"0123456789ABCDEF")

; -----------------------------MEC's Funktion---------------------------------------------
z_sys2dez(st,za) ; übergabe Wert Zahlensystem(st) und der zeichen des zahlensystems(za)
{
   stringsplit, st,st
   PF:=0
   Loop, parse, za
   {
      PB_%A_LoopField% := A_index -1
      PF++
   }
   
   Loop, %st0%
   {
      PBW:=st%A_index%
      PW+= (PF**(st0-A_index))* PB_%PBW%
   }
   Return PW
}
; ------------------------Funktion------------------------------------------------------
dez2z_sys(st,za=01) ; übergabe dezimaler zahl(st) und der zeichen des zahlensystems(za) 
  {
    if st is not Integer
      Return
    z = 0
    Loop, Parse, za
    	{
        ID%z% := A_LoopField
        zz := A_Index
        z++
      }
    While st
    {
    	rest := Mod(st, zz)
    	st := st // zz
    	st2 := ID%rest% st2
    }
    Return st2
  }
; --------------------------------------------------------
auffuellen_links(s, mit = 0, stellen = 4)
	{
		if StrLen(s) >= stellen
			return s
		r := anzahl_zeichen(mit, (stellen - StrLen(s))) s
		;~ MsgBox, % r
		return r
	}
; --------------------------------------------------------
anzahl_zeichen(zeichen, anzahl)
	{
		Loop, % anzahl
			d := d zeichen
		return d
	}

fredchf
Posts: 54
Joined: 30 Sep 2013, 14:55

Re: Link an einer bestimmten Desktop-Position erstellen

Post by fredchf » 04 Dec 2020, 13:12

just me wrote:
04 Dec 2020, 11:51
Als kleine Ergänzung:

Wenn Du konkrete X/Y-Koordinaten übergeben willst, ist

Code: Select all

XY := ((Y << 16) | (X & 0xFFFF)
Ach du Sch... :bravo:
So einfach geht Das? Das gleiche Ergebnis wie mein (Monster) Script.

Code: Select all

X = 1173
Y = 537
XY := ((Y << 16) | (X & 0xFFFF))
MsgBox, % XY

just me
Posts: 9560
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Link an einer bestimmten Desktop-Position erstellen

Post by just me » 05 Dec 2020, 03:55

Moin!

halweg wrote:Bezieht sich das auf das Beispiel von fredchf?
Ja.
Kombinierst du hier binär zwei 16 Bit Werte?
Ja.
Muss ich bei X und Y meine Wunschkoordinaten eintragen?
Ja.
Fehlt da eine Klammer?
Nein. Beim Entschlacken einer etwas anderen Version ist links eine überflüssige Klammer stehen geblieben.

Code: Select all

(Y << 16)      schiebt Y um 16 Bit nach links und macht damit Patz für den X Wert (0xYYYY0000).
(X & 0xFFFF)   greift sich die 16 rechten Bits von X (0x0000XXXX).
|              mit der binären Oder-Verknüpfung werden beide Werte kombiniert (0xYYYYXXXX).

Viel Spaß noch und schöne Feiertage!

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Link an einer bestimmten Desktop-Position erstellen

Post by halweg » 05 Dec 2020, 04:40

Besten Dank noch mal, ich glaube, jetzt habe ich das notwendige Rüstzeug für die perfekte Linkerstellung. Werd ich nächste Woche angehen.

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Link an einer bestimmten Desktop-Position erstellen

Post by halweg » 11 Dec 2020, 10:43

So, Lockdown (hier in Sachsen zur Zeit ganz schlimm) hat mir die nötige Zeit verschafft, das Ganze näher zu betrachten.

Ich habe das verlinkte Skript weitestgehend reduziert, damit ausschließlich das zuletzt hinzugefügte Icon an eine bestimmte Position geschoben wird. Das sieht dann so aus:

Code: Select all

Setze_Neuiconpos(1850,1000)
RETURN

Setze_Neuiconpos(x,y)
  {
 	CONTROLGET, hWindow, HWND,,SysListView321, AHK_CLASS Progman
 	IFWINEXIST AHK_ID %hWindow%                                        ; für die SENDMESSAGE unten muss wohl irgendwie das Handle des ListViews des Programmmanagers als Last Found Window gesetzt werden
    {
    CONTROLGET, liste, list,COL1                                     ; Das würde auch ohne Last Found WIndow funktionieren
    LOOP, PARSE, liste, `n                                           ; Es gibt wohl keinen einfacheren Weg, um an die Iconzahl des Desktops zu kommen
      max_index := A_INDEX -1
    SENDMESSAGE, 0x0000100F, %max_index%, % (y << 16) | (x & 0xFFFF) ; 0x0000100F = LVM_SETITEMPOSITION
    SENDMESSAGE, 0x000B,1,0                                          ; 0x000B = WM_SETREDRAW
    }
  }
Vielleicht könnte Ihr mir noch Tipps zur weiteren Vereinfachung geben?
Aber auch wenn ich hier schon alle Optimierungen ausgeschöpft habe: Ich freue mich, das es funktioniert und ich nun meine neuen Verknüpfungen auf dem Desktop anhand eines Skripts, das ich halbwegs verstehe, immer direkt bei der Maus positionieren kann. :)

Vielen Dank also noch mal für Eure Hilfe.

just me
Posts: 9560
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Link an einer bestimmten Desktop-Position erstellen

Post by just me » 11 Dec 2020, 11:44

Moin,

Code: Select all

    CONTROLGET, liste, list,COL1                                     ; Das würde auch ohne Last Found WIndow funktionieren
Das gaube ich eher nicht, aber das Folgende tut's:

Code: Select all

    CONTROLGET, liste,list,COL1,, AHK_ID %hWindow%                   ; Das würde auch ohne Last Found WIndow funktionieren

Für die Anzahl der Icons:

Code: Select all

    CONTROLGET, Anzahl, list, COUNT
    SENDMESSAGE, 0x0000100F, % (Anzahl - 1), % (y << 16) | (x & 0xFFFF) ; 0x0000100F = LVM_SETITEMPOSITION

halweg
Posts: 93
Joined: 17 Apr 2018, 10:34
Location: Dresden

Re: Link an einer bestimmten Desktop-Position erstellen  Topic is solved

Post by halweg » 14 Dec 2020, 00:58

Danke noch mal just me. Ich habe deine Tipps mit ein paar eigenen Erkenntnissen kombiniert. So konnte ich dann doch auf das Last Found Window verzichten und auch das REDRAW ist anscheinend nicht erforderlich. Insgesamt konnte ich so den Code auf 3 Zeilen reduzieren:

Code: Select all

; Testaufruf
Setze_Neuiconpos(1850,1100)
SLEEP, 1000
Setze_Neuiconpos(1550,1100)
RETURN

; Einstellen der Position des zuletzt dem Desktop hinzugefügten Symbols
Setze_Neuiconpos(x,y)
  {
  CONTROLGET, hWindow, HWND,,SysListView321, AHK_CLASS Progman                  ; Handle des Desktop-Anzeige Controls ermitteln
  CONTROLGET, nr,list,COUNT,,AHK_ID %hWindow%                                   ; Ermittelt die Nummer des zuletzt hinzugefügten Desktopsymbols
  SENDMESSAGE, 0x0000100F, % nr-1, % (y << 16) | (x & 0xFFFF),,AHK_ID %hWindow% ; verschiebt das Symbol (0x0000100F = LVM_SETITEMPOSITION)
  }
Ich glaube, schlanker geht nicht. Aber in Anbetracht meiner Erkenntnisse könnte man sicher auch den Code des Originalskripts verschlanken.

Post Reply

Return to “Ich brauche Hilfe”