Thinkai's Blog

Autohoutkey|Python|php|aardio|VOIP|IT 爱好者

多级(原七级)文字点击输入菜单 Autohotkey 4696

作者为 发表

Autohotkey

应网友jem需求编写。

2014-09-23更新:

多级(原七级)文字点击输入菜单.zip

;多级字符输入菜单 by Thinkai @2014-09-23
;EscapeChar = | ;菜单分隔符。不建议用中文字符,可能会导致显示错误。默认为“,”
;加载文件到数组
e := file_menu_2_obj("e.csv")
Return

;写你的热键并调用函数
::c::
#e::
create_menu(e)
return


file_menu_2_obj(file){
;加载菜单文件到数组
if !file
  {
  MsgBox, 4112, 错误, 文件%file%不存在!
  return "Error:No file"
  }
Else
  {
  FileRead, content, %file%
  Return csv2obj(content)
  }
}

csv2obj(string){
;csv分隔符格式文本转object函数
obj := Object() ;初始化
StringReplace, string, string, `r, , All ;去回车
StringSplit, var, string, `n ;按行分割
Loop % var0 ;循环读取
{
tmp_line := var%A_Index% ;赋值临时行
if tmp_line <>
    {
    tmp_obj := string_2_obj(tmp_line) ;文本转object函数
    obj := combine_obj(tmp_obj,obj) ;合并数组
    }
}
return obj
}
;文本转object函数
string_2_obj(string){
;全局分隔符
global EscapeChar
if (!EscapeChar)
	EscapeChar = ,
obj := object() ;初始化
StringSplit, var, string, %EscapeChar% ;按分隔符分割
if var0 > 1
    {
    ;下级成为上级的一个key
	Loop % var0-1
    {
    index := var0-A_index
    index2 := index+1
    obj%index% := object()
    obj%index%[var%index2%] := 0
	}
	;下级数组成为上级数组的一个key
	Loop % var0-2
    {
    index := var0-A_index-1
    index2 := index+1
    obj%index%[var%index2%] := obj%index2%
    }
    ;定义根数组
	obj[var1] := obj1
    return obj
    }
Else
    {
    ;只有一个值
	obj[var1] := 0
    return obj
    }
}

combine_obj(obj1,obj2){
;联合数组函数
for k,v in obj1
    {
    if (inobj(obj2,k)) ;两个数组有相同键
        {
		if (isobject(obj1[k]) && isobject(obj2[k])) ;都是数组 合并
            obj2[k] := combine_obj(obj1[k],obj2[k])
        Else if (isobject(obj1[k]) && !isobject(obj2[k])) ; 数组2的相应键不是数组 赋值为数组1的对应键
            obj2[k] := obj1[k]
        }
    Else
        {
        obj2[k] := v ;数组2没有该键 添加
        }
    }
Return obj2
}

