一、制作该小程序的起因
前两天有一项工作是将某网页上一个表格复刻到Word文件里,包括表格的底纹,其中每一个单元格的底纹均不同。
在使用Word设置单元格底纹时,发现竟然没有取色器,如图1:
图1
无奈,只能打开PowerPoint,使用里面的取色器取色,然后再点击其他颜色,将R、G、B值分别记下,如图2:
图2
然后回到Word界面,点开其他颜色,输入R、G、B值,确定。
后来发现Excel、OneNote里也没有取色器的功能,于是就有了这样一个念头,制作一个小程序来解决这个问题。
前期作了两个不同界面的版本,前两个版本都是带窗口的小程序,
第一个版本是在获取到颜色后,鼠标点击图2红色右边的输入框,按Ctrl+V键,就会将三个色值自动粘贴到里面,然后自动回车确定。
顺带说一句:Word、Excel、PowerPoint、OneNote这几个同属于Microsoft Office办公组件的程序,他们的颜色窗口界面基本一致。
问题是设置了快捷键后,有时会出现Ctrl键粘滞现象,于是有了第二个版本。
第二个版本是在获取到颜色后,打开其他颜色的窗口,就自动将三个值输入,自动确定。
在做好第二个版本后,将代码稍微修改了一下,发现图2中R、G、B输入框的值可以随鼠标移动而自动更改为当前的色值,于是有了现在这个版本,如图3:
图3
二、软件使用说明
软件在运行后无任何提示,多次双击仅能运行一个实例,托盘图标已隐藏,在任务管理器中可以找到该程序,占用CPU和内存大小如图4:
图4
在Microsoft Office系列办公软件中,当点击图1中的“其他颜色”,打开图3窗口时,在确定、取消的下方会自动显示一个名为”取色器“的按钮,
当鼠标移动到其上方时会变成十字,此时点按鼠标并拖动到想要取色的位置,取色器按钮的背景颜色会自动切换成鼠标所在位置屏幕的颜色,
当确定好要取的颜色时,松开鼠标即停止取色,点击确定即可设置为所取颜色。
如果切换到”自定义“标签下(图2),还可看到R、G、B输入框的值为当前获取到的色值。
三、目前存在的缺陷
1.打开程序后占用内存虽然仅2M,但CPU占用有时较大,甚至超过了10%(我的笔记本是2014年的比较老旧了),目前还没找到好的方法。
2.打开其他颜色窗口后,如果用其他窗口遮挡颜色窗口,会看到取色器按钮孤零零地待在那里,本来两者就不是一体的,想融合到一起比较困难。
3.在取色器按钮显示时,任务栏上会出现程序的图标,由于应用界面无标题栏,故取消了关闭窗口的按钮功能,在任务栏上是关不掉这个程序的,可以在任务管理器中结束任务。
四、程序源代码
在发布代码前我对大部分代码作了解释,方便大家互相学习交流。
希望有高手大侠能针对上述缺陷,对代码进一步完善。
在使用过程中遇到的问题也可以及时反馈给我。
[Asm] 纯文本查看 复制代码
#NoTrayIcon ;隐藏托盘图标
#Region ;**** 参数创建于 ACNWrapper_GUI ****
#AutoIt3Wrapper_Icon=favicon.ico
#AutoIt3Wrapper_OutFile=取色器3.1.exe
#AutoIt3Wrapper_UseX64=n
#AutoIt3Wrapper_Res_Description=116博客破解——zhaopengdoctor原创
#AutoIt3Wrapper_Au3Check_Stop_OnWarning=y
#AutoIt3Wrapper_Run_Tidy=y
#EndRegion ;**** 参数创建于 ACNWrapper_GUI ****
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;创建GUI窗体及按钮
#Region ### START Koda GUI section ###
$Title = "取色器-116博客破解论坛"
If WinExists($Title) Then Exit ; 仅允许只有一个脚本运行
AutoItWinSetTitle($Title)
Opt("GUIOnEventMode", 1) ;设置事件响应模式
$Form1 = GUICreate($Title, 76, 32, 0, 0, $WS_POPUP, $WS_EX_TOPMOST)
$Button1 = GUICtrlCreateButton("取色器", 0, 0, 76, 32)
GUICtrlSetCursor(-1, 3) ;指定鼠标移动到按钮控件时指针变为精确定位
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "getcolor") ;当主键鼠标按下事件发生时,执行getcolor
#EndRegion ### END Koda GUI section ###
While 1
If WinExists("颜色", "") Then ;如果存在颜色窗口
$pos = WinGetPos("颜色", "") ;获取颜色窗口的坐标位置和大小
$state = WinGetState("颜色", "") ;获取颜色窗口的状态
$GUIx = $pos[0] + $pos[2] - 90 ;取色器窗口x坐标
$GUIy = $pos[1] + 118 ;取色器窗口y坐标
$buttonleft = $GUIx ;按钮控件左边缘屏幕坐标
$buttonright = $GUIx + 76 ;按钮控件右边缘屏幕坐标
$buttontop = $GUIy ;按钮控件上边缘屏幕坐标
$buttonbottom = $GUIy + 32 ;按钮控件下边缘屏幕坐标
If BitAND($state, 2) Then ;如果颜色窗口为可见状态
GUISetState(@SW_SHOW) ;显示取色器窗口
WinMove($Title, "", $GUIx, $GUIy) ;将取色器窗口移动至颜色窗口相对位置
EndIf
$mousepos = MouseGetPos() ;获取鼠标位置
$getcolor = PixelGetColor($mousepos[0], $mousepos[1]) ;获取鼠标所在位置的屏幕颜色(结果为十进制)
$hexcolor = Hex($getcolor) ;将颜色转换为十六进制
$strR = StringMid($hexcolor, 3, 2) ;从十六进制颜色中提取R颜色
$strG = StringMid($hexcolor, 5, 2) ;从十六进制颜色中提取G颜色
$strB = StringRight($hexcolor, 2) ;从十六进制颜色中提取B颜色
$R = Dec($strR) ;将R颜色转换为十进制
$G = Dec($strG) ;将G颜色转换为十进制
$B = Dec($strB) ;将B颜色转换为十进制
Else
GUISetState(@SW_HIDE) ;否则,隐藏取色器窗口
EndIf
WEnd
Func getcolor()
If $mousepos[0] > $buttonleft And $mousepos[0] < $buttonright And $mousepos[1] > $buttontop And $mousepos[1] < $buttonbottom Then ;判断鼠标在“获取”按钮范围时
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "printcolor") ;鼠标移动时执行printcolor
GUISetOnEvent($GUI_EVENT_PRIMARYUP, "setcolor") ;鼠标抬起时执行setcolor
EndIf
EndFunc ;==>getcolor
;将按钮背景设置为鼠标所在位置屏幕的颜色,并将十六进制颜色及R、G、B的值显示在输入框
Func printcolor()
ControlSetText("颜色", "", "[CLASS:RichEdit20W; INSTANCE:10]", $R)
ControlSetText("颜色", "", "[CLASS:RichEdit20W; INSTANCE:11]", $G)
ControlSetText("颜色", "", "[CLASS:RichEdit20W; INSTANCE:12]", $B)
GUICtrlSetBkColor($Button1, $getcolor)
EndFunc ;==>printcolor
;停止显示鼠标所在位置屏幕的颜色,等待颜色窗口激活时,将输入框内R、G、B颜色设置为当前颜色
Func setcolor()
GUISetOnEvent($GUI_EVENT_MOUSEMOVE, "")
GUISetOnEvent($GUI_EVENT_PRIMARYUP, "")
GUISetOnEvent($GUI_EVENT_PRIMARYDOWN, "getcolor")
EndFunc ;==>setcolor
五、软件源码及程序下载
为使32位系统计算机也可使用该程序,仅编译了32位版本;同时按照版规,以附件形式上传论坛,敬请谅解。
解压密码:52pojie