AutoHotkey: Make shortcut file from clipboard contents: Difference between revisions

From TotalcmdWiki
Jump to navigation Jump to search
(support for more complex URLs, file name in parameters)
(V1.21, support for more complex URLs, file name in parameters)
Line 16: Line 16:
*/ ; --> <code><pre>
*/ ; --> <code><pre>
; /////////////////////////////////////////////////////////////////////
; /////////////////////////////////////////////////////////////////////
; // MkNewShortcut_from_Clipboard.ahk v1.20 -  (W) StatusQuo 2008-2021
; // MkNewShortcut_from_Clipboard.ahk v1.21 -  (W) StatusQuo 2008-2021
; /////////////////////////////////////////////////////////////////////
; /////////////////////////////////////////////////////////////////////
; // Make new shortcut (lnk/URL) using actual clipboard information.
; // Make new shortcut (lnk/URL) using actual clipboard information.
; // Tested on Win2k SP4 (v1.01) and Win7 (Update v1.10/v1.20).
; // Tested on Win2k SP4 (v1.01) and Win7 (Update v1.10..v1.21).
; // Probably not working on WinVista: MS removed the NewLinkHere function and put it back in Win7.
; // Probably not working on WinVista: MS removed the NewLinkHere function and put it back in Win7.
; //
; //
Line 25: Line 25:
; /////////////////////////////////////////////////////////////////////
; /////////////////////////////////////////////////////////////////////