create_menu(obj,menu_name:="main",index:=1){
;创建并显示菜单函数
keys := ["",1,2,3,4,5,6,7,8,9,0,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
;创建主菜单
Menu, % menu_name, add,
Menu, % menu_name, DeleteAll
;枚举数组
for k,v in obj
{
index += 1
;如果该项是数组
if (IsObject(v))
	{
	submenu_name = %menu_name%_%k% ;定义子菜单菜单名
	;预创建子菜单 不然报错
    Menu, % submenu_name, add,
    Menu, % submenu_name, DeleteAll
	;添加子菜单
	Menu, % menu_name, add, % k ? "(&" keys[index] ") " k : "", :%submenu_name%
    create_menu(v,submenu_name)
	}
Else
	{
	;单独项
	Menu, % menu_name, add, % k ? "(&" keys[index] ") " k : "", MenuHandler
	}
}
;如果是根菜单,显示它
if menu_name = main
    menu,% menu_name, show
}



inobj(obj,key){
;判断数组内是否有指定字符的键值或变量
for k,v in obj
{
if k = %key%
    return 1
}
}


MenuHandler: ;点击菜单句柄
;转存剪切板  直接粘贴 支持中文
clip := ClipboardAll
;发送括号后面的内容
;应jem要求加入父级
StringSplit, father, A_ThisMenu, _
father = % father%father0%
current := RegExReplace(A_ThisMenuItem,"\(.*\)\s*(.*)","$1")
result := father="main" ? current : father "/" current
StringReplace, result, result, `r, , All
Clipboard := result
Send, ^v
;加等待时间 以防部分程序反应慢获取到原剪切板数据
Sleep,200
Clipboard := clip
return

七级文字点击输入菜单.zip

;七级字符输入菜单 by Thinkai @2014-09-13
EscapeChar = | ;菜单分隔符。不建议用中文字符,可能会导致显示错误。默认为“,”
;加载文件到数组
;q := file_menu_2_obj("q.txt")
;w := file_menu_2_obj("w.txt")

;无文件情况的演示
example =
(
男|高|娘
男|高|娘|搞基
男|高|娘|异性恋
男|高|娘|双性恋
男|高|猛
男|高|猪肝
男|富|帅|就|是|拽
男|帅
男|矮
男|矬
男|穷
女|白|富|美|就|是|拽
女|富
女|美
女|黑
女|穷
女|丑
人妖
畜生
禽类
微生物
)
IfNotExist, e.txt
  {
  FileAppend, %example%, e.txt
  }
;演示段落完毕

e := file_menu_2_obj("e.txt")
Return

;写你的热键并调用函数
;::a::
;#q::
;调用函数
;create_menu(q)
;return

;::b::
;#w::
;create_menu(w)
;return

::c::
#e::
create_menu(e)
return


file_menu_2_obj(file){
;加载菜单文件到数组
if !file
  {
  MsgBox, 4112, 错误, 文件%file%不存在!
  return "Error:No file"
  }
Else
  {
  FileRead, content, %file%
  Return menu_string_2_obj(content)
  }
}

menu_string_2_obj(string){
;文本菜单项转为多维数组,请请定义好EscapeChar菜单分隔符
global EscapeChar
if (!EscapeChar)
	EscapeChar = ,
out := Object()
StringSplit, var, string, `n
Loop % var0
{
if (var%A_Index%)
StringSplit, tmp, var%A_Index%, %EscapeChar%
if (tmp%tmp0%)
	{
	if tmp0 = 1
		{
		if (!inobj(out,var%A_index%))
			out[var%A_index%] := "0"
		}
	Else if tmp0 = 2
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!inobj(out[tmp1],tmp2))
			out[tmp1][tmp2] := "0"
		}
	Else if tmp0 = 3
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!inobj(out[tmp1][tmp2],tmp3))
			out[tmp1][tmp2][tmp3] := "0"
		}
	Else if tmp0 = 4
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3],tmp4))
			out[tmp1][tmp2][tmp3][tmp4] := "0"
		}
	Else if tmp0 = 5
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4]))
			{
			out[tmp1][tmp2][tmp3][tmp4] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3][tmp4],tmp5))
			out[tmp1][tmp2][tmp3][tmp4][tmp5] := "0"
		}
	Else if tmp0 = 6
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4]))
			{
			out[tmp1][tmp2][tmp3][tmp4] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4][tmp5]))
			{
			out[tmp1][tmp2][tmp3][tmp4][tmp5] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3][tmp4][tmp5],tmp6))
			out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6] := "0"
		}
	Else if tmp0 = 7
		{
		if (!IsObject(out[tmp1]))
			{
			out[tmp1] := Object()
			}
		if (!IsObject(out[tmp1][tmp2]))
			{
			out[tmp1][tmp2] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3]))
			{
			out[tmp1][tmp2][tmp3] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4]))
			{
			out[tmp1][tmp2][tmp3][tmp4] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4][tmp5]))
			{
			out[tmp1][tmp2][tmp3][tmp4][tmp5] := Object()
			}
		if (!IsObject(out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6]))
			{
			out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6] := Object()
			}
		if (!inobj(out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6],tmp7))
			out[tmp1][tmp2][tmp3][tmp4][tmp5][tmp6][tmp7] := "0"
		}
	}
}
Return out
}
MsgBox % A_IsUnicode



