因为开机脚本中需要使用热键控制酷狗音乐,所以研究了一下ACC,可以简单实现控制各种不规则的程序界面功能,当然也包括酷狗音乐。

/*
;-----------------------------------
;  ACC控制酷狗音乐 - By FeiYue
;
;  备注:热键可以改为自己喜欢的
;-----------------------------------
*/#NoEnv;-- 获取【Acc路径】及其他信息
F1::
obj:=Acc_GetInfoUnderCursor()
MsgBox, 4096, 查看ACC信息, % " Path = " obj.Path. "`n Hwnd = " obj.Hwnd. "`n Title = " obj.Title. "`n Class = " obj.Class. "`n Role = " obj.Role. "`n State = " obj.State. "`n Name = " SubStr(obj.Name,1,100). "`n Value = " SubStr(obj.Value,1,100)
return;-- 获取所有【Acc路径】及文本
F8::
MouseGetPos,,, id
info:={role:"", name:"", value:""}  ;-- 限定条件
MsgBox, 4096, 全部ACC信息, % Clipboard:=Acc_GetAllText(id, info)
returnF2:: 酷狗音乐("上一首")F3:: 酷狗音乐("下一首")F4:: 酷狗音乐("播放|暂停")F5:: 酷狗音乐("我喜欢")酷狗音乐(命令)
{SetBatchLines, -1DetectHiddenWindows, OnSetTitleMatchMode, RegExWinGet, List, List, 酷狗|音乐 ahk_exe KuGou.exeIfLess, List, 1, returnLoop, % List{id:=List%A_Index%WinGet, f, MinMax, ahk_id %id%if (f = -1){WinGet, f, Style, ahk_id %id%f &= (WS_VISIBLE:=0x10000000)WinExist("A")WinRestore, ahk_id %id%if (!f)WinHide, ahk_id %id%WinActivate}WinGetPos,,, w, h, ahk_id %id%if (A_Index=1 or w*h>max)okid:=id, max:=w*h}酷狗9:={ "上一首"   : "4.X.X.16.1", "播放|暂停" : "4.X.X.16.2", "下一首"    : "4.X.X.16.3", "我喜欢"    : "4.X.X.15.1" }酷狗8:={ "上一首"   : "4.3.7.13.1", "播放|暂停" : "4.3.7.13.3", "下一首"    : "4.3.7.13.2", "我喜欢"    : "4.3.7.X.5" }info:={role:"", name:命令, value:""}  ;-- 限定条件For k,v in [酷狗9, 酷狗8]For k2,v2 in StrSplit(v[命令], "|")if (arr:=Acc_GetObjectFromPath(okid, v2, info)){Try arr[1].accDoDefaultAction(arr[2])return};-- 初级方法也可以用,但不支持 “我喜欢”IfWinExist, ahk_id %okid%{WinGetPos,,, w, hy:=h-35, x:=(命令="上一首") ? w//2-50 : (命令="下一首") ? w//2+50 : w//2SetControlDelay, -1ControlClick, x%x% y%y%,,,,, NA Pos}
};==================================================Acc_GetAllText(hwnd, info="", first=1)
{static arr, textif (first)arr:=[], text:="", hwnd:=Acc_ObjectFromWindow(hwnd, 0)arr.Push(0)For i,v in Acc_Children(Acc:=hwnd){j:=IsObject(v), arr[arr.MaxIndex()]++, path:=""Loop, % arr.MaxIndex()path.=(A_Index=1 ? "":".") . arr[A_Index]path:=j ? path : RegExReplace(path, "\w+$", "c$0")Try Role:="", Role:=j ? v.accRole(0) : Acc.accRole(v)Try Name:="", Name:=j ? v.accName(0) : Acc.accName(v)Try Value:="", Value:=j ? v.accValue(0) : Acc.accValue(v)if (!info.role||Role=info.role)and (!info.name||Name~=info.name)and (!info.value||Value~=info.value)text.=path " ---- " Acc_GetRoleText(Role) " ". Format("0x{:X}",Role) " [" SubStr(Name,1,100). "][" SubStr(Value,1,100) "]`r`n"if (j)Acc_GetAllText(v, info, 0)}arr.Pop()if (first)return (s:=text, text:="") ? s:s
}Acc_GetObjectFromPath(hwnd, path, info="", Acc=0, first=1)
{if (first)hwnd:=Acc_ObjectFromWindow(hwnd, 0)if !IsObject(v:=hwnd) and !IsObject(Acc)returnLoop, Parse, path, ., c C{if !IsObject(Acc:=v)returnif (i:=A_LoopField)="X"{path:=Trim(SubStr(path, InStr(path,"X")+1), ".")For k,v in Acc_Children(Acc)if (arr:=Acc_GetObjectFromPath(v,path,info,Acc,0))return arrreturn}if (i<1 or i>Acc.accChildCount)returnv:=Acc_Children(Acc,i)}if IsObject(v)Acc:=v, v:=0Try Role:="", Role:=Acc.accRole(v)Try Name:="", Name:=Acc.accName(v)Try Value:="", Value:=Acc.accValue(v)if (!info.role||Role=info.role)and (!info.name||Name~=info.name)and (!info.value||Value~=info.value)return [Acc, v]
}Acc_GetInfoUnderCursor()
{; MouseGetPos,,,, cid, 2; SendMessage, WM_GETOBJECT:=0x3D, 0, 1,, ahk_id %cid%Acc:=Acc_ObjectFromPoint(child)Try Name:="", Name:=Acc.accName(child)Try Value:="", Value:=Acc.accValue(child)Try Role:="", Role:=Acc.accRole(child)Try State:="", State:=Acc.accState(child)path:=Acc_GetAccPath(Acc, child, hwnd)WinGetTitle, title, ahk_id %hwnd%WinGetClass, class, ahk_id %hwnd%hwnd:=Format("{:#x}", hwnd)Role:=Acc_GetRoleText(Role) " " Format("0x{:X}",Role)State:=Acc_GetStateText(State) " " Format("0x{:X}",State)return { Path:path, Hwnd:hwnd, Title:title, Class:class, Name:Name, Value:Value, Role:Role, State:State }
}Acc_GetAccPath(Acc, ChildID, ByRef hwnd)
{t2:=hwnd:="", id:=Acc_WindowFromObject(Acc)DllCall("GetWindowThreadProcessId","ptr",id,"uint*",AccPID)While id:=Acc_WindowFromObject(Parent:=Acc_Parent(Acc)){DllCall("GetWindowThreadProcessId","ptr",id,"uint*",pid)if (pid!=AccPID)Breakt1:=Acc_GetEnumIndex(Acc, ChildID)t2:=(ChildID ? "c":"") t1 "." t2hwnd:=id, (ChildID ? ChildID:=0 : Acc:=Parent)}return SubStr(t2,1,-1)
}Acc_GetEnumIndex(Acc, ChildID=0)
{Try Role:="", Role:=Acc.accRole(ChildID)Try State:="", State:=Acc.accState(ChildID)Try Name:="", Name:=Acc.accName(ChildID)Pos:=Acc_Location(Acc,ChildID).posif (ChildID){For Each, child in Acc_Children(Acc)if !IsObject(child){Try vRole:="", vRole:=Acc.accRole(child)Try vState:="", vState:=Acc.accState(child)Try vName:="", vName:=Acc.accName(child)if (vRole=Role) and (vState=State) and (vName=Name)and (Acc_Location(Acc,child).pos=Pos)return A_Index}}else{For Each, child in Acc_Children(Acc_Parent(Acc))if IsObject(child){Try vRole:="", vRole:=child.accRole(0)Try vState:="", vState:=child.accState(0)Try vName:="", vName:=child.accName(0)if (vRole=Role) and (vState=State) and (vName=Name)and (Acc_Location(child,0).pos=Pos)return A_Index}}
}; Acc.ahk - thanks Sean, jethrow, jeeswg, teadrinker
Acc_Get(Cmd, ChildPath="", ChildID=0, WinTitle="", WinText="", ExcludeTitle="", ExcludeText="")
{static properties := {Action:"DefaultAction", DoAction:"DoDefaultAction", Keyboard:"KeyboardShortcut"}AccObj := IsObject(WinTitle) ? WinTitle:  Acc_ObjectFromWindow( WinExist(WinTitle, WinText, ExcludeTitle, ExcludeText), 0 )if ComObjType(AccObj, "Name") != "IAccessible"ErrorLevel := "Could not access an IAccessible Object"else{StringReplace, ChildPath, ChildPath, _, %A_Space%, AllAccError:=Acc_Error(), Acc_Error(true)Loop, Parse, ChildPath, ., cC%A_Space%try{Parent:=AccObjif A_LoopField is digitChildren:=Acc_Children(AccObj), m2:=A_LoopField ; mimic "m2" output in else-statementelseRegExMatch(A_LoopField, "(\D*)(\d*)", m), Children:=Acc_ChildrenByRole(AccObj, m1), m2:=(m2?m2:1)if Not Children.HasKey(m2)throwAccObj := Children[m2]}catch{ErrorLevel:="Cannot access ChildPath Item #" A_Index " -> " A_LoopField, Acc_Error(AccError)if Acc_Error()throw Exception("Cannot access ChildPath Item", -1, "Item #" A_Index " -> " A_LoopField)return}if !IsObject(AccObj)ChildId:=AccObj, AccObj:=ParentAcc_Error(AccError)StringReplace, Cmd, Cmd, %A_Space%, , Allproperties.HasKey(Cmd)? Cmd:=properties[Cmd]:""try{if (Cmd = "Location")ret_val := Acc_Location(AccObj,ChildId+0).poselse if (Cmd = "Object")ret_val := AccObjelse if Cmd in Role,Stateret_val := Acc_%Cmd%(AccObj, ChildID+0)else if Cmd in ChildCount,Selection,Focusret_val := AccObj["acc" Cmd]elseret_val := AccObj["acc" Cmd](ChildID+0)}catch{ErrorLevel := """" Cmd """ Cmd Not Implemented"if Acc_Error()throw Exception("Cmd Not Implemented", -1, Cmd)return}return ret_val, ErrorLevel:=0}if Acc_Error()throw Exception(ErrorLevel,-1)
}Acc_Location(Acc, ChildId=0)  ; adapted from Sean's code
{try Acc.accLocation(ComObj(0x4003,&x:=0), ComObj(0x4003,&y:=0), ComObj(0x4003,&w:=0), ComObj(0x4003,&h:=0), ChildId)catchreturnreturn { x:NumGet(x,0,"int"), y:NumGet(y,0,"int"), w:NumGet(w,0,"int"), h:NumGet(h,0,"int"), pos:"x" NumGet(x,0,"int")" y" NumGet(y,0,"int"). " w" NumGet(w,0,"int") " h" NumGet(h,0,"int") }
}Acc_Parent(Acc)
{try parent:=Acc.accParentreturn parent?Acc_Query(parent):""
}Acc_Child(Acc, ChildId=0)
{try child:=Acc.accChild(ChildId)return child?Acc_Query(child):""
}Acc_Init()
{Static hIf (!h)h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}Acc_WindowFromObject(pacc)
{Acc_Init()If  DllCall("oleacc\WindowFromAccessibleObject", "Ptr", IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0return hWnd
}Acc_ObjectFromEvent(ByRef _idChild_, hWnd, idObject, idChild)
{Acc_Init()If  DllCall("oleacc\AccessibleObjectFromEvent", "Ptr", hWnd, "UInt", idObject, "UInt", idChild, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}Acc_ObjectFromPoint(ByRef _idChild_ = "", x = "", y = "")
{Acc_Init()If  DllCall("oleacc\AccessibleObjectFromPoint", "Int64", x==""||y==""? 0*DllCall("GetCursorPos","Int64*",pt)+pt:x&0xFFFFFFFF|y<<32, "Ptr*", pacc, "Ptr", VarSetCapacity(varChild,8+2*A_PtrSize,0)*0+&varChild)=0return ComObjEnwrap(9,pacc,1), _idChild_:=NumGet(varChild,8,"UInt")
}Acc_ObjectFromWindow(hWnd, idObject = -4)
{Acc_Init()If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", (VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64")+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,IID,8,"Int64"))*0+&IID, "Ptr*", pacc)=0return ComObjEnwrap(9,pacc,1)
}Acc_Children(Acc, N="")
{if ComObjType(Acc,"Name") != "IAccessible"ErrorLevel := "Invalid IAccessible Object"else{Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren, cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0{ListLines, % (lls:=A_ListLines=0?"Off":"On")?"Off":"Off"SetBatchLines, % (bch:=A_BatchLines)?"-1":"-1"Loop, %cChildren%i:=(A_Index-1)*(A_PtrSize*2+8), child:=NumGet(varChildren,i+8), Children[A_Index]:=( (j:=NumGet(varChildren,i,"ushort")=9)&& (N=""||N=A_Index) ? Acc_Query(child):child ), (j ? ObjRelease(child):"")SetBatchLines, %bch%ListLines, %lls%return Children.MaxIndex()?(N=""?Children:Children[N]):""} elseErrorLevel := "AccessibleChildren DllCall Failed"}if Acc_Error()throw Exception(ErrorLevel,-1)
}Acc_ChildrenByRole(Acc, Role)
{if ComObjType(Acc,"Name")!="IAccessible"ErrorLevel := "Invalid IAccessible Object"else{Acc_Init(), cChildren:=Acc.accChildCount, Children:=[]if DllCall("oleacc\AccessibleChildren", "Ptr",ComObjValue(Acc), "Int",0, "Int",cChildren, "Ptr",VarSetCapacity(varChildren, cChildren*(8+2*A_PtrSize),0)*0+&varChildren, "Int*",cChildren)=0{Loop, %cChildren%{i:=(A_Index-1)*(A_PtrSize*2+8), child:=NumGet(varChildren,i+8)if NumGet(varChildren,i,"ushort")=9AccChild:=Acc_Query(child), ObjRelease(child), Acc_Role(AccChild)=Role?Children.Push(AccChild):""elseAcc_Role(Acc, child)=Role?Children.Push(child):""}return Children.MaxIndex()?Children:"", ErrorLevel:=0} elseErrorLevel := "AccessibleChildren DllCall Failed"}if Acc_Error()throw Exception(ErrorLevel,-1)
}Acc_Query(Acc) ; thanks Lexikos - www.autohotkey.com/forum/viewtopic.php?t=81731&p=509530#509530
{static IAccessible:="{618736e0-3c3d-11cf-810c-00aa00389b71}"try return ComObj(9, ComObjQuery(Acc,IAccessible), 1)
}Acc_Role(Acc, ChildId=0)
{try return ComObjType(Acc,"Name")="IAccessible"? Acc_GetRoleText(Acc.accRole(ChildId)):"invalid object"
}Acc_State(Acc, ChildId=0)
{try return ComObjType(Acc,"Name")="IAccessible"? Acc_GetStateText(Acc.accState(ChildId)):"invalid object"
}Acc_GetRoleText(nRole)
{Acc_Init()nSize := DllCall("oleacc\GetRoleText", "Uint", nRole, "Ptr", 0, "Uint", 0)VarSetCapacity(sRole, (A_IsUnicode?2:1)*nSize)DllCall("oleacc\GetRoleText", "Uint", nRole, "str", sRole, "Uint", nSize+1)return sRole
}Acc_GetStateText(nState)
{Acc_Init()nSize := DllCall("oleacc\GetStateText", "Uint", nState, "Ptr", 0, "Uint", 0)VarSetCapacity(sState, (A_IsUnicode?2:1)*nSize)DllCall("oleacc\GetStateText", "Uint", nState, "str", sState, "Uint", nSize+1)return sState
}Acc_Error(p="")
{static setting:=0return p=""?setting:setting:=p
}

利用ACC控制酷狗音乐相关推荐

  1. [AHK] 定义热键控制酷狗音乐播放器

    ==================最新版本==================== 1.请ahk官网下载ahk环境,约3M,安装u32版本. 2.将本脚本存成.ahk文件,双击运行. 3.热键说明C ...

  2. 我是如何利用Python下载酷狗音乐的

    点击上方"Python爬虫与数据挖掘",进行关注 回复"书籍"即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 万战自称不提刃,生来双眼篾群容. ...

  3. 利用scrapy采集酷狗音乐网站的音乐信息并保存本地MongoDB数据库

    本次采集的数据将作为app的后台数据使用,为了便于处理,直下载至本地,歌曲以UUID命名,如果采用中文命名,在后面HTTP请求数据解析音乐时,会让你乱码到怀疑人生哦!!! 歌曲的地址:https:// ...

  4. 利用浮动实现酷狗音乐主页布局2

    昨天写了基本的思路,今天用代码来看看实现的效果 页面的基本布局已经实现了: 接下来看看代码: 1.body结构: 2.CSS样式: 写到这里大的布局已经完成了.接下来我们就可以对左右盒子里面来布局.稍 ...

  5. 基于动态手势识别的酷狗音乐播放器控制

    动态手势识别控制酷狗音乐播放器,2011年第一天放上,算是给大家新年的祝福,新年快乐! 操作演示:http://v.youku.com/v_show/id_XMjMzNzQzOTYw.html 这是手 ...

  6. html播放音乐怎么隐藏,酷狗音乐隐藏的小秘密 咋让听歌更方便

    酷狗音乐播放器的小秘密 不知道大家有没有类似的习惯,当在使用一款易用度比较高的软件产品时,由于它的方便性,可能会让我们很少再去关注它的选项设置中的内容.酷狗音乐播放器就是这样的一款软件.不过当你点击使 ...

  7. Android QQ音乐/酷狗音乐锁屏控制实现原理,酷狗锁屏

    混乱的锁屏控制 Android自4.0版本, 也就是API level 14开始, 加入了锁屏控制的功能, 相关的类是RemoteControlClient, 这个类在API level 21中被标记 ...

  8. QQ音乐/酷狗音乐锁屏控制实现原理

    我实现的效果 混乱的锁屏控制 Android自4.0版本, 也就是API level 14开始, 加入了锁屏控制的功能, 相关的类是RemoteControlClient, 这个类在API level ...

  9. 酷狗音乐的大数据实践

    2015-06-03 王劲 高可用架构 高可用架构 此文是根据酷狗音乐大数据架构师王劲在[QCON高可用架构群]中的分享内容整理而成,转发请注明出处. 王劲:目前就职酷狗音乐,大数据架构师,负责酷狗大 ...

  10. 【图文直播全文记录】酷狗音乐的大数据实践(纯干货)

    http://mp.weixin.qq.com/s/alpEZ7-dMrgn3fwJxwmPwg 此文是根据酷狗音乐大数据架构师王劲在[QCON高可用架构群]中的分享内容整理而成,转发请注明出处. 王 ...

最新文章

  1. ssh(Struts+spring+Hibernate)三大框架整合-简述
  2. vs code php html,vscode如何调试html
  3. FastDFS 使用经验分享
  4. 程序员的个人发展注意事项
  5. Oracle新建用户赋只读某几张表的权限
  6. 中国大数据争夺战已进入前所未有的高度
  7. 三星Galaxy S21纪念版开启预售:“海洋蓝”配色+金色中框
  8. python产品发布会_大型发布会现场的 Wi-Fi 应该如何搭建?
  9. 关于不过洋节的通知_国家有规定不许过圣诞节等洋节吗?
  10. 算法题——投篮比赛获胜的概率
  11. extjs 月份选择控件_Ext JS 4实现带week(星期)的日期选择控件(实战二)
  12. LVM卷管理及配额设置
  13. notes ExcelHome-excel2010应用大全
  14. 远程网络教学系统用例图
  15. 传送网SDN化再上台阶 中联通将全面开启T-SDN商用
  16. matlab三角形外接圆
  17. AD快捷键、常见问题汇总
  18. C语言函数指针调用函数
  19. STM32_RTC晶振不起振的原因及解决方法
  20. 关于相干信号的阵列处理

热门文章

  1. 减少资源占用 Vista操作系统瘦身大法
  2. C++ + win32 + STL 写的QQ连连看外挂
  3. 二元关系:(自反,对称,传递)关系的求逆与闭包
  4. VirtualBox 0X00000000指令引用的0X00000000内存该内存不能为written
  5. python神经网络模型调用后预测值不变_用R语言实现神经网络预测股票实例
  6. paper report: DIRT-T
  7. 量子计算的人才、软件和硬件:解开你对量子的困惑
  8. HDU 5336 BFS
  9. Charles开启代理后手机无法上网
  10. c语言中的矩阵求逆程序,C语言矩阵求逆