剪贴板增强---Kawvin增强剪贴板_V2.0

时间:2021-07-05 19:16:01
#Persistent
SetWorkingDir,%A_ScriptDir% ;设置工作目录
#MaxThreadsPerHotkey ;最大热键数量
#NoEnv
;#Warn
#SingleInstance force ;单脚本运行
#WinActivateForce ;强制激活窗体
Process Priority,,High ;线程,主,高级
CoordMode, Mouse ;鼠标相对于屏幕
AutoTrim,on ;自动省略首尾的空格和Tab
SetBatchLines - ;让脚本无休眠地执行(换句话说,也就是让脚本全速运行)
ComObjError() ;禁用 COM 错误通告
Menu, Tray, UseErrorLevel ;阻止显示对话框和终止线程
; #NoTrayIcon Label_DefVar:
global MyAppVer:="Kawvin增强剪贴板v2.0(Q285781427)"
global MyClipBoard_ini:= "MyClipBoard.ini" global All_Modes:="一次复制多次粘贴|多次复制一次粘贴|同时使用2个剪贴板|临时记事本|禁用"
global Sel_Mode:= ;当前模式
global EnableSound:= ;启用声音
global CopyHotKey:= ;复制热键
global PasteHotKey:= ;粘贴热键
global BackHotKey:= ;多次向前
global PrevHotKey:= ;多次向后
global MenuHotKey:= ;菜单热键
global ListWinHotKey:= ;列表窗体热键
global LCopyHotKey:= ;用于显示-复制热键
global LPasteHotKey:= ;用于显示-粘贴热键
global LBackHotKey:= ;用于显示-多次向前
global LPrevHotKey:= ;用于显示-多次向后
global LMenuHotKey:= ;用于显示-菜单热键
global LListWinHotKey:= ;用于显示-列表窗体热键 global MyClipMenu:= ;定义剪贴板菜单
global CurWin_Title:= ;当前鼠标下的窗体标题 global MyUseTongPei := ;设置是否启用通配符
global MyPasteLine := ;定义目前将要粘贴的行数
global MyClipArray:={} ;定义剪贴板历史记录
global MyMaxID:= ;最大序号
global MySel:= ;定义临时存放变量
global MySelRich:= ;定义临时存放变量
global MyAutoEnter := ;定义是否自动回车
global MyFirText:= ;第一剪贴板内容
global MySecText:= ;第二剪贴板内容
global MyWS:= ;位数
global MyStart:= ;起始序号
global MyEnd:= ;终止序号
global MySpace:= ;间距 Label_Start:
iniRead,Sel_Mode,%MyClipBoard_ini%,通用设置,当前模式
iniRead,EnableSound,%MyClipBoard_ini%,通用设置,启用声音
iniRead,CopyHotKey,%MyClipBoard_ini%,通用设置,复制热键
iniRead,PasteHotKey,%MyClipBoard_ini%,通用设置,粘贴热键
iniRead,BackHotKey,%MyClipBoard_ini%,通用设置,多次向前
iniRead,PrevHotKey,%MyClipBoard_ini%,通用设置,多次向后
iniRead,MenuHotKey,%MyClipBoard_ini%,通用设置,菜单热键
iniRead,ListWinHotKey,%MyClipBoard_ini%,通用设置,窗体热键 ;替换热键到正常键
LCopyHotKey:=MyFun_RetrunKeys(CopyHotKey)
LPasteHotKey:=MyFun_RetrunKeys(PasteHotKey)
LBackHotKey:=MyFun_RetrunKeys(BackHotKey)
LPrevHotKey:=MyFun_RetrunKeys(PrevHotKey)
LMenuHotKey:=MyFun_RetrunKeys(MenuHotKey)
LListWinHotKey:=MyFun_RetrunKeys(ListWinHotKey)
SkSub_CreatTrayMenu() Label_RegHotKey:
CopyHotKey=$%CopyHotKey%
PasteHotKey=$%PasteHotKey%
BackHotKey=$%BackHotKey%
PrevHotKey=$%PrevHotKey%
MenuHotKey=$%MenuHotKey%
ListWinHotKey=$%ListWinHotKey%
if (Sel_Mode!="禁用")
{
hotkey,%CopyHotKey%,Label_Copy
hotkey,%PasteHotKey%,Label_Paste
hotkey,%BackHotKey%,Label_PasteBack
hotkey,%PrevHotKey%,Label_PastePrev
hotkey,%MenuHotKey%,TrayHandle_ShowMyClipArrayMenu
hotkey,%ListWinHotKey%,TrayHandle_ShowListWin
} Label_DrawGUI:
gui Destroy
if Sel_Mode=一次复制多次粘贴
{
gui Main:+AlwaysOnTop
Gui Font, w700 cRed
Gui, Add, Text, x10 y5 h20 , 复制/添加:%LCopyHotKey%,1次粘贴:%LPasteHotKey%,②多次向:前%LBackHotKey%/后%LPrevHotKey%
Gui Font
Gui, Add, Edit, vMyFirText x12 y22 w360 h330 ,
Gui Font, w700 cRed
Gui, Add, CheckBox, Checked vMyAutoEnter gLabel_AutoEnter x230 y360 w210 h20 , 粘贴后自动回车
Gui Font
Gui, Add, Button, gLabel_GetData x20 y360 w80 h35 , ①数据确认
Gui, Add, Button, gLabel_Clear x102 y360 w80 h35 , 清空重置
Gui Font, s10 w700 cRed
gui,Add,Text,x195 y382 h20,当前模式:%Sel_Mode%
Gui Font
Gui, Show, x127 y87 h402 w385, %MyAppVer%
}
if Sel_Mode=多次复制一次粘贴
{
gui Main:+AlwaysOnTop
Gui Font, w700 cRed
Gui, Add, Text, x10 y5 h20 ,复制/添加:%LCopyHotKey%,粘贴:%LPasteHotKey%
Gui Font
Gui, Add, Edit, vMyFirText x12 y22 w360 h330 ,
Gui Font, w700 cRed
Gui, Add, CheckBox, Checked vMyAutoEnter gLabel_AutoEnter x230 y360 w210 h20 , 粘贴后自动回车
Gui Font
;Gui, Add, Button, gLabel_GetData x20 y360 w80 h35 , 数据确认
Gui, Add, Button, gLabel_Clear x102 y360 w80 h35 , 清空重置
Gui Font, s10 w700 cRed
gui,Add,Text,x195 y382 h20,当前模式:%Sel_Mode%
Gui Font
Gui, Show, x127 y87 h402 w385, %MyAppVer%
}
if Sel_Mode=同时使用2个剪贴板
{
gui Main:+AlwaysOnTop
Gui Font, w700 cRed
Gui, Add, Text, x10 y5 h20 , 第1剪切板(复制:Alt+F11,粘贴:%LBackHotKey%)
Gui Font
Gui, Add, Edit, vMyFirText x12 y22 w360 h185 ,
Gui Font, w700 cRed
Gui, Add, Text, x12 y213 h20 , 第2剪切板(复制:Alt+F12,粘贴:%LPrevHotKey%)
Gui, Add, CheckBox, vMyUseTongPei gLabel_EnabledTongPei x273 y210 w120 h20 , 启用通配符(*)
Gui Font
Gui, Add, Edit, vMySecText x12 y230 w360 h90 ,
Gui, Add, Text, x12 y334 w30 h20 , 位数
Gui, Add, Edit, vMyWS x38 y330 w50 h20 ,
Gui, Add, UpDown, range1- x82 y330 w20 h20 ,
Gui, Add, Text, x108 y334 w30 h20 , 起始
Gui, Add, Edit, vMyStart x134 y330 w50 h20 ,
Gui, Add, UpDown, range1- x162 y330 w20 h20 ,
Gui, Add, Text, x204 y334 w30 h20 , 终止
Gui, Add, Edit, vMyEnd x230 y330 w50 h20 ,
Gui, Add, UpDown, range1- x212 y330 w20 h20 ,
Gui, Add, Text, x295 y334 w30 h20 , 间距
Gui, Add, Edit, vMySpace x322 y330 w50 h20 ,
Gui, Add, UpDown, range1- x352 y330 w20 h20 ,
Gui Font, w700 cRed
Gui, Add, CheckBox, Checked vMyAutoEnter gLabel_AutoEnter x230 y360 w210 h20 , 粘贴后自动回车
Gui Font
;Gui, Add, Button, gLabel_GetData x20 y360 w80 h35 , 数据确认
Gui, Add, Button, gLabel_Clear x102 y360 w80 h35 , 清空重置
Gui Font, s10 w700 cRed
gui,Add,Text,x195 y382 h20,当前模式:%Sel_Mode%
Gui Font
Gui, Show, x127 y87 h402 w385, %MyAppVer%
}
if Sel_Mode=临时记事本
{
gui Main:+AlwaysOnTop
Gui Font, w700 cRed
Gui, Add, Text, x10 y5 h20 , 复制/添加:%LCopyHotKey%,1次粘贴:%LPasteHotKey%,②多次向:前%LBackHotKey%/后%LPrevHotKey%
Gui Font
Gui, Add, Edit, vMyFirText x12 y22 w360 h330 ,
Gui Font, w700 cRed
Gui, Add, CheckBox, Checked vMyAutoEnter gLabel_AutoEnter x230 y360 w210 h20 , 粘贴后自动回车
Gui Font
Gui, Add, Button, gLabel_GetData x20 y360 w80 h35 , ①数据确认
Gui, Add, Button, gLabel_Clear x102 y360 w80 h35 , 清空重置
Gui Font, s10 w700 cRed
gui,Add,Text,x195 y382 h20,当前模式:%Sel_Mode%
Gui Font
Gui, Show, x127 y87 h402 w385, %MyAppVer%
}
WinGet, MyID, ID, A ; 获取 窗体ID.
WinGetPos,,, MyWindowWidth, MyWindowHeight, A ;---- 放置屏幕键盘在屏幕的底部(考虑到任务栏的位置):
SysGet, MyWorkArea, MonitorWorkArea, %MyMonitor% ; 计算用户窗体X坐标:
MyWindowX = %MyWorkAreaRight%
MyWindowX -= %MyWorkAreaLeft% ; 现在 MyWindowX 包含了显示器的宽度.
MyWindowX -= %MyWindowWidth%
MyWindowX += %MyWorkAreaWidth% ; 计算水平靠右的位置.
; 以下操作是为了防止窗体不是主显示器,或者任务栏停靠在屏幕左侧:
MyWindowX += %MyWorkAreaLeft% ; 计算用户窗体Y坐标:
MyWindowY = %MyWorkAreaBottom%
MyWindowY -= %MyWindowHeight% WinMove, A,, %MyWindowX%, %MyWindowY%
WinSet, AlwaysOnTop, On, ahMyid %MyID%
;WinSet, TransColor, %TransColor% , ahMyid %MyID%
return ;=========================
;我的过程
SkSub_CreatTrayMenu()
{
Menu,Tray,DeleteAll
Menu, Tray, NoStandard ;自定义菜单放在标准菜单上面
iniRead,Sel_Mode,%MyClipBoard_ini%,通用设置,当前模式
if Sel_Mode=禁用
menu,tray,icon,ICONS\KCx.ico
else
menu,tray,icon,ICONS\KC.ico
loop,parse,All_Modes,`|
{
if A_LoopField!=
{
Menu, tray, add,%A_LoopField%,TrayHandle_ModeChange
if (A_LoopField=Sel_Mode)
menu,tray,Check ,%A_LoopField%
}
}
Menu,tray, add ; 分隔符
menu,tray,add,清空剪贴板,TrayHandle_ClearCllipBoard
Menu, tray, add ,剪贴板序列菜单,TrayHandle_ShowMyClipArrayMenu
Menu, tray, add ,显示剪贴板列表窗体,TrayHandle_ShowListWin
Menu, tray, add ; 分隔符
Menu,tray, add,参数设置,TrayHandle_EditSetting
Menu,tray, add ; 分隔符
Menu, tray, add ,退出,TrayHandle_Exit
Menu, Tray, Default, 剪贴板序列菜单
Menu, Tray, Click,
}
return SkSub_CreatMyClipArrayMenu()
{
if MyClipArray.Length()<=
return
Menu,MyClipMenu,DeleteAll
loop % MyClipArray.Length()
{
MyClipItem:=
if strlen(MyClipArray[A_Index])>
{
MyClipItem:=substr(MyClipArray[A_Index],,) . "......"
} else {
MyClipItem:=% MyClipArray[A_Index]
}
menu,MyClipMenu,add,%MyClipItem%,MenuHandle_SetMenuItemToClipBoard
menu,MyClipMenu,Icon,%MyClipItem%,ICONS\%A_Index%.ico
}
menu,MyClipMenu,add
menu,MyClipMenu,add,清空历史记录,MenuHandle_ClearMenuItem
;Menu, MyClipMenu, Show
}
return TrayHandle_ShowMyClipArrayMenu:
{
;MouseGetPos,Menu_X, Menu_Y
MouseGetPos,,,CurWin_id ;当前鼠标下的进程ID
WinGet, CurWin_Fullpath,ProcessPath,Ahk_ID %CurWin_id% ;当前进程的路径
WinGetTitle, CurWin_Title,Ahk_ID %CurWin_id% ;当前进程的标题
Menu, MyClipMenu, Show
}
return MenuHandle_SetMenuItemToClipBoard:
MyPasteLine:=A_ThisMenuItemPos
ClipBoard:=MyClipArray[MyPasteLine]
ClipWait,0.5
send,^{vk56}
return MenuHandle_ClearMenuItem:
MyClipArray:={}
Clipboard:=
Menu,MyClipMenu,DeleteAll
return TrayHandle_ShowListWin:
gosub ,Label_GetData
GuiControlGet,MyFirText,,MyFirText
MouseGetPos,,,CurWin_id ;当前鼠标下的进程ID
WinGet, CurWin_Fullpath,ProcessPath,Ahk_ID %CurWin_id% ;当前进程的路径
WinGetTitle, CurWin_Title,Ahk_ID %CurWin_id% ;当前进程的标题
Gui MyListWin:New
Gui MyListWin:+AlwaysOnTop
Gui MyListWin:Font, s12
Gui MyListWin:Add,Text, x5 y13 h21,指定的程序:
Gui,MyListWin:Add, DropDownList,x100 y10 w300 vactivewindow,
Gui MyListWin:Add,Button,x405 y9 w70 gMySub_RefreshList,刷新
MySub_RefreshList()
MyListItems:=
if MyClipArray.Length()=
return
loop % MyClipArray.Length()
{
if (A_Index=)
MyListItems:=MyClipArray[A_Index]
else
MyListItems:=MyListItems . "|" . MyClipArray[A_Index]
} Gui MyListWin:Add,ListBox, x5 w470 h465 vMyListItem gMySub_PastMyListItem, %MyListItems%
Gui MyListWin:Font
Gui MyListWin:Show, w480 h500, 剪贴板列表
return TrayHandle_ClearCllipBoard:
Clipboard:=
return TrayHandle_ModeChange:
Sel_Mode:=A_ThisMenuItem
iniwrite,%Sel_Mode%,%MyClipBoard_ini%,通用设置,当前模式
Reload
return TrayHandle_EditSetting:
;gui Destroy
gui MySetWin:New
;Gui MySetWin:+OwnerMain
gui MySetWin:+AlwaysOnTop
Gui MySetWin:Font, s12
Gui MySetWin:Add, GroupBox, x11 y6 w315 h185, 热键指定:通用
Gui MySetWin:Font
Gui MySetWin:Font, s11
Gui MySetWin:Add, Text, x25 y35 w105 h23 +0x200 Right, 复制:
Gui MySetWin:Add, Edit, x145 y35 w165 h21
Gui MySetWin:Add, Text, x25 y65 w105 h23 +0x200 Right, 一次性粘贴:
Gui MySetWin:Add, Edit, x145 y65 w165 h21
Gui MySetWin:Add, Text, x25 y95 w105 h23 +0x200 Right, 向前粘贴:
Gui MySetWin:Add, Edit, x145 y95 w165 h21
Gui MySetWin:Add, Text, x25 y125 w105 h23 +0x200 Right, 向后粘贴:
Gui MySetWin:Add, Edit, x145 y125 w165 h21
Gui MySetWin:Add, Text, x25 y155 w105 h23 +0x200 Right, 弹出菜单:
Gui MySetWin:Add, Edit, x145 y155 w165 h21
Gui MySetWin:Add, Button, x65 y205 w75 h30, 确认
Gui MySetWin:Add, Button, gWinSetButtonCancel x200 y205 w75 h30, 取消
Gui MySetWin:Font
Gui MySetWin:Show, w340 h250, 参数设置
return MySub_RefreshList()
{
droplist:=
GuiControl,MyListWin:,activewindow,|
WinGet, id, list,,, Program Manager
Loop, %id%
{
this_id := id%A_Index%
WinGetTitle, this_title, ahk_id %this_id%
if this_title=
continue
if (this_title=CurWin_Title)
droplist=%droplist%%this_title%||
else
droplist=%droplist%%this_title%|
}
GuiControl,MyListWin:,activewindow, %droplist%
;Gui, MyListWin:Add, DropDownList,x100 y5 w370 vactivewindow, %droplist%
} MySub_PastMyListItem()
{
GuiControlget,activewindow,MyListWin:
;MsgBox % activewindow
if A_GuiEvent =DoubleClick
{
ClipBoard:=MyClipArray[A_EventInfo]
sleep
;WinWaitActive, %CurWin_Title% ,,
WinActivate, %activewindow%
send,^{vk56}
}
} WinSetButtonCancel:
{
Gui MySetWin:Destroy
return
} MySetWin确认:
{
Gui MySetWin:Destroy
return
} Label_Copy:
if (Sel_Mode="一次复制多次粘贴" or Sel_Mode="多次复制一次粘贴" or Sel_Mode="临时记事本")
{
Clipboard =
Send, ^{vk43}
ClipWait,0.5
if ( ErrorLevel ) ;如果没有选择到什么东西,则退出
Return
if MyFirText=
MyFirText=%Clipboard%
else
MyFirText=%MyFirText%`n%Clipboard%
Clipboard =
GuiControl,,MyFirText,%MyFirText%
}
return Label_Paste:
Critical, On
GuiControlget, MyAutoEnter
GuiControlget, MyFirText
if (Sel_Mode="一次复制多次粘贴" or Sel_Mode="多次复制一次粘贴" or Sel_Mode="临时记事本")
{
if MyFirText=
return
else
{
if MyClipArray.Length()=
Clipboard:=MyFirText
sleep
if (MyAutoEnter=) ;如果自动回车
{
send,^{vk56}
send,{Enter}
} else {
send,^{vk56}
}
Clipboard:=
}
}
return !F11::
Critical, On
if Sel_Mode=同时使用2个剪贴板
{
GuiControl,,MyFirText,
Clipboard =
Send, ^{vk43}
ClipWait,0.5
if ( ErrorLevel ) ;如果没有选择到什么东西,则退出
Return
GuiControl,,MyFirText,%Clipboard%
Clipboard =
}
return !F12::
Critical, On
if Sel_Mode=同时使用2个剪贴板
{
GuiControl,,MySecText,
Clipboard =
Send, ^{vk43}
ClipWait,0.5
if ( ErrorLevel ) ;如果没有选择到什么东西,则退出
Return
GuiControl,,MySecText,%Clipboard%
Clipboard =
}
return Label_PasteBack:
Critical, On
GuiControlget, MyAutoEnter
if (Sel_Mode="一次复制多次粘贴" or Sel_Mode="临时记事本")
{
if (MyPasteLine=-) ;粘贴行数-1时,退出
Return
MyPasteLine -=
if (MyPasteLine <) ;粘贴行数大于最大行数,不粘贴
{
MyPasteLine:=
return
}
Clipboard:=MyClipArray[MyPasteLine]
sleep
if (MyAutoEnter=) ;如果自动回车
{
send,^{vk56}
send,{Enter}
} else {
send,^{vk56}
}
Clipboard:=
}
if (Sel_Mode="同时使用2个剪贴板")
{
GuiControlGet, MyFirText
if MyFirText=
return
else
{
Clipboard:=MyFirText
sleep
if (MyAutoEnter=) ;如果自动回车
{
send,^{vk56}
send,{Enter}
} else {
send,^{vk56}
}
Clipboard:=
}
}
return Label_PastePrev:
Critical, On
GuiControlget, MyAutoEnter
if (Sel_Mode="一次复制多次粘贴" or Sel_Mode="临时记事本")
{
if (MyPasteLine=-) ;粘贴行数-1时,退出
Return
MyPasteLine +=
if (MyPasteLine > MyMaxID) ;粘贴行数大于最大行数,不粘贴
{
MyPasteLine:=MyMaxID+
return
}
Clipboard:=MyClipArray[MyPasteLine]
sleep
if (MyAutoEnter=) ;如果自动回车
{
send,^{vk56}
send,{Enter}
} else {
send,^{vk56}
}
Clipboard:=
}
if (Sel_Mode="同时使用2个剪贴板")
{
GuiControlGet, MySecText
GuiControlGet, MyWS
GuiControlGet, MyStart
GuiControlGet, MyEnd
GuiControlGet, MySpace
GuiControlGet, MyUseTongPei
if MySecText= ;第二剪贴板为空,退出
Return
if (MyUseTongPei=) ;不启用通配符
{
Clipboard:=MySecText
sleep
if (MyAutoEnter=) ;如果自动回车
{
send,^{vk56}
send,{Enter}
} else {
send,^{vk56}
}
Clipboard:=
}
if (MyUseTongPei=) ;启用通配符
{
if (MyStart<MyEnd+) ;如果起始值小于终止值
{
MyTemStr:=MySecText
;MyPiPei:=MyFun_MakeN0(MyStart,MyWS)
MyPiPei:=substr("" . MyStart,-MyWS)
stringreplace,MyTemStr,MyTemStr,(*),%MyPiPei%,all
MyStart:=MyStart+MySpace
GuiControl,,MyStart,%MyStart%
Clipboard:=MyTemStr
sleep
if (MyAutoEnter=) ;如果自动回车
{
send,^{vk56}
send,{Enter}
} else {
send,^{vk56}
}
Clipboard:=
}
}
}
return ; 粘贴后自动回车
Label_AutoEnter:
{
if (MyAutoEnter=)
MyAutoEnter:=
else
MyAutoEnter:=
return
} ; 清空重置
Label_Clear:
{
MyPasteLine:=-
MyClipArray:={}
MyMaxID:=
MyFirText:=
MySecText:=
MyWS:=
MyStart:=
MyEnd:=
MySpace:=
GuiControl,,MyFirText,
GuiControl,,MySecText,
GuiControl,,MyWS,
GuiControl,,MyStart,
GuiControl,,MyEnd,
GuiControl,,MySpace,
;清空菜单
Clipboard:=
Menu,MyClipMenu,DeleteAll
Return
} ; 获取数据
Label_GetData:
{
GuiControlGet, MyFirText
MyClipArray:={}
if (Sel_Mode="一次复制多次粘贴" or Sel_Mode="临时记事本")
{
;读取内容到数组
loop,parse,MyFirText,`n`|,`r
{
TemStr:=A_LoopField
if (TemStr="")
continue
MyClipArray.push(Temstr)
}
MyMaxID:=MyClipArray.Length()
MyPasteLine:=
}
;创建菜单
SkSub_CreatMyClipArrayMenu()
return
} ; 启用通配符
Label_EnabledTongPei:
{
if (MyUseTongPei =)
{
MyUseTongPei :=
GuiControlGet,MySecText,,MySecText
GuiControl,,MySecText,%MySecText%(*)
}else {
MyUseTongPei :=
GuiControlGet,MySecText,,MySecText
StringReplace,MySecText,MySecText,(*),,All
GuiControl,,MySecText,%MySecText%
}
return
} MyFun_RetrunKeys(HotKeyString)
{
StringReplace,HotKeyString,HotKeyString,`+,Shift`+,All
StringReplace,HotKeyString,HotKeyString,`!,Alt`+,All
StringReplace,HotKeyString,HotKeyString,`^,Ctrl`+,All
StringReplace,HotKeyString,HotKeyString,`#,Win`+,All
return , % HotKeyString
} GuiClose:
TrayHandle_Exit:
ExitApp