AutoHotkey: Duplicate starter menu entry: Difference between revisions

From TotalcmdWiki
Jump to navigation Jump to search
(Update for TC 7.55 (and 7.50a), adjust to control names dynamically)
No edit summary
 
Line 1: Line 1:
<pre>
<pre>
; ////////////////////////////////////////////////////////////////////////////
; ////////////////////////////////////////////////////////////////////////////
; // TC_StartMenu_DuplicateEntry.ahk V2.0
; // TC_StartMenu_DuplicateEntry.ahk V2.1
; // (W) StatusQuo 2008-2010 for TC 7.02a (tested up to 7.04a, 7.50a and 7.55)
; // (W) StatusQuo 2008-2023 (tested in TC 7.04a .. TC 10.52)
; //
; //
; // Duplicates an entry in TC Start Menu or Directory Hotlist
; // Duplicates an entry in TC Start Menu or Directory Hotlist
Line 16: Line 16:
WinWait      , ahk_class %sClassMainWin%,  
WinWait      , ahk_class %sClassMainWin%,  
IfWinNotActive, ahk_class %sClassMainWin%,, WinActivate, ahk_class %sClassMainWin%,  
IfWinNotActive, ahk_class %sClassMainWin%,, WinActivate, ahk_class %sClassMainWin%,  
WinWaitActive , ahk_class %sClassMainWin%, ; main "Change Start Menu"
WinWaitActive , ahk_class %sClassMainWin%,
 
/*
* /
sTmpButtonList := ""
Loop, 9
{
; --- get button names
sTmpVar := "sTmpButNam" . a_index
ControlGetText, %sTmpVar%, TButton%a_index%
sTmpButtonList := sTmpButtonList . a_index . "=" . %sTmpVar% . "`n"
}
MsgBox, %sTmpButtonList%
ExitApp
/*
*/


DetectButtonNames() ; get current button names
DetectButtonNames() ; get current button names


ControlGetText, AltEdit4, TAltEdit4, ahk_class %sClassMainWin% ; TC 10.52: 3/2/1 => 4/3/2
ControlGetText, AltEdit3, TAltEdit3, ahk_class %sClassMainWin%
ControlGetText, AltEdit3, TAltEdit3, ahk_class %sClassMainWin%
ControlGetText, AltEdit2, TAltEdit2, ahk_class %sClassMainWin%
ControlGetText, AltEdit2, TAltEdit2, ahk_class %sClassMainWin%
Line 42: Line 28:
ControlGetText, Edit1,    TEdit1,    ahk_class %sClassMainWin% ; old TC 7.04a
ControlGetText, Edit1,    TEdit1,    ahk_class %sClassMainWin% ; old TC 7.04a
ControlGetText, V6Edit3,  Edit1,    ahk_class %sClassMainWin% ; old TC 6.56, replaces TAltEdit3; does not work properly!
ControlGetText, V6Edit3,  Edit1,    ahk_class %sClassMainWin% ; old TC 6.56, replaces TAltEdit3; does not work properly!
ControlGet,    CheckBox2, Checked,, TCheckBox2, ahk_class %sClassMainWin%, ; main window, "as symbol"
ControlGet,    CheckBox3, Checked,, TCheckBox3, ahk_class %sClassMainWin%, ; main window
ControlGet,    CheckBox1, Checked,, TCheckBox1, ahk_class %sClassMainWin%, ; main window, "fullscreen"
ControlGet,    CheckBox2, Checked,, TCheckBox2, ahk_class %sClassMainWin%, ; main window, "as symbol" TC  9.xx
ControlGet,    CheckBox1, Checked,, TCheckBox1, ahk_class %sClassMainWin%, ; main window, "fullscreen" TC  9.xx
ControlGet,    MyCheckBox3, Checked,, TMyCheckBox3, ahk_class %sClassMainWin%, ; main window, "as symbol"  TC 10.52
ControlGet,    MyCheckBox2, Checked,, TMyCheckBox2, ahk_class %sClassMainWin%, ; main window, "fullscreen" TC 10.52
ControlGet,    MyCheckBox1, Checked,, TMyCheckBox1, ahk_class %sClassMainWin%, ; main window
;TMyComboBox1 ; Shortcut key
;TMyComboBox1 ; Shortcut key
;TComboBox1 ; Shortcut key ; old TC 7.04a
;TComboBox1 ; Shortcut key ; old TC 7.04a


