;应用场景:
;操作系统Win7
;更快速地弹出U盘或者移动硬盘
;思路:
;这是我很早之前一个想法了,今天乘着有空,就动手自己实践一下。是基础中的基础操作哈哈!!我的思路就很简单,基于初学概念
;全程send和mousemove好了哈哈!本来想用飞跃大神的findtext()搞定定位的,不过有点拿大炮炸小树苗,大材小用的感觉,所以还是决定用回标准库里的像素定位指令。
;因为靠右下角颜色像素比较容易定位,所以先找到绿色像素,再根据绿色像素向上向右挪动寻找指定像素
CoordMode, pixel, Screen ;像素全屏幕模式,将像素捕捉坐标设定为全屏幕的模式,不然一个窗口一套坐标,同一个位置N个坐标不好管理
CoordMode, Mouse, Screen ;鼠标全屏幕模式,同上,不过就是设定鼠标移动的坐
WinMinimizeAll ;把所有杂七杂八的窗口全部最小化
Sleep, 200 ;电脑一定累了,给睡个0.2秒吧
WinActivate, ahk_class WorkerW ;激活右下角的任务栏
WinWait, ahk_class WorkerW ;可能任务栏还没睡醒,我再等等
PixelSearch, x1, y1, 1078, 997, 1919, 1079, 0x127503, 10, FAST RGB ;像素寻找指令,不懂参数的看帮助文档,0x127503这个颜色我是用spy在u盘图标显示那里获取的,有点绿绿的
;~ MouseMove, %x1%, %y1% 这个指令是我之前测试用的
x2= % x1-8 ;向右上角移动一定的距离,准备判断另一个位置的颜色
y2= % y1-8
MouseMove, %x2%, %y2%
PixelGetColor, a, %x2%, %y2% ;虽然我抓了一个u盘图标的一个点的像素定位,但是一个像素定位有点不靠谱,所以我再抓一个地方定位一个像素颜色,这样靠谱一点
If(a=0x787475 Or a=0x4D4949){ ;判断第二个位置的像素符不符合我想要的颜色,是或者不是,分别执行不同的动作。
;~ MsgBox, 成功了,可以进行下一步
Send, {RButton} ;这下就有九成的把握确定这个位置是u盘图标了,点击鼠标右键
x2+=140
y2-=40
MouseMove, %x2%, %y2% ;移动到弹出来的菜单
jianshi:
PixelGetColor, b, %x2%, %y2% ;监视这个地方的颜色变换,来确定菜单弹出来了,所以我取色,存进b
RegExMatch(b, "\w{6}$", d) ;无聊复习(秀)一下正则表达式,将b里面的0x去掉,存进d里面
If(d="C5C0BD" or d="C0C0C0"){ ;判断d是不是我要的颜色,这个地方的像素代码我用上了双引号,上面的定位没用,不过都能运行,好神奇
;~ MsgBox, 准备点击
Send, {LButton} ;菜单终于跑出来了,左键点击
ExitApp ;没啥事了,退出整个脚本
}
Else{
Sleep, 1300 ;菜单还没弹出来,挺慢的,不知道系统在干嘛,等个1.3秒好了
;~ MsgBox, 0, , 这是%d%, 1
Goto, jianshi ;菜单不知道出来没有,我回去标签jianshi重新判断一下这个位置的颜色
}
Return
}
Else ;如果第二个位置的像素不符合我的要求,那就跳到这来
MsgBox, 这个点不对或无U盘 ;原来else后面如果没有加大括号的话,会跳过else下面一行,接着运行下一行
note(a) ;因为这个点不对,所以我自创了一个函数note(),来记录到底看到了什么颜色
Return
;----------------下面是自制函数--------------------------
note(r)
{
if (not WinExist("ahk_class Notepad"))
{
Run Notepad
WinWait ahk_class Notepad
}
else
WinActivate ahk_class Notepad
Send, {Enter}
Send, %r%
Return
}
Esc::ExitApp
里面用到了一个你得自创函数note,一起传嘛,不然这段脚本跑起来要报错的
也是哦,漏了这个函数,就是简单地打开记事本,然后写上变量哈哈!那我把它贴上
大家还有什么见解!欢迎评论区评论咯~!!感谢蜜獾哥指点,我现在就来去试试用激活ahk_class NotifyIconOverflowWindow的方式执行
请问一下,为什么这串代码会造成U盘用不了
功能是一样的
DriveGet, list, list
loop,Parse,list
{
; 设定为你想弹出的驱动器的标号。
popDriver:=A_LoopField . “:”
DriveGet, type, type, %popDriver%
; 如果是移动磁盘,则执行弹出操作
if(type == “Removable”)
{
hVolume := DllCall(“CreateFile”, Str, “\.” . popDriver
, UInt, 0x80000000 | 0x40000000
, UInt, 0x1 | 0x2
, UInt, 0
, UInt, 0x3
, UInt, 0, UInt, 0)
if hVolume -1
{
DllCall(“DeviceIoControl”, UInt, hVolume , UInt, 0x2D4808
, UInt, 0, UInt, 0, UInt, 0, UInt, 0 , UIntP, dwBytesReturned
, UInt, 0)
DllCall(“CloseHandle”, UInt, hVolume)
}
}
}
之前用过,但又两个u盘用了这个脚本后就在这个电脑上用不了了
像我这种简单模仿手动弹出u盘的,原理一样咯:出现不同的情况,我们就再增加几个判断和不同的执行动作就好啦
当你发现两个u盘用不了,就查查看到哪一步出现异常,然后修改
哦哦,好的,我试着改改
哇塞,这个调用Dllcall库的就比较高级啦!有空研究研究
我也是抄的?