暗夜如歌 15:20:03
求助:AHK能否实现这样的功能?在任意程序的文本框中,选中一段字符,输入定义好的快捷键,就能将选中字符中的字母全部转换成【大写 / 小写 / 首字母大写】
/*
AutoHotkey 版本: 1.1.24.04
操作系统: Windows XP/Vista/7
作者: sunwind <[email protected]>
博客: http://blog.csdn.net/liuyukuan/
脚本说明:此为脚本用于大小写转换
脚本版本: 2017年1月17日版
Timestamp:2017年1月17日15:37:31
使用方法:选中文本按热键即可
;~ win+x转换为全部小写
;~ win+z转换为全部大写
;~ win+c转换为首字母大写
*/
#z::
clipboard = ; 清空剪贴板
Send, ^c
ClipWait, 2
if ErrorLevel
{
MsgBox, The attempt to copy text onto the clipboard failed.
return
}
str= %clipboard%
clipboard:=StringUpper(str)
Send ^v
return
#x::
clipboard = ; 清空剪贴板
Send, ^c
ClipWait, 2
if ErrorLevel
{
MsgBox, The attempt to copy text onto the clipboard failed.
return
}
str= %clipboard%
clipboard:=StringLower(str)
Send ^v
return
#c::
clipboard = ; 清空剪贴板
Send, ^c
ClipWait, 2
if ErrorLevel
{
MsgBox, The attempt to copy text onto the clipboard failed.
return
}
str= %clipboard%
clipboard:=StringUpper(str,"T")
Send ^v
return
StringLower(ByRef InputVar, T = "")
{
StringLower, InputVar, InputVar, %T%
return InputVar
}
StringUpper(ByRef InputVar, T = "")
{
StringUpper, InputVar, InputVar, %T%
return InputVar
}
;~ StringUpper 第三个参数 T
;~ 如果此参数为字母 T, 那么字符串会被转换为标题格式. 例如, "GONE with the WIND" 会被转换成 "Gone With The Wind".
更简单的是tmplinsh实现的代码,增加剪贴板恢复功能。
f7::SwitchSelCase("L") ; 选中文字切换为小写
f8::SwitchSelCase("U") ; 选中文字切换为大写
f9::SwitchSelCase("T") ; 选中文字切换为首字母大写
; 功能: 切换选中文字大小写
; 参数: Mode - 可以为 L (小写)、U (大写)、T (首字母大写)
;~ 兼容autohotkey 2.0
SwitchSelCase(Mode) {
clipBak := ClipboardAll ; 备份剪贴板
Clipboard := "" ; 清空剪贴板
Send, ^c ; 发送 ctrl+c 复制选中文字
ClipWait, 1 ; 等待复制完毕
selText := Clipboard
if (selText != "") {
Clipboard := ""
Clipboard := Format("{:" Mode "}", selText)
ClipWait, 1
Send, ^v
Sleep, 500 ; 防止没有粘贴完毕剪贴板就被恢复了
}
Clipboard := clipBak ; 恢复剪贴板
}
windows_vista 这种连字符分隔的能否支持?
答:升级版如下
;tmplinshi
; 功能: 切换选中文字大小写
; 参数: Mode - 可以为 L (小写)、U (大写)、T (首字母大写)
;~ 兼容autohotkey 2.0
;sunwind
;~ http://blog.csdn.net/liuyukuan/article/details/54584035
;~ 增加连字符支持windows-vista
f7::SwitchSelCase("L") ; 选中文字切换为小写
f8::SwitchSelCase("U") ; 选中文字切换为大写
f9::SwitchSelCase("T") ; 选中文字切换为首字母大写
f10::
param=%1%
SwitchSelCase(param)
return
SwitchSelCase(Mode) {
clipBak := ClipboardAll ; 备份剪贴板
Clipboard := "" ; 清空剪贴板
Send, ^c ; 发送 ctrl+c 复制选中文字
ClipWait, 1 ; 等待复制完毕
selText := Clipboard
Loop, Parse, selText, %A_Space%_`,|;-!`.
{
; 计算在这个字段末尾分隔符的位置.
Position += StrLen(A_LoopField) + 1
; 获取解析循环中找到的分隔符.
Delimiter := SubStr(selText, Position, 1)
str1:= Format("{:" Mode "}", A_LoopField)
out:=out . str1 . Delimiter
}
Clipboard :=out
ClipWait, 1
Send, ^v
Sleep, 500 ; 防止没有粘贴完毕剪贴板就被恢复了
Clipboard := clipBak ; 恢复剪贴板
}
答:编译成exe调用可能是最简单,需要把不同功能分成单独脚本,去掉热键。如下所示。编译成exe 支持传参调用 后面加L或U或T来调用
param=%1%
SwitchSelCase(param)
return
SwitchSelCase(Mode) {
clipBak := ClipboardAll ; 备份剪贴板
Clipboard := "" ; 清空剪贴板
Send, ^c ; 发送 ctrl+c 复制选中文字
ClipWait, 1 ; 等待复制完毕
selText := Clipboard
Loop, Parse, selText, %A_Space%_`,|;-
{
; 计算在这个字段末尾分隔符的位置.
Position += StrLen(A_LoopField) + 1
; 获取解析循环中找到的分隔符.
Delimiter := SubStr(selText, Position, 1)
str1:= Format("{:" Mode "}", A_LoopField)
out:=out . str1 . Delimiter
}
Clipboard :=out
ClipWait, 1
Send, ^v
Sleep, 500 ; 防止没有粘贴完毕剪贴板就被恢复了
Clipboard := clipBak ; 恢复剪贴板
}
更复杂的首字母转换(主要是中文英文混合时):如果检测到字符类型不是英文字母,那么这些字符后的英文字母就要转换成首字母大写
/*
转换前:
我用windows_vista
?WINDOWS.VISTA
8W*/INDOWS,vista
Windows,Vista
windows,vista
windows vista
……windows!VISTA
转换后:
我用Windows_Vista
?Windows.Vista
8Windows,Vista
Windows,Vista
Windows,Vista
Windows Vista
……Windows!Vista
*/
#z::首字母大写()
首字母大写() {
clipBak := ClipboardAll ; 备份剪贴板
Clipboard := "" ; 清空剪贴板
Send, ^c ; 发送 ctrl+c 复制选中文字
ClipWait, 1 ; 等待复制完毕
selText := Clipboard
out:=""
StringReplace, selText, selText,%A_Space%, ¢, All
Loop, Parse, selText
{
if (A_index=1)
{
cur:=A_LoopField
if cur is alpha
{
StringUpper, cur, cur
out:=out . cur
}
else
{
out:=out . cur
}
}else{
cur=%A_LoopField%
if cur is alpha
{
if pre is not alpha
{
StringUpper, cur, cur
out:=out . cur
}
else
{
StringLower, cur, cur
out:=out . cur
}
}
else
{
out:=out . cur
}
}
pre:=cur
}
StringReplace,out,out,¢, %A_Space%, All
Clipboard :=out
ClipWait, 1
Send, ^v
Sleep, 500 ; 防止没有粘贴完毕剪贴板就被恢复了
Clipboard := clipBak ; 恢复剪贴板
}