[AHK]将选中字符中的字母全部转换成【大写 / 小写 / 首字母大写】

暗夜如歌  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 ; 恢复剪贴板
}



如何在strokePlus里面使用这个脚本?
答:编译成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 ; 恢复剪贴板
}


你可能感兴趣的:(AHK,热键,效率,AutoHotkey)