boDebug := "0"
sRunCmd = rundll32.exe appwiz.cpl`,NewLinkHere %A_WorkingDir%\
sRunCmd = rundll32.exe appwiz.cpl`,NewLinkHere %A_WorkingDir%\
sWinTitleNewLinkW7  := "ahk_class NativeHWNDHost"
sWinTitleNewLinkW7  := "ahk_class NativeHWNDHost"
Line 42: Line 43:
FileAppend,, %sTempFileName%
FileAppend,, %sTempFileName%
sRunCmd = rundll32.exe appwiz.cpl`,NewLinkHere %sTempFileName%
sRunCmd = rundll32.exe appwiz.cpl`,NewLinkHere %sTempFileName%
;:MsgBox, debug sRunCmd:`n%sRunCmd%
DlgUrlEdit  := "Edit1"
DlgUrlEdit  := "Edit1"
DlgUrlBut  := "Button1"
DlgUrlBut  := "Button1"
Line 68: Line 68:
Sleep, 250 ; *** time to display 2nd window (target file name)
Sleep, 250 ; *** time to display 2nd window (target file name)


sFileName = %Clipboard%
sFileName := sURL ; %Clipboard%
{ ; Clipboard = Internet or local URL
{ ; Clipboard = Internet or local URL
; StringGetPos: zero-based, first char is #0
; StringGetPos: zero-based, first char is #0
Line 89: Line 89:
}
}
; -----------
; -----------
if (InStr(sFileName, "?") > 1) ; *** remove trailing parameter from URL/filename
{
sFileName := (SubStr(sFileName, 1, InStr(sFileName, "?") - 1))
iPos = -1
Goto FnExtractDone
}
if (SubStr(sFileName, 1, 1) = "?") ; *** parameters first, filename in one of parameters (last?)
if (SubStr(sFileName, 1, 1) = "?") ; *** parameters first, filename in one of parameters (last?)
{
{
Line 95: Line 101:
;
;
if (iPos < 0) ; *** Clipboard = FN param in long URL
if (iPos < 0) ; *** Clipboard = FN param in long URL
{ ; https://portableapps.com/redirect/?a=OperaPortable&s=s&d=pa&f=OperaPortable_78.0.4093.184.paf.exe
{ ; https://base.tld/redirect/?a=name&s=s&d=pa&f=file.exe
StringGetPos, iPos, sFileName, f=, R
StringGetPos, iPos, sFileName, f=, R
if (iPos >= 0)
if (iPos >= 0)
Line 101: Line 107:
}
}
if (iPos < 0) ; *** Clipboard = FN param in long URL
if (iPos < 0) ; *** Clipboard = FN param in long URL
{ ; https://portableapps.com/redirect/?a=OperaPortable&s=s&d=pa&f=OperaPortable_78.0.4093.184.paf.exe
{ ; https://base.tld/redirect/?a=name&s=s&d=pa&f=file.exe
StringGetPos, iPos, sFileName, =, R
StringGetPos, iPos, sFileName, =, R
}
}
Line 116: Line 122:
sFileName := SubStr(sFileName, 1, InStr(sFileName, "&") - 1)
sFileName := SubStr(sFileName, 1, InStr(sFileName, "&") - 1)
}
}
if (InStr(sFileName, "?")>0) ; *** remove trailing parameter from URL/filename
if (InStr(sFileName, "?") > 0) ; *** remove trailing parameter from URL/filename
{
{
sFileName := (SubStr(sFileName, 1, InStr(sFileName, "?") - 1))
sFileName := (SubStr(sFileName, 1, InStr(sFileName, "?") - 1))
}
}
}
}
FnExtractDone:


if (FileExist(sFileName . ".url"))
if (FileExist(sFileName . ".url"))

Revision as of 10:16, 11 September 2021

Make a new shortcut (*.LNK for local targets, *.URL for internet URLs),

-taking the clipboard's contents as target address and
-trying to auto-detect the file name for *.lnk/*.url

Leaves only the last RETURN key press to the user, the rest is automated.


Related links:


; /////////////////////////////////////////////////////////////////////
; // MkNewShortcut_from_Clipboard.ahk v1.21  -  (W) StatusQuo 2008-2021
; /////////////////////////////////////////////////////////////////////
; // Make new shortcut (lnk/URL) using actual clipboard information.
; // Tested on Win2k SP4 (v1.01) and Win7 (Update v1.10..v1.21).
; // Probably not working on WinVista: MS removed the NewLinkHere function and put it back in Win7.
; //
; // Thanks to icfu for pointing me to appwiz.cpl function
; /////////////////////////////////////////////////////////////////////

boDebug := "0"
sRunCmd = rundll32.exe appwiz.cpl`,NewLinkHere %A_WorkingDir%\
sWinTitleNewLinkW7  := "ahk_class NativeHWNDHost"
sWinTitleNewLinkW2k := "ahk_class #32770"
sTempFileName       := A_WorkingDir . "\" . A_Now . "_" . A_ScriptName . ".tmp"
sURL := Clipboard
;
; *** W2k
DlgUrlEdit  := "Edit1"
DlgUrlBut   := "Button3"
DlgFileEdit := "Edit1"
;DlgFileBut  := 	; *** using manual Enter!
; *** W7
if A_OSVersion in WIN_95,WIN_98,WIN_ME,WIN_NT4,WIN_2000,WIN_XP	; *** WIN_VISTA: unsupported by MS tool; Win_7: new syntax for MS tool
{
} else {
	FileAppend,, %sTempFileName%
	sRunCmd = rundll32.exe appwiz.cpl`,NewLinkHere %sTempFileName%
	DlgUrlEdit  := "Edit1"
	DlgUrlBut   := "Button1"
	DlgFileEdit := "Edit2"
	;DlgFileBut  := "Button2"	; *** using manual Enter!
}

Run, %sRunCmd%
Loop, 12
{
	Sleep, 300
	IfWinActive, %sWinTitleNewLinkW2k%	; *** Win2k
		Break
	IfWinActive, %sWinTitleNewLinkW7%	; *** Win7
		Break
}
IfWinNotActive, %sWinTitleNewLinkW7%
	IfWinNotActive, %sWinTitleNewLinkW2k%
		{	MsgBox, *** Error: `n`nWaiting for CreateLink-Window timed out.
			ExitApp
		}
ControlSetText, %DlgUrlEdit%, %sURL%
Sleep, 250	; *** let user get a quick look at the URL
ControlClick,   %DlgUrlBut%	; ControlSend,    %DlgUrlEdit%, {ENTER}
Sleep, 250	; *** time to display 2nd window (target file name)

sFileName := sURL	; %Clipboard%
{		; Clipboard = Internet or local URL
		; StringGetPos: zero-based, first char is #0
		; InStr()     :  One-based, first char is #1
	StringGetPos, iPos, sFileName, /, R
	if (iPos < 0)	; *** Clipboard = local path
	{
		StringGetPos, iPos, sFileName, \, R
	}
	; -----------
	if (iPos < 0)	; *** Clipboard = useless
	{
		Exit
	}
	if (iPos + 1 >= StrLen(sFileName))	; *** last char is separator/(back)slash, no filename found in clipboard
	{
		Exit
	} else {
		StringMid, sFileName, sFileName, iPos + 2	; *** start after found separator
	}
	; -----------
	if (InStr(sFileName, "?") > 1)	; *** remove trailing parameter from URL/filename
	{
		sFileName := (SubStr(sFileName, 1, InStr(sFileName, "?") - 1))
		iPos = -1
		Goto FnExtractDone
	}
	if (SubStr(sFileName, 1, 1) = "?")	; *** parameters first, filename in one of parameters (last?)
	{
		sFileName := SubStr(sFileName, 2)
		iPos = -1
		;
		if (iPos < 0)	; *** Clipboard = FN param in long URL
		{		; https://base.tld/redirect/?a=name&s=s&d=pa&f=file.exe
			StringGetPos, iPos, sFileName, f=, R
			if (iPos >= 0)
				iPos := iPos + 1	; *** "f=": skip 2 chars instead of 1
		}
		if (iPos < 0)	; *** Clipboard = FN param in long URL
		{		; https://base.tld/redirect/?a=name&s=s&d=pa&f=file.exe
			StringGetPos, iPos, sFileName, =, R
		}
	}
	; -----------
	if (iPos + 1 >= StrLen(sFileName))	; *** last char is separator, no filename found in clipboard
	{
		Exit
	} else {
		StringMid, sFileName, sFileName, iPos + 2	; *** start after found separator
	}
	if (InStr(sFileName, "&") > 1)	; *** cut additional trailing parameters
	{
		sFileName := SubStr(sFileName, 1, InStr(sFileName, "&") - 1)
	}
	if (InStr(sFileName, "?") > 0)	; *** remove trailing parameter from URL/filename
	{
		sFileName := (SubStr(sFileName, 1, InStr(sFileName, "?") - 1))
	}
}
FnExtractDone:

if (FileExist(sFileName . ".url"))
	sFileName := sFileName . "_from"

	;- wait for system to process the link and proceed to link file name
	;- check, if system proceeded to second window, asking for link file name;  if not: wait
Loop, 15
{	
	ControlGetText, sTmp, %DlgFileEdit%
	if sTmp!=%sURL%
		Break
	Sleep, 100
}
if sTmp=%sURL%
{	MsgBox, *** Error: `n`nFirst CreateLink window still active, aborting.
	Return	; Exit
}

ControlSetText, %DlgFileEdit%, %sFileName%	; ControlSendRaw, %DlgFileEdit%, %sFileName%
ControlSend   , %DlgFileEdit%, {END}	; let cursor jump to end, emulating real input behaviour
;

Back to AutoHotkey