if (AltEdit3 . AltEdit2 . AltEdit1 <> "")
if (AltEdit4 . AltEdit3 . AltEdit2 . AltEdit1 <> "")
{
{
sText1 := AltEdit1
sText1 := AltEdit1
sText2 := AltEdit2
sText2 := AltEdit2
sText3 := AltEdit3
sText3 := AltEdit3
if ("" != AltEdit4) ; and ("?" != AltEdit1) ; *** TC 10.52
{
sText1 := AltEdit2
sText2 := AltEdit3
sText3 := AltEdit4
}
} else {
} else {
sText1 := Edit1
sText1 := Edit1
Line 61: Line 57:


; *** get title of entry + *** Auto-detect name of Edit control
; *** get title of entry + *** Auto-detect name of Edit control
ControlSend,  %varButTit%, {Space},     ahk_class %sClassMainWin%, ; Button "Change Title"
ControlSend,  %varButTit%, {Space},   ahk_class %sClassMainWin% ; Button "Change Title"
WinWaitActive,                           ahk_class %sClassDialog%, ; dialog  "Change Title"
WinWaitActive,                         ahk_class %sClassDialog% ; dialog  "Change Title"
ControlGetText, sMenuTitle, TAltEdit1, ahk_class %sClassDialog% ; get old title
ControlGetText, sMenuTitle, TAltEdit1, ahk_class %sClassDialog% ; get old title
if (sMenuTitle = "")
if (sMenuTitle = "")
{
{
ControlGetText, sMenuTitle, TEdit1, ahk_class %sClassDialog% ; get old title
ControlGetText, sMenuTitle, TEdit1, ahk_class %sClassDialog% ; get old title
sEditName0 := "TEdit1" ; TC 7.04a 0=add control
sEditName1 := "TEdit1" ; TC 7.04a
sEditName1 := "TEdit1" ; TC 7.04a
sEditName2 := "TEdit2" ; TC 7.04a
sEditName2 := "TEdit2" ; TC 7.04a
Line 73: Line 70:
sEditName3 := "Edit1" ; TC 6.51
sEditName3 := "Edit1" ; TC 6.51
} else {
} else {
sEditName0 := "TAltEdit1" ; TC 9.xx 0=add control
sEditName1 := "TAltEdit1"
sEditName1 := "TAltEdit1"
sEditName2 := "TAltEdit2"
sEditName2 := "TAltEdit2"
sEditName3 := "TAltEdit3"
sEditName3 := "TAltEdit3"
if ("" != AltEdit4) ; and ("?" != AltEdit1) ; *** TC 10.52
{
sEditName0 := "TAltEdit1" ; TC 10.52 0=add control
sEditName1 := "TAltEdit2"
sEditName2 := "TAltEdit3"
sEditName3 := "TAltEdit4"
}
}
}
; ControlSend,  TButton1, {Space},        ahk_class %sClassDialog%, ; Button "Cancel", close "Change Title" dialog
DetectTitleOkButton()
DetectTitleOkButton()
ControlSend,  %sOkButName%, {Space},    ahk_class %sClassDialog%, ; Button OK, close "Title" dialog
ControlSend,  %sOkButName%, {Space},    ahk_class %sClassDialog% ; Button OK, close "Title" dialog
WinWaitActive,                            ahk_class %sClassMainWin%, ; main hotlist editor window
WinWaitActive,                            ahk_class %sClassMainWin% ; main hotlist editor window


; *** sending {Space} to "Change title" button changes button names in Dir Hotlist (#1 gets "&>>" instead of "Help")
; *** sending {Space} to "Change title" button changes button names in Dir Hotlist (#1 gets "&>>" instead of "Help")
Line 88: Line 92:


; *** add new entry
; *** add new entry
ControlSend,  %varButAdd%, {Space},              ahk_class %sClassMainWin%, ; Button "Add Menu Entry"
ControlSend,  %varButAdd%, {Space},              ahk_class %sClassMainWin% ; Button "Add Menu Entry"
WinWaitActive,                                    ahk_class %sClassDialog%, ; dialog  "Change Title"
WinWaitActive,                                    ahk_class %sClassDialog% ; dialog  "Change Title"
ControlSetText, %sEditName1%, %sMenuTitle% [copy], ahk_class %sClassDialog% ; Title (TC7.04a:TEdit1, TC7.50a:TAltEdit1)
ControlSetText, %sEditName0%, %sMenuTitle% [copy], ahk_class %sClassDialog% ; Title (TC7.04a:TEdit1, TC7.50a:TAltEdit1)
DetectTitleOkButton()
DetectTitleOkButton()
ControlSend,  %sOkButName%, {Space},        ahk_class %sClassDialog%, ; Button OK, close "Title" dialog
ControlSend,  %sOkButName%, {Space},        ahk_class %sClassDialog% ; Button OK, close "Title" dialog
WinWaitActive,                                ahk_class %sClassMainWin%, ; main window
WinWaitActive,                                ahk_class %sClassMainWin% ; main window


; *** sending {Space} to "OK" button changes button names in Dir Hotlist (#1 gets "&>>" instead of "Help")
; *** sending {Space} to "OK" button changes button names in Dir Hotlist (#1 gets "&>>" instead of "Help")
Line 100: Line 104:
DetectButtonNames() ; get current button names
DetectButtonNames() ; get current button names


; *** fill stored values from source entry ; TC 7.04a uses just TEdit1+2 for dir hotlist
; *** fill stored values from source entry
ControlSetText, %sEditName3%, %sText3%, ahk_class %sClassMainWin%, ; main window ; TAltEdit3 / TEdit3
; if (sDialogType = "start") ; TC 7.04a uses just TEdit1+2 for dir hotlist
ControlSetText, %sEditName2%, %sText2%, ahk_class %sClassMainWin%, ; main window
; {
ControlSetText, %sEditName1%, %sText1%, ahk_class %sClassMainWin%, ; main window
ControlSetText, %sEditName3%, %sText3%, ahk_class %sClassMainWin% ; main window ; TAltEdit3 / TEdit3
; }
ControlSetText, %sEditName2%, %sText2%, ahk_class %sClassMainWin% ; main window
ControlSetText, %sEditName1%, %sText1%, ahk_class %sClassMainWin% ; main window
; if (sDialogType = "start")
; if (sDialogType = "start")
; {
; {
if CheckBox3 ; *** My3/2 in TC 10.52, 2/1 in TC 9.xx
Control, Check,,  TCheckBox3, ahk_class %sClassMainWin% ; main window
else
Control, UnCheck,, TCheckBox3, ahk_class %sClassMainWin% ; main window
if CheckBox2
if CheckBox2
Control, Check,,  TCheckBox2, ahk_class %sClassMainWin%, ; main window
Control, Check,,  TCheckBox2, ahk_class %sClassMainWin% ; main window
else
else
Control, UnCheck,, TCheckBox2, ahk_class %sClassMainWin%, ; main window
Control, UnCheck,, TCheckBox2, ahk_class %sClassMainWin% ; main window
if CheckBox1
if CheckBox1
Control, Check,,  TCheckBox1, ahk_class %sClassMainWin%, ; main window
Control, Check,,  TCheckBox1, ahk_class %sClassMainWin% ; main window
else
Control, UnCheck,, TCheckBox1, ahk_class %sClassMainWin% ; main window
;
if MyCheckBox3 ; *** My3/2 in TC 10.52, 2/1 in TC 9.xx
Control, Check,,  TMyCheckBox3, ahk_class %sClassMainWin% ; main window
else
Control, UnCheck,, TMyCheckBox3, ahk_class %sClassMainWin% ; main window
if MyCheckBox2
Control, Check,,  TMyCheckBox2, ahk_class %sClassMainWin% ; main window
else
Control, UnCheck,, TMyCheckBox2, ahk_class %sClassMainWin% ; main window
if MyCheckBox1
Control, Check,,  TMyCheckBox1, ahk_class %sClassMainWin% ; main window
else
else
Control, UnCheck,, TCheckBox1, ahk_class %sClassMainWin%, ; main window
Control, UnCheck,, TMyCheckBox1, ahk_class %sClassMainWin% ; main window


; *** set cursor to command value
; *** set cursor to command value
ControlFocus, %sEditName3%, ahk_class %sClassMainWin%, ; main window ; TAltEdit3
ControlFocus, %sEditName3%, ahk_class %sClassMainWin% ; main window ; TAltEdit3
ControlSend,  %sEditName3%, {HOME},
ControlSend,  %sEditName3%, {HOME}
; }
; }



Latest revision as of 03:35, 3 April 2023

	; ////////////////////////////////////////////////////////////////////////////
	; // TC_StartMenu_DuplicateEntry.ahk V2.1
	; // (W) StatusQuo 2008-2023 (tested in TC 7.04a .. TC 10.52)
	; //
	; // Duplicates an entry in TC Start Menu or Directory Hotlist
	; ////////////////////////////////////////////////////////////////////////////

#SingleInstance, Force

	; *** set window class names
sClassMainWin := "TUSERMENUCHANGE"
sClassDialog  := "TSTDTREEDLG"

	; *** wait for & activate window
WinWait       , ahk_class %sClassMainWin%, 
IfWinNotActive, ahk_class %sClassMainWin%,, WinActivate, ahk_class %sClassMainWin%, 
WinWaitActive , ahk_class %sClassMainWin%,

DetectButtonNames()	; get current button names

ControlGetText, AltEdit4, TAltEdit4, ahk_class %sClassMainWin%	; TC 10.52: 3/2/1 => 4/3/2
ControlGetText, AltEdit3, TAltEdit3, ahk_class %sClassMainWin%
ControlGetText, AltEdit2, TAltEdit2, ahk_class %sClassMainWin%
ControlGetText, AltEdit1, TAltEdit1, ahk_class %sClassMainWin%
ControlGetText, Edit3,    TEdit3,    ahk_class %sClassMainWin%	; old TC 7.04a
ControlGetText, Edit2,    TEdit2,    ahk_class %sClassMainWin%	; old TC 7.04a
ControlGetText, Edit1,    TEdit1,    ahk_class %sClassMainWin%	; old TC 7.04a
ControlGetText, V6Edit3,  Edit1,     ahk_class %sClassMainWin%	; old TC 6.56, replaces TAltEdit3; does not work properly!
ControlGet,     CheckBox3, Checked,, TCheckBox3, ahk_class %sClassMainWin%,	; main window
ControlGet,     CheckBox2, Checked,, TCheckBox2, ahk_class %sClassMainWin%,	; main window, "as symbol"  TC  9.xx
ControlGet,     CheckBox1, Checked,, TCheckBox1, ahk_class %sClassMainWin%,	; main window, "fullscreen" TC  9.xx
ControlGet,     MyCheckBox3, Checked,, TMyCheckBox3, ahk_class %sClassMainWin%,	; main window, "as symbol"  TC 10.52
ControlGet,     MyCheckBox2, Checked,, TMyCheckBox2, ahk_class %sClassMainWin%,	; main window, "fullscreen" TC 10.52
ControlGet,     MyCheckBox1, Checked,, TMyCheckBox1, ahk_class %sClassMainWin%,	; main window
;TMyComboBox1	; Shortcut key
;TComboBox1	; Shortcut key	; old TC 7.04a

if (AltEdit4 . AltEdit3 . AltEdit2 . AltEdit1 <> "")
{
	sText1 := AltEdit1
	sText2 := AltEdit2
	sText3 := AltEdit3
	if ("" != AltEdit4)	; and ("?" != AltEdit1)	; *** TC 10.52
	{
		sText1 := AltEdit2
		sText2 := AltEdit3
		sText3 := AltEdit4
	}
} else {
	sText1 := Edit1
	sText2 := Edit2
	sText3 := Edit3
	if (Edit3 = "")
		sText3 := V6Edit3
}

	; *** get title of entry + *** Auto-detect name of Edit control
ControlSend,   %varButTit%, {Space},   ahk_class %sClassMainWin%	; Button "Change Title"
WinWaitActive,                         ahk_class %sClassDialog%	; dialog  "Change Title"
ControlGetText, sMenuTitle, TAltEdit1, ahk_class %sClassDialog%	; get old title
if (sMenuTitle = "")
{
	ControlGetText, sMenuTitle, TEdit1, ahk_class %sClassDialog%	; get old title
	sEditName0 := "TEdit1"	; TC 7.04a 0=add control
	sEditName1 := "TEdit1"	; TC 7.04a
	sEditName2 := "TEdit2"	; TC 7.04a
	sEditName3 := "TEdit3"	; TC 7.04a
	if (Edit3 . AltEdit3 = "")
		sEditName3 := "Edit1"	; TC 6.51
} else {
	sEditName0 := "TAltEdit1"	; TC 9.xx 0=add control
	sEditName1 := "TAltEdit1"
	sEditName2 := "TAltEdit2"
	sEditName3 := "TAltEdit3"
	if ("" != AltEdit4)	; and ("?" != AltEdit1)	; *** TC 10.52
	{
		sEditName0 := "TAltEdit1"	; TC 10.52 0=add control
		sEditName1 := "TAltEdit2"
		sEditName2 := "TAltEdit3"
		sEditName3 := "TAltEdit4"
	}
}
DetectTitleOkButton()
ControlSend,   %sOkButName%, {Space},     ahk_class %sClassDialog%	; Button OK, close "Title" dialog
WinWaitActive,                            ahk_class %sClassMainWin%	; main hotlist editor window

	; *** sending {Space} to "Change title" button changes button names in Dir Hotlist (#1 gets "&>>" instead of "Help")
	; *** ControlClick instead of {Space} leaves button names unchanged
	; *** => redetect button names here
DetectButtonNames()	; get current button names

	; *** add new entry
ControlSend,   %varButAdd%, {Space},               ahk_class %sClassMainWin%	; Button "Add Menu Entry"
WinWaitActive,                                     ahk_class %sClassDialog%	; dialog  "Change Title"
ControlSetText, %sEditName0%, %sMenuTitle% [copy], ahk_class %sClassDialog%	; Title (TC7.04a:TEdit1, TC7.50a:TAltEdit1)
DetectTitleOkButton()
ControlSend,   %sOkButName%, {Space},         ahk_class %sClassDialog%	; Button OK, close "Title" dialog
WinWaitActive,                                ahk_class %sClassMainWin%	; main window

	; *** sending {Space} to "OK" button changes button names in Dir Hotlist (#1 gets "&>>" instead of "Help")
	; *** ControlClick does the same here
	; *** => redetect button names!
DetectButtonNames()	; get current button names

	; *** fill stored values from source entry
; if (sDialogType = "start")	; TC 7.04a uses just TEdit1+2 for dir hotlist
; {
	ControlSetText, %sEditName3%, %sText3%, ahk_class %sClassMainWin%	; main window	; TAltEdit3 / TEdit3
; }
ControlSetText, %sEditName2%, %sText2%, ahk_class %sClassMainWin%	; main window
ControlSetText, %sEditName1%, %sText1%, ahk_class %sClassMainWin%	; main window
; if (sDialogType = "start")
; {
	if CheckBox3 ; *** My3/2 in TC 10.52, 2/1 in TC 9.xx
		Control, Check,,   TCheckBox3, ahk_class %sClassMainWin%	; main window
	else
		Control, UnCheck,, TCheckBox3, ahk_class %sClassMainWin%	; main window
	if CheckBox2
		Control, Check,,   TCheckBox2, ahk_class %sClassMainWin%	; main window
	else
		Control, UnCheck,, TCheckBox2, ahk_class %sClassMainWin%	; main window
	if CheckBox1
		Control, Check,,   TCheckBox1, ahk_class %sClassMainWin%	; main window
	else
		Control, UnCheck,, TCheckBox1, ahk_class %sClassMainWin%	; main window
	;
	if MyCheckBox3 ; *** My3/2 in TC 10.52, 2/1 in TC 9.xx
		Control, Check,,   TMyCheckBox3, ahk_class %sClassMainWin%	; main window
	else
		Control, UnCheck,, TMyCheckBox3, ahk_class %sClassMainWin%	; main window
	if MyCheckBox2
		Control, Check,,   TMyCheckBox2, ahk_class %sClassMainWin%	; main window
	else
		Control, UnCheck,, TMyCheckBox2, ahk_class %sClassMainWin%	; main window
	if MyCheckBox1
		Control, Check,,   TMyCheckBox1, ahk_class %sClassMainWin%	; main window
	else
		Control, UnCheck,, TMyCheckBox1, ahk_class %sClassMainWin%	; main window

		; *** set cursor to command value
	ControlFocus, %sEditName3%, ahk_class %sClassMainWin%	; main window	; TAltEdit3
	ControlSend,  %sEditName3%, {HOME}
; }

Return

; *****************************************************************************************************

DetectButtonNames()
{
	global
	ControlGetTExt, sButNam1, TButton1
	if (sButNam1="&>>")
	{
			; *** Starter menu (and Dir Hotlist after "Change Title" in TC 7.50a/7.55, using ControlClick or sending {Space})
		varButAdd := "TButton8"	;;* 8=&Add Item...
		varButSub := "TButton7"	;;* 7=Add s&ubmenu...
		varButDel := "TButton6"	;;* 6=&Delete Item
		varButTit := "TButton5"	;;* 5=Change &Title
		varButOK  := "TButton4"	;;* 4=OK
		varButCan := "TButton3"	;;* 3=Cancel
										;;* 2=Help
										;;* 1=&>>
	} else {
			; *** Dir Hotlist
		varButAdd := "TButton7"	;;* 7=&Add Item...
		varButSub := "TButton6"	;;* 6=Add s&ubmenu...
		varButDel := "TButton5"	;;* 5=&Delete Item
		varButTit := "TButton4"	;;* 4=Change &Title
		varButOK  := "TButton3"	;;* 3=OK
		varButCan := "TButton2"	;;* 2=Cancel
										;;* 1=Help
	}
}

DetectTitleOkButton()
{
		; *** Autodetect name of OK-button in dialog "Add Item"; 
	global
	Loop, 3
	{
		ControlGetText, sTmp, TButton%a_index%	
		if (sTmp="OK")
		{
			sOkButName=TButton%a_index%	
			Break
		}
	}
	if (sOkButName="")
	{
		MsgBox, Error: Version/Language autodetect failed (adding title), stopping script.
		ExitApp
	}
}

Back to AutoHotkey