先上一个大概的效果图吧。这是我自己电脑桌面和开始界面。
制作这样一个界面大概花费了一整天的时间,主要时间是花费在移动文件,查找文件路径,和配色上。
事后由于觉得过程过于繁琐和烦人,决定写个程序可以一键修改磁贴颜色。
*注:我用的是易语言编程。
选择文件
这是软件的打开界面:
要达到这个软件功能的核心问题,就是自动寻找文件路径,然后在对应的文件路径中写入一个xml文件,然后再在xml文件里写入颜色数值和相关参数。
首先要做到的就是获取文件路径,打开文件用的是通用对话框打开对应路径进行选择文件,用过滤器筛选出。“C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs”目录下的所有lnk文件。用通用对话框自带的文件名属性可以直接获取到当前选择文件所在位置,然后通过文件信息位置偏移计算出lnk文件所指向的exe程序的根目录。
源码如下:
.版本 2
.支持库 spec
.子程序 _选择文件_被单击, , , 选择文件按钮
.局部变量 数据, 字节集
.局部变量 list长度, 整数型
.局部变量 文件信息位置, 整数型
.局部变量 文件位置偏移, 整数型
.局部变量 目标路径, 文本型
.局部变量 文件位置, 整数型
通用对话框1.文件名 = “”
通用对话框1.过滤器 = “*.lnk|*.lnk”
通用对话框1.初始目录 = “C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs”
通用对话框1.打开 ()
.如果真 (通用对话框1.文件名 = “”)
返回 ()
.如果真结束
标签2.标题 = 通用对话框1.文件名
数据 = 读入文件 (通用对话框1.文件名)
.如果真 (数据 = { })
调试输出 (“读入文件数据失败”)
返回 ()
.如果真结束
list长度 = 取字节集数据 (数据, #短整数型, 77)
调试输出 (list长度)
文件信息位置 = list长度 + 78
调试输出 (文件信息位置)
文件位置偏移 = 取字节集数据 (数据, #整数型, 文件信息位置 + 17)
调试输出 (文件位置偏移)
目标路径 = 取字节集数据 (数据, #文本型, 文件信息位置 + 文件位置偏移 + 1)
调试输出 (目标路径)
标签1.标题 = 目标路径
通用对话框选择文件在一定情况下会相对方便快捷,但是在某些情况下会显得繁琐麻烦。
于是在沈大少的建议下,我用相同的计算方法,添加了一个文件拖拽的功能。
源码如下:
.版本 2
.支持库 spec
.子程序 _拖放对象1_得到文件
.参数 接收到的文件路径, 文本型
.局部变量 数据, 字节集
.局部变量 list长度, 整数型
.局部变量 文件信息位置, 整数型
.局部变量 文件位置偏移, 整数型
.局部变量 目标路径, 文本型
.局部变量 路径, 文本型
路径 = 接收到的文件路径
标签2.标题 = 路径
数据 = 读入文件 (标签2.标题)
.如果真 (数据 = { })
调试输出 (“读入文件数据失败”)
返回 ()
.如果真结束
list长度 = 取字节集数据 (数据, #短整数型, 77)
调试输出 (list长度)
文件信息位置 = list长度 + 78
调试输出 (文件信息位置)
文件位置偏移 = 取字节集数据 (数据, #整数型, 文件信息位置 + 17)
调试输出 (文件位置偏移)
目标路径 = 取字节集数据 (数据, #文本型, 文件信息位置 + 文件位置偏移 + 1)
调试输出 (目标路径)
标签1.标题 = 目标路径
核心的获取文件根目录的步骤完成就是这两段源码。
色板取色
接下来要做的是添加给用户自由选色的功能,
经过沈大少帮我做测试的反馈,我在程序中增加了三种取色方式,增强软件的容错性,避免单一的取色方式在某些系统上无法执行的问题。
第一个取色方式是最方便快捷的方式,使用色板取色。色板是直接引用网页的色板,只要有网色板取色即可执行。让软件的体量更轻便。
色板取色分为三步。第一步是当色板取色的单选框被选中时候,关闭另外两个取色方式的全部按钮,以及清空另外两个取色取色得到的数值,同时停止另外两个取色程序的时钟。
然后再打开,并且打开色板取色的子程序和时钟程序。
同时反馈色板取色是否成功的信息。
源码如下:
.版本 2
.子程序 _单选框3_被单击, , , 色板取色子程序集
_启动窗口.总在最前 = 假
编辑框3.内容 = “”
编辑框4.内容 = “”
编辑框5.内容 = “”
编辑框6.内容 = “”
标签30.标题 = “”
标签32.标题 = “”
标签36.标题 = “”
标签34.标题 = “”
编辑框3.禁止 = 真
编辑框4.禁止 = 真
编辑框5.禁止 = 真
编辑框6.禁止 = 真
编辑框3.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框4.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框5.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框6.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框1.加入文本 (“色板取色” + #换行符)
图片框7.可视 = 假
图片框11.可视 = 假
时钟1.时钟周期 = 50
时钟5.时钟周期 = 0
时钟2.时钟周期 = 0
第二步是开始运行色板取色所捆绑的时钟子程序,也就是取实时的鼠标xy坐标。
源码如下:
.版本 2
.子程序 _时钟1_周期事件, , , 色板取色时间
.局部变量 鼠标水平坐标, 整数型
.局部变量 鼠标垂直坐标, 整数型
标签16.标题 = 到文本 (取鼠标水平位置 ())
标签19.标题 = 到文本 (取鼠标垂直位置 ())
第三步是当确认数值按钮被按下时执行的。应用到api函数。当确认数值被按下时,记录当前鼠标所在位置并且记录到XY的标签里。然后通过鼠标控制将鼠标移动到最终取色的色板坐标上,通过鼠标取色功能将颜色取回,并且释放鼠标到按下确认数值按钮时候鼠标所在的位置。
当颜色取回时,控制确认取色的取色板变为最终取色的颜色,再反馈所取回的RGB值以及颜色值。
最后增加一个判定,如果用户没用点击色板取色时直接按取认取色按钮时,反馈用户,请先完成取色信息。
这里颜色值的计算方法格外重要。需要熟记。
源码如下:
.版本 2
.支持库 eAPI
.子程序 _选择文件5_被单击, , , 色板取色确认数值
.局部变量 颜色值, 整数型
.局部变量 R, 整数型
.局部变量 G, 整数型
.局部变量 B, 整数型
.局部变量 鼠标水平坐标, 整数型
.局部变量 鼠标垂直坐标, 整数型
时钟1.时钟周期 = 0
标签16.标题 = 到文本 (取鼠标水平位置 ())
标签19.标题 = 到文本 (取鼠标垂直位置 ())
鼠标_移动 (取窗口句柄 (), 630, 190)
取当前鼠标处颜色值 (R, G, B)
标签12.标题 = 取十六进制文本 (R) + 取十六进制文本 (G) + 取十六进制文本 (B)
颜色值 = R + 256 × G + 65536 × B
标签17.背景颜色 = 颜色值
R = 取字节集数据 (到字节集 (颜色值), #字节型, 1)
G = 取字节集数据 (到字节集 (颜色值), #字节型, 2)
B = 取字节集数据 (到字节集 (颜色值), #字节型, 3)
标签8.标题 = 到文本 (R)
标签9.标题 = 到文本 (G)
标签10.标题 = 到文本 (B)
鼠标_移动 (, 到数值 (标签16.标题), 到数值 (标签19.标题))
.判断开始 (单选框3.选中 = 真 且 标签8.标题 ≠ “”)
编辑框1.加入文本 (“当前色板取色的数值如下” + #换行符 + “R= ” + 标签8.标题 + “ G= ” + 标签9.标题 + “ B= ” + 标签10.标题 + “ 颜色值= #” + 标签12.标题 + #换行符)
.默认
编辑框1.加入文本 (“请先完成取色,再确认数值!” + #换行符)
数值取色
数值取色的方法是最准确,也是最稳定的,不会因为各种问题而导致的取色失败。
数值取色的步骤相对色板取色的内容要复杂的多。数值取色的难点在于通过颜色值反计算单独的R值G值和B值。
首先依然是触发数值取色的单选框被选中,关闭另外两个取色相关的所有子程序,以及清空另外两个取色程序的数值,再启动数值取色的子程序。
同时反馈数值取色是否成功的信息。
源码如下:
.版本 2
.子程序 _单选框4_被单击, , , 数值取色子程序集
_启动窗口.总在最前 = 假
编辑框3.禁止 = 假
编辑框4.禁止 = 假
编辑框5.禁止 = 假
编辑框6.禁止 = 假
编辑框3.背景颜色 = 255 + 255 × 256 + 255 × 65536
编辑框4.背景颜色 = 255 + 255 × 256 + 255 × 65536
编辑框5.背景颜色 = 255 + 255 × 256 + 255 × 65536
编辑框6.背景颜色 = 255 + 255 × 256 + 255 × 65536
标签8.标题 = “”
标签9.标题 = “”
标签10.标题 = “”
标签12.标题 = “”
标签30.标题 = “”
标签32.标题 = “”
标签36.标题 = “”
标签34.标题 = “”
标签16.标题 = “”
标签19.标题 = “”
图片框7.可视 = 假
图片框11.可视 = 真
时钟2.时钟周期 = 50
时钟1.时钟周期 = 0
时钟3.时钟周期 = 0
编辑框1.加入文本 (“数值取色” + #换行符)
数值取色首先在确认数值的位置增加判定,判定用户是否输入了数值,如果没用输入数值,那么拒绝确认。如果输入数值,那么记录数值。并反馈。
源码如下:
.版本 2
.子程序 _选择文件2_被单击, , , 确认数值按钮
.判断开始 (单选框4.选中 = 真 且 编辑框6.内容 ≠ “”)
编辑框1.加入文本 (“当前数值取色的数值如下” + #换行符 + “R= ” + 编辑框3.内容 + “ G= ” + 编辑框4.内容 + “ B= ” + 编辑框5.内容 + “ 颜色值= #” + 编辑框6.内容 + #换行符)
.默认
编辑框1.加入文本 (“请先完成取色,再确认数值!” + #换行符)
.判断结束
接下来增加两个算法,分别置于两个时钟子程序中。一个算法是正向RGB值取颜色值。一个是逆向RGB值取颜色值。
通过监测用户正在输入的编辑框来开关时钟子程序,达到改变算法的目的。
这里在重点在于逆算RGB值。重点记忆。
另外单独的RGB值是不大于255的数值,需要限制用户输入。增加判定,当用户输入大于255的数值的时候,那么数值变为255。
源码如下:
.版本 2
.子程序 _编辑框3_获得焦点, , , R值
时钟2.时钟周期 = 0
时钟5.时钟周期 = 50
.子程序 _编辑框4_获得焦点, , , G值
时钟2.时钟周期 = 0
时钟5.时钟周期 = 50
.子程序 _编辑框5_获得焦点, , , B值
时钟2.时钟周期 = 0
时钟5.时钟周期 = 50
.子程序 _编辑框6_获得焦点, , , 颜色值
时钟5.时钟周期 = 0
时钟2.时钟周期 = 50
.子程序 _时钟2_周期事件, , , 颜色值数值取色
.局部变量 局部_原始值, 字节集
.局部变量 RGB, 长整数型
.局部变量 R, 整数型
.局部变量 G, 整数型
.局部变量 B, 整数型
RGB = 进制_十六到十 (编辑框6.内容)
局部_原始值 = 到字节集 (RGB)
图片框11.背景颜色 = 取颜色值 (局部_原始值 [3], 局部_原始值 [2], 局部_原始值 [1])
编辑框5.内容 = 到文本 (局部_原始值 [1])
编辑框4.内容 = 到文本 (局部_原始值 [2])
编辑框3.内容 = 到文本 (局部_原始值 [3])
.子程序 _时钟5_周期事件, , , rgb数值取色
.局部变量 RGB, 长整数型
.局部变量 R, 整数型
.局部变量 G, 整数型
.局部变量 B, 整数型
.如果真 (到数值 (编辑框3.内容) > 255)
编辑框3.内容 = “255”
.如果真结束
.如果真 (到数值 (编辑框4.内容) > 255)
编辑框4.内容 = “255”
.如果真结束
.如果真 (到数值 (编辑框5.内容) > 255)
编辑框5.内容 = “255”
.如果真结束
R = 到数值 (编辑框3.内容)
G = 到数值 (编辑框4.内容)
B = 到数值 (编辑框5.内容)
图片框11.背景颜色 = 取颜色值 (R, G, B)
编辑框6.内容 = 取十六进制文本 (R) + 取十六进制文本 (G) + 取十六进制文本 (B)
接下来,我们需要限制用户输入的数值,因为颜色值是限制的6个字符,限制的字符内容包括:0到9 +A到F,这是颜色值的所有需要用到的字符。所以需要限制用户输入数值。避免算法出错,导致数值取色出现问题。
源码如下。
.版本 2
.支持库 eAPI
.子程序 _编辑框6_内容被改变, , , 颜色值内容
数字字母 ()
编辑框6.最大允许长度 = 6
.子程序 数字字母, 文本型, , 数值型限制
.局部变量 母, 文本型
.局部变量 长度, 整数型
.局部变量 i, 整数型
.局部变量 数母, 文本型
.局部变量 a, 逻辑型
.局部变量 b, 整数型
母 = “0123456789abcdefABCDEF”
长度 = 取文本长度 (母)
.计次循环首 (长度, i)
数母 = 取文本中间 (母, i, 1)
.如果真 (取文本右边 (编辑框6.内容, 1) = 数母)
b = 0
.如果真 (b = 0)
a = 假
跳出循环 ()
.如果真结束
.如果真结束
a = 真
b = 1
.计次循环尾 ()
.如果真 (a)
编辑框6.起始选择位置 = 取文本长度 (编辑框6.内容)
模拟按键 (8, , )
.如果真结束
返回 (数母)
屏幕取色
屏幕取色是这里面最简单,也是最复杂的。因为涉及到钩子程序。利用钩子程序来监测鼠标的状态,当鼠标按下时,执行取色功能。在执行完取色功能后马上卸载钩子程序,不然就会无限取色。
首先还是和上面一样,如法炮制。关闭另外两个取色功能的所有子程序,清空数值,启动屏幕取色的子程序。
当启动屏幕取色功能时,会将软件固定在最前窗口。防止用户看不到自己的颜色。然后安装钩子程序,启动下属子程序。
源码如下:
.版本 2
.子程序 _单选框5_被单击, , , 屏幕取色子程序集
_启动窗口.总在最前 = 真
标签8.标题 = “”
标签9.标题 = “”
标签10.标题 = “”
标签12.标题 = “”
编辑框3.内容 = “”
编辑框4.内容 = “”
编辑框5.内容 = “”
编辑框6.内容 = “”
标签22.标题 = “”
编辑框3.禁止 = 真
编辑框4.禁止 = 真
编辑框5.禁止 = 真
编辑框6.禁止 = 真
编辑框3.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框4.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框5.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框6.背景颜色 = 240 + 240 × 256 + 240 × 65536
编辑框1.加入文本 (“屏幕取色” + #换行符)
hook = SetWindowsHookExA (14, &钩子处理, GetModuleHandleA (0), 0)
时钟3.时钟周期 = 50
时钟1.时钟周期 = 0
时钟2.时钟周期 = 0
图片框7.可视 = 真
图片框11.可视 = 假
钩子程序重要的知识点,需要记忆。这里只用到鼠标,所以只列举鼠标的键代码,方便记忆。
钩子程序的参数一 也就是 键代码——不过是API里面的,不能直接用,
(参数一 = 519) ' 鼠标中键按下的参数
(参数一 = 520) ' 鼠标中键放开的参数
(参数一 = 513) ' 鼠标左键按下的参数
(参数一 = 514) ' 鼠标左键放开的参数
(参数一 = 516) ' 鼠标右键按下的参数
(参数一 = 517) ' 鼠标右键放开的参数
根据键代码的提示,可以写出源码。根据判断鼠标左键的按下状态来控制取色功能和结束取色功能。
源码如下:
.版本 2
.子程序 钩子处理, 整数型
.参数 code, 整数型
.参数 wp, 整数型
.参数 lp, 整数型
.判断开始 (wp = 514)
时钟3.时钟周期 = 0
标签22.标题 = “1”
.默认
.判断结束
返回 (CallNextHookEx (hook, code, wp, lp))
然后先写一个确认数值按钮,和上面进行一样的操作,对用户是否取色进行判断,如果取色,将输入写入并且反馈到用户界面。
源码如下:
.版本 2
.子程序 _选择文件3_被单击
.判断开始 (单选框5.选中 = 真 且 标签36.标题 ≠ “”)
编辑框1.加入文本 (“当前屏幕取色的数值如下” + #换行符 + “R= ” + 标签36.标题 + “ G= ” + 标签34.标题 + “ B= ” + 标签32.标题 + “ 颜色值= #” + 标签30.标题 + #换行符)
.默认
编辑框1.加入文本 (“请先完成取色,再确认数值!” + #换行符)
.判断结束
由于屏幕取色的关闭是由钩子程序控制关闭的,所以需要再写入一个重新开启屏幕取色的按钮,重新安装钩子程序。
源码如下。
.版本 2
.子程序 _选择文件4_被单击
标签22.标题 = “”
_启动窗口.总在最前 = 真
hook = SetWindowsHookExA (14, &钩子处理, GetModuleHandleA (0), 0)
时钟3.时钟周期 = 50
时钟1.时钟周期 = 0
时钟2.时钟周期 = 0
图片框7.可视 = 真
我们给到一个时钟的子程序,用做屏幕取色的核心功能。
源码如下:
.版本 2
.支持库 eAPI
.子程序 _时钟3_周期事件, , , 屏幕取色
.局部变量 颜色值, 整数型
.局部变量 R, 整数型
.局部变量 G, 整数型
.局部变量 B, 整数型
.局部变量 鼠标水平坐标, 整数型
.局部变量 鼠标垂直坐标, 整数型
标签16.标题 = 到文本 (取鼠标水平位置 ())
标签19.标题 = 到文本 (取鼠标垂直位置 ())
取当前鼠标处颜色值 (R, G, B)
标签30.标题 = 取十六进制文本 (R) + 取十六进制文本 (G) + 取十六进制文本 (B)
颜色值 = R + 256 × G + 65536 × B
图片框7.背景颜色 = 颜色值
R = 取字节集数据 (到字节集 (颜色值), #字节型, 1)
G = 取字节集数据 (到字节集 (颜色值), #字节型, 2)
B = 取字节集数据 (到字节集 (颜色值), #字节型, 3)
标签36.标题 = 到文本 (R)
标签34.标题 = 到文本 (G)
标签32.标题 = 到文本 (B)
最后我们增加一个判断,判定屏幕取色是否成功取色,直接增加一个判定颜色值标签的内容是否为空。如果不等于空,那么说明取色成功,马上卸载钩子程序。
源码如下。
.版本 2
.子程序 _时钟4_周期事件, , , 卸载钩子程序
.如果真 (标签22.标题 ≠ “”)
UnhookWindowsHookEx (hook)
.如果真结束
.如果真 (单选框3.选中 = 真)
选择文件2.禁止 = 真
选择文件3.禁止 = 真
选择文件4.禁止 = 真
选择文件5.禁止 = 假
.如果真结束
.如果真 (单选框4.选中 = 真)
选择文件2.禁止 = 假
选择文件3.禁止 = 真
选择文件4.禁止 = 真
选择文件5.禁止 = 真
.如果真结束
.如果真 (单选框5.选中 = 真)
选择文件2.禁止 = 真
选择文件3.禁止 = 假
选择文件4.禁止 = 假
选择文件5.禁止 = 真
确认修改(核心操作部分)
当点击确认修改时,首先判断用户是否选择了文件,文件是否有根目录(需要判断的原因是,系统程序是找不到根目录的,也无法修改磁贴背景色),如果选择文件,那么继续判断用户是否取色。如果取色再继续往下执行。
在执行这个操作之前,我们把需要写入的XML文件内部数据的固定部分定义两个常量,以作备用。写入的同时判断文件是否存在。并且反馈。
源码如下。
.版本 2
.子程序 _选择文件1_被单击, , , 确认按钮
.如果真 (标签1.标题 = “”)
编辑框1.加入文本 (“请选择文件!!” + #换行符)
返回 ()
.如果真结束
.如果真 (标签12.标题 = “” 且 编辑框6.内容 = “” 且 标签30.标题 = “”)
编辑框1.加入文本 (“请选择取色方案取色后再执行!”)
返回 ()
.如果真结束
编辑框1.加入文本 (“开始执行...” + #换行符)
编辑框1.加入文本 (标签1.标题 + #换行符)
编辑框1.加入文本 (文本_取左边 (标签1.标题, “.exe”, 1, 真) + “.VisualElementsManifest.xml” + #换行符)
.如果真 (单选框3.选中 = 真)
编辑框1.加入文本 (“BackgroundColor=” + #引号 + 标签12.标题 + #引号 + #换行符)
.如果真结束
.如果真 (单选框4.选中 = 真)
编辑框1.加入文本 (“BackgroundColor=” + #引号 + 编辑框6.内容 + #引号 + #换行符)
.如果真结束
.如果真 (单选框5.选中 = 真)
编辑框1.加入文本 (“BackgroundColor=” + #引号 + 标签30.标题 + #引号 + #换行符)
.如果真结束
.如果 (单选框1.选中 = 真)
编辑框1.加入文本 (“ForegroundText=” + #引号 + “dark” + #引号 + #换行符)
.否则
编辑框1.加入文本 (“ForegroundText=” + #引号 + “light” + #引号 + #换行符)
.如果结束
编辑框1.加入文本 (“信息读取完毕...” + #换行符)
编辑框1.加入文本 (“正在扫描文件...” + #换行符)
.如果 (文件是否存在 (到文本 (文本_取左边 (标签1.标题, “.exe”, 1, 真) + “.VisualElementsManifest.xml”)) = 真)
编辑框1.加入文本 (“文件已存在!” + #换行符)
.否则
编辑框1.加入文本 (“文件不存在!” + #换行符)
编辑框1.加入文本 (“准备写入文件....” + #换行符)
编辑框1.加入文本 (“正在写入....” + #换行符)
.如果结束
.如果真 (单选框1.选中 = 真 且 标签12.标题 ≠ “”)
编辑框2.内容 = #常量1 + #换行符 + “ForegroundText=” + #引号 + “dark” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签12.标题) + #引号 + #换行符 + #常量2
编辑框1.加入文本 (#常量1 + #换行符 + “ForegroundText=” + #引号 + “dark” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签12.标题) + #引号 + #换行符 + #常量2 + #换行符)
.如果真结束
.如果真 (单选框2.选中 = 真 且 标签12.标题 ≠ “”)
编辑框2.内容 = #常量1 + #换行符 + “ForegroundText=” + #引号 + “light” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签12.标题) + #引号 + #换行符 + #常量2
编辑框1.加入文本 (#常量1 + #换行符 + “ForegroundText=” + #引号 + “light” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签12.标题) + #引号 + #换行符 + #常量2 + #换行符)
.如果真结束
.如果真 (单选框1.选中 = 真 且 编辑框6.内容 ≠ “”)
编辑框2.内容 = #常量1 + #换行符 + “ForegroundText=” + #引号 + “dark” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (编辑框6.内容) + #引号 + #换行符 + #常量2
编辑框1.加入文本 (#常量1 + #换行符 + “ForegroundText=” + #引号 + “dark” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (编辑框6.内容) + #引号 + #换行符 + #常量2 + #换行符)
.如果真结束
.如果真 (单选框2.选中 = 真 且 编辑框6.内容 ≠ “”)
编辑框2.内容 = #常量1 + #换行符 + “ForegroundText=” + #引号 + “light” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (编辑框6.内容) + #引号 + #换行符 + #常量2
编辑框1.加入文本 (#常量1 + #换行符 + “ForegroundText=” + #引号 + “light” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (编辑框6.内容) + #引号 + #换行符 + #常量2 + #换行符)
.如果真结束
.如果真 (单选框1.选中 = 真 且 标签30.标题 ≠ “”)
编辑框2.内容 = #常量1 + #换行符 + “ForegroundText=” + #引号 + “dark” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签30.标题) + #引号 + #换行符 + #常量2
编辑框1.加入文本 (#常量1 + #换行符 + “ForegroundText=” + #引号 + “dark” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签30.标题) + #引号 + #换行符 + #常量2 + #换行符)
.如果真结束
.如果真 (单选框2.选中 = 真 且 标签30.标题 ≠ “”)
编辑框2.内容 = #常量1 + #换行符 + “ForegroundText=” + #引号 + “light” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签30.标题) + #引号 + #换行符 + #常量2
编辑框1.加入文本 (#常量1 + #换行符 + “ForegroundText=” + #引号 + “light” + #引号 + #换行符 + “BackgroundColor=” + #引号 + “#” + 到文本 (标签30.标题) + #引号 + #换行符 + #常量2 + #换行符)
.如果真结束
写到文件 (文本_取左边 (标签1.标题, “.exe”, 1, 真) + “.VisualElementsManifest.xml”, 到字节集 (编辑框2.内容))
编辑框1.加入文本 (“写入完成!” + #换行符)
编辑框1.加入文本 (“正在检查文件...” + #换行符)
.如果真 (文件是否存在 (到文本 (文本_取左边 (标签1.标题, “.exe”, 1, 真) + “.VisualElementsManifest.xml”)) = 假)
.如果真结束
写到文件 (文本_取左边 (标签1.标题, “.exe”, 1, 真) + “.VisualElementsManifest.xml”, 到字节集 (编辑框2.内容))
编辑框1.加入文本 (“文件写入完成!” + #换行符)
到这里,就已经完成了文件写入的操作了,只差最后的一步操作,那就是刷新文件的缓存。
刷新文件缓存
网络上给到的资料是在开始菜单右键磁贴,打开文件所在位置,定位到磁贴的快捷方式所在文件夹,打开命令提示符:点击文件—打开命令提示符—以管理员身份打开命令提示符。输入下面的命令回车运行:for %f in (*.*) do copy /b "%f" +,,
经过几个朋友的帮忙测试下,发现这样的操作方式,并不适用于所有的电脑。有些电脑这样运行cmd会报错。也有尝试把这段写到BAT文件进行执行,也无法执行。
经过很多次的尝试,找到了另外一个可以刷新文件缓存的方法。
发现如果系统在自动搜索LNK文件时发现文件路径发生改变,就会更新文件的缓存信息。
利用这一点,可以在写入文件完成后,通过移动文件路径,来更新文件缓存信息,新建两个文件夹,让文件只能在两个文件夹中循环移动。
这个时候,我们在打开文件位置加入一段用于判断文件当前所在路径,并且记录的命令。
如下:
.如果 (文件是否存在 (“C:\Users\lenovo\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Aremydx” + “\” + 到文本 (文件_取文件名 (标签2.标题, 真))) = 真)
编辑框8.内容 = “1”
.否则
编辑框8.内容 = “2”
在文件打开时有这判断之后,我们就可以根据判断的结果,选择执行的子程序。
.版本 2
.子程序 子程序1
.如果 (编辑框8.内容 = “1”)
文件移动Accessories ()
.否则
文件移动Aremydx ()
.如果结束
.子程序 文件移动B
编辑框1.加入文本 (“当前文件在Aremydx目录,准备移动到Accessories目录。” + #换行符)
文件_移动 (标签2.标题, “C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories” + “\” + 到文本 (文件_取文件名 (标签2.标题, 真)))
编辑框1.加入文本 (“文件更新完成!” + #换行符)
.子程序 文件移动A
编辑框1.加入文本 (“当前文件在Accessories目录,准备移动到Aremydx目录。” + #换行符)
文件_移动 (标签2.标题, “C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Aremydx” + “\” + 到文本 (文件_取文件名 (标签2.标题, 真)))
编辑框1.加入文本 (“文件更新完成!” + #换行符)
文件整理(难点)
根据上一步的思路,得知,需要两个目录。Aremydx和Accessories,这两个目录是一开始没有的。所以需要新建。
而且,文件必须在Aremydx或Accessories目录下。
于是干脆增加一个文件整理的子程序。难点在于枚举目录下的所有的LNK文件(包括子文件夹)。
枚举的难点在于需要枚举目录下以及子目录。
由于不知道加入成员这个命令的操作,所以在这里卡了整整三天,下次牢记!
由于移动文件有可能造成文件丢失的风险,所以,在移动文件之前需要备份移动的所有文件。
那么新建一个“C:\Ennmmm\lishi\”+现行时间为文件名的目录,用于我们保存备份的文件。
根据上面的需求,可以写出子程序。
源码如下:
.版本 2
.子程序 文件整理
编辑框1.加入文本 (“正在整理文件请稍后...” + #换行符)
编辑框7.内容 = 到文本 (取现行时间 ())
创建目录 (“C:\Ennmmm\lishi\” + 编辑框7.内容 + “\”)
文件_枚举EX (“C\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\”, “*.*”, 真, &回调函数1)
.子程序 回调函数1
.参数 文件名, 文本型
.参数 文件路径, 文本型
.局部变量 名, 文本型, , "0"
.局部变量 路径, 文本型, , "0"
.局部变量 i
加入成员 (名, 文件名)
加入成员 (路径, 文件路径)
.计次循环首 (取数组成员数 (路径), i)
文件_移动 (路径 [i], “C:\Ennmmm\lishi\” + 编辑框7.内容 + “\” + 名 [i])
.计次循环尾 ()
文件处理 ()
.子程序 文件处理
.局部变量 Aremydx创建成功, 逻辑型
.局部变量 Accessories创建成功, 逻辑型
.局部变量 数组, 文本型, , "0"
.局部变量 i, 整数型
创建目录 (“C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Accessories”)
创建目录 (“C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Aremydx”)
这样我们就拥有了两个新的目录,但是,这个时候的目录是空的,我们需要把备份的文件,全部回调到Aremydx目录。
这个时候反向枚举,备份目录下的所有文件。
源码如下:
.版本 2
文件_枚举EX (“C:\Ennmmm\lishi\” + 编辑框7.内容 + “\”, “*.lnk”, 真, &回调函数2)
.子程序 回调函数2
.参数 文件名, 文本型
.参数 文件路径, 文本型
.局部变量 名, 文本型, , "0"
.局部变量 路径, 文本型, , "0"
.局部变量 i
加入成员 (名, 文件名)
加入成员 (路径, 文件路径)
.计次循环首 (取数组成员数 (路径), i)
文件_复制 (路径 [i], “C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Aremydx” + “\” + 名 [i])
.计次循环尾 ()
流程整理+完善想法
根据上面得出的内容得出所需要的步骤。
选择文件 — **取色 — 确认修改 — 刷新文件缓存 — 文件整理
这个时候,发现“文件整理”的位置应当放在选择文件之后,才合理。
整理得到的流程:
选择文件 — 文件整理 — **取色 — 确认修改 — 刷新文件缓存
这样基本就是整个软件的操作流程。
但是在这里,会发现一个问题,因为文件整理这个步骤,一般只有第一次使用软件的时候需要执行这个操作。主要作用是创建文件夹。
那么可以用写配置项,来记录软件是第几次打开。
然后每次打开软件的时候首先读取配置项,判断软件是否第一次打开,如果是第一次打开,那么自动执行这个步骤。不需要手动去点击。
总结
这是第一次写一个比较正经(因为平时除了抄外挂的源码,好像也没干什么正事儿),而且相对完成度比较高的软件。当然还有很多BUG,很多不兼容别的电脑,等等的问题。
不过总要一步步来的嘛,而且自学也确实是基础知识有很大缺口。
比如"文件_枚举ex"那里那个"加入成员"命令,之所以能把我困三天没想明白,就是因为基础知识的大缺口把。
所以这个软件虽然确实还有很多BUG,不过目前暂时就这样了,接下来短期内不会再写这样完成度比较高的小软件了,要去恶补基础知识。
enmmmm……
最后在这里挂上软件的链接,如果有想试试的朋友可以下载来玩玩。提取码:vvxe
不过使用软件有几个问题:
1、我不能保证你的电脑是否兼容软件,所以带来的任何损失,或者出了任何问题,概不负责。(因为测试了一些朋友的电脑,发现不同的电脑,甚至路径都不尽相同。会造成路径无法创建(可能是系统自带的写保护,拒绝了程序的创建文件夹),如果无法创建目录,就会造成LNK文件丢失。慎用。)
2、如果要使用软件,那么请先关闭360之类的软件。因为360会误报木马。
3、本软件只适用于win10系统,如果使用,请打开”全屏开始“功能。
最后,在这里感谢所有在写这个软件的时候给我指点的大佬们,当然还有那些帮我测试软件的小可爱们。