create_menu(out){
;创建并显示菜单函数,传入菜单数组,菜单点击到MenuHandler标签
keys := ["",1,2,3,4,5,6,7,8,9,0,"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
Menu, main, add,
Menu, main,DeleteAll
index1 = 1
for k,v in out
{
index1 += 1
if (IsObject(v))
	{
	Menu, main_%k%, add,
	Menu, main_%k%, DeleteAll
	Menu, main, add, % k ? "(&" keys[index1] ") " k : "", :main_%k%
	subkey1 := k
	index2 = 1
	for k,v in out[subkey1]
	{
	index2 += 1
	if (IsObject(v))
		{
		Menu, main_%subkey1%_%k%, add,
		Menu, main_%subkey1%_%k%, DeleteAll
		Menu, main_%subkey1%, add, % k ? "(&" keys[index2] ") " k : "", :main_%subkey1%_%k%
		subkey2 := k
		index3 = 1
		for k,v in out[subkey1][subkey2]
		{
		index3 += 1
		if (IsObject(v))
			{
			Menu, main_%subkey1%_%subkey2%_%k%, add,
			Menu, main_%subkey1%_%subkey2%_%k%, DeleteAll
			Menu, main_%subkey1%_%subkey2%, add, % k ? "(&" keys[index3] ") " k : "", :main_%subkey1%_%subkey2%_%k%
			subkey3 := k
			index4 = 1
			for k,v in out[subkey1][subkey2][subkey3]
			{
			index4 += 1
			if (IsObject(v))
				{
				Menu, main_%subkey1%_%subkey2%_%subkey3%_%k%, add,
				Menu, main_%subkey1%_%subkey2%_%subkey3%_%k%, DeleteAll
				Menu, main_%subkey1%_%subkey2%_%subkey3%, add, % k ? "(&" keys[index4] ") " k : "", :main_%subkey1%_%subkey2%_%subkey3%_%k%
				subkey4 := k
				index5 = 1
				for k,v in out[subkey1][subkey2][subkey3][subkey4]
				{
				index5 += 1
				if (IsObject(v))
					{
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%k%, add,
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%k%, DeleteAll
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%, add, % k ? "(&" keys[index5] ") " k : "", :main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%k%
					subkey5 := k
					index6 = 1
					for k,v in out[subkey1][subkey2][subkey3][subkey4][subkey5]
					{
					index6 += 1
					if (IsObject(v))
						{
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%k%, add,
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%k%, DeleteAll
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%, add, % k ? "(&" keys[index6] ") " k : "", :main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%k%
						subkey6 := k
						index7 = 1
						for k,v in out[subkey1][subkey2][subkey3][subkey4][subkey5][subkey6]
						{
						index7 += 1
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%_%subkey6%, add, % k ? "(&" keys[index7] ") " k : "", MenuHandler
						}
						}
					Else
						{
						Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%_%subkey5%, add, % k ? "(&" keys[index6] ") " k : "", MenuHandler
						}
					}
					}
				Else
					{
					Menu, main_%subkey1%_%subkey2%_%subkey3%_%subkey4%, add, % k ? "(&" keys[index5] ") " k : "", MenuHandler
					}
				}
				}
			Else
				{
				Menu, main_%subkey1%_%subkey2%_%subkey3%, add, % k ? "(&" keys[index4] ") " k : "", MenuHandler
				}
			}
			}
		Else
			{
			Menu, main_%subkey1%_%subkey2%, add, % k ? "(&" keys[index3] ") " k : "", MenuHandler
			}
		}
		}
	Else
		{
		Menu,  main_%subkey1%, add, % k ? "(&" keys[index2] ") " k : "", MenuHandler
		}
	}
	}
Else
	{
	Menu, main, add, % k ? "(&" keys[index1] ") " k : "", MenuHandler
	}
}
menu, main, show
}

inobj(obj,key){
;判断数组内是否有指定字符的键值或变量
var = 0
for k,v in obj
{
if if (k=key and v=key)
	var = 3
Else if (k=key)
	var := var>1 ? var : 1
Else if (v=key)
	var := var>2 ? var : 2
}
Return var
}


MenuHandler:
;转存剪切板  直接粘贴 支持中文
clip := ClipboardAll
;发送括号后面的内容
Clipboard := RegExReplace(A_ThisMenuItem,"\(.*\)\s*(.*)","$1")
Send, ^v
Sleep,200
Clipboard := clip
return



来了就留个评论吧! 没有评论




友情链接:Autohotkey中文论坛Autohotkey中文帮助Autohotkey官网我的B站直播间如若生涯一场梦博客联系作者免GooglePlay APK下载

 主题设计 • skyfrit.com  Thinkai's Blog | 保留所有权利

63 queries in 1.749 seconds |