【基础】一键弹出U盘(仿手动)

;应用场景:
;操作系统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

给TA捐赠
共{{data.count}}人
人已捐赠
其他

获取程序Edit框光标位置选中字符串,自测!

2021-12-1 16:53:06

其他案例

kernel32示例:实现简单的全/半角字符和简繁转换

2021-12-2 9:11:53

10 条回复 A文章作者 M管理员
  1. 僵尸牌木乃伊

    里面用到了一个你得自创函数note,一起传嘛,不然这段脚本跑起来要报错的

    • 月下马

      也是哦,漏了这个函数,就是简单地打开记事本,然后写上变量哈哈!那我把它贴上

  2. 月下马

    大家还有什么见解!欢迎评论区评论咯~!!感谢蜜獾哥指点,我现在就来去试试用激活ahk_class NotifyIconOverflowWindow的方式执行

  3. 李子木

    请问一下,为什么这串代码会造成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库的就比较高级啦!有空研究研究

个人中心
购物车
优惠劵
有新私信 私信列表
搜索