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

105 篇文章 5 订阅

==================最新版本====================

1、请ahk官网下载ahk环境,约3M,安装u32版本。

2、将本脚本存成.ahk文件,双击运行。

3、热键说明Capslock+[为上一首

Capslock+]  为下一首

Capslock+|  为播放/暂停

Capslock+d 为收藏/取消收藏

;功能:用ACC技术控制酷狗播放器
;作者:sunwind
;微信:sunwind1576157
;版本:V0.2
;发布地址:https://blog.csdn.net/liuyukuan/article/details/108029699
;2021年11月2日优化:适应酷狗新版本2021/2/19  9229(0.2.35) ,以及以后的2021/9/23 10021

#Persistent
#SingleInstance,force
SetBatchLines,-1
SetTitleMatchMode, 2
Run "C:\Program Files (x86)\KuGou\KGMusic\KuGou.exe"

;播放上一首
CapsLock & [::酷狗音乐("上一首")
;播放下一首
CapsLock & ]::酷狗音乐("下一首")

;播放/暂停
CapsLock & |::
AccKugo := Acc_ObjectFromWindow(WinExist("酷狗音乐 ahk_class kugou_ui"))
if (GetElementByName(AccKugo, "播放").accName(0)="播放")
	酷狗音乐("播放")
else
	酷狗音乐("暂停")
return

;收藏/取消收藏
CapsLock & d::
AccKugo := Acc_ObjectFromWindow(WinExist("酷狗音乐 ahk_class kugou_ui"))
if (GetElementByName(AccKugo, "我喜欢").accName(0)="我喜欢")
	酷狗音乐("我喜欢")
else
	酷狗音乐("取消喜欢")
return

酷狗音乐(命令)
{
	AccKugo := Acc_ObjectFromWindow(WinExist("酷狗音乐 ahk_class kugou_ui"))
	GetElementByName(AccKugo, 命令).accDoDefaultAction(0)
	return
}

GetElementByName(AccObj, name) {
   if (AccObj.accName(0) = name)
      return AccObj
   
   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetElementByName(v, name))
         return obj
}

; The code below is part of the Acc.ahk Standard Library by Sean (updated by jethrow)
; Found at http://autohotkey.com/board/topic/77303-/?p=491516

Acc_Init()
{
	static h
	If Not h
		h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
Acc_ObjectFromWindow(hWnd, idObject = 0)
{
	Acc_Init()
	If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
	Return ComObjEnwrap(9,pacc,1)
}
Acc_Query(Acc) {
	Try Return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}
Acc_Children(Acc) {
	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)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
			Return Children.MaxIndex()?Children:
		} Else
			ErrorLevel := "AccessibleChildren DllCall Failed"
	}
}

==================以下为早期版本====================

1、先识别,再绑定热键

2、利用ACC技术来识别非标窗口的按钮, 需要用 Accview工具查看按钮的Name属性

3、全部源代码如下,F4键绑定为播放/暂停功能,其它热键类同:

;功能:用ACC技术控制酷狗播放器
;作者:sunwind
;微信:sunwind1576157
;版本:V0.1

#Persistent
#SingleInstance,force
SetBatchLines,-1
SetTitleMatchMode, 2

F2::酷狗音乐("上一首")
F3::酷狗音乐("下一首")
F4::酷狗音乐("播放/暂停")
F5::酷狗音乐("我喜欢")
return

酷狗音乐(命令)
{
	AccKugo := Acc_ObjectFromWindow(WinExist("酷狗音乐 ahk_class kugou_ui"))
	GetElementByName(AccKugo, 命令).accDoDefaultAction(0)
	return
}

GetElementByName(AccObj, name) {
   if (AccObj.accName(0) = name)
      return AccObj
   
   for k, v in Acc_Children(AccObj)
      if IsObject(obj := GetElementByName(v, name))
         return obj
}

; The code below is part of the Acc.ahk Standard Library by Sean (updated by jethrow)
; Found at http://autohotkey.com/board/topic/77303-/?p=491516

Acc_Init()
{
	static h
	If Not h
		h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}
Acc_ObjectFromWindow(hWnd, idObject = 0)
{
	Acc_Init()
	If DllCall("oleacc\AccessibleObjectFromWindow", "Ptr", hWnd, "UInt", idObject&=0xFFFFFFFF, "Ptr", -VarSetCapacity(IID,16)+NumPut(idObject==0xFFFFFFF0?0x46000000000000C0:0x719B3800AA000C81,NumPut(idObject==0xFFFFFFF0?0x0000000000020400:0x11CF3C3D618736E0,IID,"Int64"),"Int64"), "Ptr*", pacc)=0
	Return ComObjEnwrap(9,pacc,1)
}
Acc_Query(Acc) {
	Try Return ComObj(9, ComObjQuery(Acc,"{618736e0-3c3d-11cf-810c-00aa00389b71}"), 1)
}
Acc_Children(Acc) {
	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)+8, child:=NumGet(varChildren,i), Children.Insert(NumGet(varChildren,i-8)=9?Acc_Query(child):child), NumGet(varChildren,i-8)=9?ObjRelease(child):
			Return Children.MaxIndex()?Children:
		} Else
			ErrorLevel := "AccessibleChildren DllCall Failed"
	}
}

以下是网友飞跃写的代码,考虑了不同版本酷狗的兼容性问题,供参考:

/*
;-----------------------------------
;  ACC控制酷狗音乐 - By FeiYue
;
;  备注:热键可以改为自己喜欢的
;-----------------------------------
*/

#NoEnv

;-- 获取【Acc路径】及其他信息
F1::
obj:=Acc_GetInfoUnderCursor()
MsgBox, 4096,, % "Path = " obj.Path
    . "`nTitle = " obj.Title "`nClass = " obj.Class
    . "`nRole = " obj.Role "`nState = " obj.State
    . "`nName = " obj.Name "`nValue = " SubStr(obj.Value,1,100)
return

;-- 获取所有【Acc路径】及文本
F8::
MouseGetPos,,, id
MsgBox, 4096,, % Clipboard:=""
    . Acc_GetAllText(id, info:={role:"", name:"", value:""})
return

F2:: 酷狗音乐("上一首")

F3:: 酷狗音乐("下一首")

F4:: 酷狗音乐("播放/暂停")

F5:: 酷狗音乐("我喜欢")


酷狗音乐(命令)
{
    SetBatchLines, -1
    SetTitleMatchMode, 2
    DetectHiddenWindows, On
    WinGet, List, List, 酷狗音乐 ahk_exe KuGou.exe
    IfLess, List, 1, return
    Loop, % List
    {
        id:=List%A_Index%
        WinGetPos,,, w, h, ahk_id %id%
        if (A_Index=1 or w*h>max)
            okid:=id, max:=w*h
    }

    酷狗9:={ "上一首"   : "4.2.X.16.1|4.3.X.16.1"
          , "播放/暂停" : "4.2.X.16.2|4.3.X.16.2"
          , "下一首"    : "4.2.X.16.3|4.3.X.16.3"
          , "我喜欢"    : "4.2.X.15.1|4.3.X.15.1" }

    酷狗8:={ "上一首"   : "4.3.7.13.1"
          , "播放/暂停" : "4.3.7.13.3"
          , "下一首"    : "4.3.7.13.2"
          , "我喜欢"    : "4.3.7.X.5" }

    For k,v in [酷狗9, 酷狗8]
    For k2,v2 in StrSplit(v[命令], "|")
    if (arr:=Acc_GetObjectFromPath(okid, v2, {name:命令}))
    {
        Try arr[1].accDoDefaultAction(arr[2])
		msgbox % arr[2]
        return
    }
}


;==================================================


Acc_GetAllText(hwnd, info="", first=1)
{
    static arr, text
    if (first)
        arr:=[], text:="", hwnd:=Acc_ObjectFromWindow(hwnd, 0)
    arr.Push(0)
    For i,v in Acc_Children(Acc:=hwnd)
    {
        arr[arr.length()]++, path:=""
        Loop, % arr.length()
            path.=(A_Index=1 ? "" : ".") . arr[A_Index]
        Role:=Name:=Value:="", j:=IsObject(v)
        Try Role:=j ? v.accRole(0) : Acc.accRole(v)
        Try Name:=j ? v.accName(0) : Acc.accName(v)
        Try Value:=j ? v.accValue(0) : Acc.accValue(v)
        path:=j ? path : RegExReplace(path, "(\w+)$", "c$1")
        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,60)
            . "][" SubStr(Value,1,60) "]`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)
        return
    Loop, Parse, path, ., c C
    {
        if !IsObject(Acc:=v)
            return
        if (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 arr
            return
        }
        if (j:=Acc.accChildCount)<i or (j<1)
            return
        v:=Acc_Children(Acc,i)
    }
    Role:=Name:=Value:="", j:=IsObject(v)
    Try Role:=j ? v.accRole(0) : Acc.accRole(v)
    Try Name:=j ? v.accName(0) : Acc.accName(v)
    Try 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)
        return (j ? [v,0] : [Acc,v])
}

Acc_GetInfoUnderCursor()
{
    ; MouseGetPos,,,, cid, 2
    ; SendMessage, WM_GETOBJECT:=0x3D, 0, 1,, ahk_id %cid%
    Acc:=Acc_ObjectFromPoint(child)
    Try Name:=Acc.accName(child)
    Try Value:=Acc.accValue(child)
    Try Role:=Format("0x{:X}", Acc.accRole(child))
    Try State:=Format("0x{:X}", Acc.accState(child))
    path:=Acc_GetAccPath(Acc, child, hwnd)
    WinGetTitle, title, ahk_id %hwnd%
    WinGetClass, class, ahk_id %hwnd%
    return { Path:path, Hwnd:hwnd, Title:title, Class:class
        , Name:Name, Value:Value, Role:Role, State:State }
}

Acc_GetAccPath(Acc, ChildID, ByRef hwnd)
{
    static DesktopHwnd:=DllCall("GetDesktopWindow", "ptr")
    hwnd:=PreHwnd:=t2:=""
    While AccHwnd:=Acc_WindowFromObject(Parent:=Acc_Parent(Acc))
    {
        t1:=(ChildID=0?"":"c") . Acc_GetEnumIndex(Acc, ChildID)
        if (PreHwnd!="" && AccHwnd!=PreHwnd)
            hwnd:=PreHwnd
        if (t1="" || AccHwnd=DesktopHwnd)
            Break
        t2:=t1 "." t2, PreHwnd:=AccHwnd
        , (ChildID=0 ? Acc:=Parent:""), ChildID:=0
    }
    return SubStr(t2,1,-1)
}

Acc_GetEnumIndex(Acc, ChildID=0)
{
    Role:=State:=Name:=""
    Try Role :=Acc.accRole(ChildID)
    Try State:=Acc.accState(ChildID)
    Try Name :=Acc.accName(ChildID)
    Pos:=Acc_Location(Acc,ChildID).pos
    Count:=Acc.accChildCount
    if (ChildID!=0)
    {
        For Each, child in Acc_Children(Acc)
        if !IsObject(child)
        {
            vRole:=vState:=vName:=""
            Try vRole :=Acc.accRole(child)
            Try vState:=Acc.accState(child)
            Try vName :=Acc.accName(child)
            if (vRole=Role) and (vState=State) and (vName=Name)
            and (Acc_Location(Acc,child).pos=Pos)
                return A_Index
        }
        return
    }
    For Each, child in Acc_Children(Acc_Parent(Acc))
    if IsObject(child)
    {
        vRole:=vState:=vName:=""
        Try vRole :=child.accRole(0)
        Try vState:=child.accState(0)
        Try vName :=child.accName(0)
        if (vRole=Role) and (vState=State) and (vName=Name)
        and (child.accChildCount=Count)
        and (Acc_Location(child).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
    {
        if RegExMatch(ChildPath,"\.[cC](\w+)$",r)
          ChildPath:=SubStr(ChildPath,1,-StrLen(r)), ChildID:=r1
        StringReplace, ChildPath, ChildPath, _, %A_Space%, All
        AccError:=Acc_Error(), Acc_Error(true)
        Loop, Parse, ChildPath, ., %A_Space%
            try
            {
                if A_LoopField is digit
                    Children:=Acc_Children(AccObj), m2:=A_LoopField ; mimic "m2" output in else-statement
                else
                    RegExMatch(A_LoopField, "(\D*)(\d*)", m)
                    , Children:=Acc_ChildrenByRole(AccObj, m1), m2:=(m2?m2:1)
                if Not Children.HasKey(m2)
                    throw
                AccObj := 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
            }
        Acc_Error(AccError)
        StringReplace, Cmd, Cmd, %A_Space%, , All
        properties.HasKey(Cmd)? Cmd:=properties[Cmd]:""
        try
        {
            if (Cmd = "Location")
                ret_val := Acc_Location(AccObj,ChildId+0).pos
            else if (Cmd = "Object")
                ret_val := AccObj
            else if Cmd in Role,State
                ret_val := Acc_%Cmd%(AccObj, ChildID+0)
            else if Cmd in ChildCount,Selection,Focus
                ret_val := AccObj["acc" Cmd]
            else
                ret_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)
    catch
        return
    return { 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.accParent
    return parent?Acc_Query(parent):""
}

Acc_Child(Acc, ChildId=0)
{
    try child:=Acc.accChild(ChildId)
    return child?Acc_Query(child):""
}

Acc_Init()
{
    Static h
    If (!h)
        h:=DllCall("LoadLibrary","Str","oleacc","Ptr")
}

Acc_WindowFromObject(pacc)
{
    Acc_Init()
    If  DllCall("oleacc\WindowFromAccessibleObject", "Ptr"
    , IsObject(pacc)?ComObjValue(pacc):pacc, "Ptr*", hWnd)=0
        return 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)=0
        return 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)=0
        return 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)=0
        return 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)=9)
                && (N=""||N=A_Index) ? Acc_Query(child):child )
                , (j ? ObjRelease(child):"")
            SetBatchLines, %bch%
            ListLines, %lls%
            return Children.MaxIndex()?(N=""?Children:Children[N]):""
        } else
            ErrorLevel := "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)+8, child:=NumGet(varChildren,i)
                if NumGet(varChildren,i-8)=9
                    AccChild:=Acc_Query(child), ObjRelease(child)
                    , Acc_Role(AccChild)=Role?Children.Push(AccChild):""
                else
                    Acc_Role(Acc, child)=Role?Children.Push(child):""
            }
            return Children.MaxIndex()?Children:"", ErrorLevel:=0
        } else
            ErrorLevel := "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:=0
    return p=""?setting:setting:=p
}

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: 你可以使用AutoHotkey编写一个脚本来实现在Windows 10上使用热键来隐藏/显示桌面图标。以下是一个简单的示例脚本: #NoEnv SendMode Input SetWorkingDir %A_ScriptDir% ; 隐藏桌面图标 ^!h:: DllCall("Shell32.dll\SHGetSetSettings", "ptr", , "ptr", x00000001, "ptr", , "uint", ) WinGetClass, ProgmanClass, Progman WinGetClass, WorkerWClass, WorkerW WinHide, ahk_class %ProgmanClass% WinHide, ahk_class %WorkerWClass% return ; 显示桌面图标 ^!s:: DllCall("Shell32.dll\SHGetSetSettings", "ptr", , "ptr", x00000002, "ptr", , "uint", ) WinGetClass, ProgmanClass, Progman WinGetClass, WorkerWClass, WorkerW WinShow, ahk_class %ProgmanClass% WinShow, ahk_class %WorkerWClass% return 在这个脚本中,我们使用了两个热键:Ctrl+Alt+H来隐藏桌面图标,Ctrl+Alt+S来显示桌面图标。当按下Ctrl+Alt+H时,脚本会调用Shell32.dll中的SHGetSetSettings函数来隐藏桌面图标,然后使用WinHide命令隐藏Progman和WorkerW窗口。当按下Ctrl+Alt+S时,脚本会调用SHGetSetSettings函数来显示桌面图标,然后使用WinShow命令显示Progman和WorkerW窗口。 请注意,这个脚本可能不适用于所有的Windows 10系统,因为不同的系统可能使用不同的窗口类名来表示桌面图标。如果你发现这个脚本不能正常工作,请尝试使用其他的窗口类名。 ### 回答2: 在Windows 10操作系统中,我们可以通过自定义热键来实现隐藏/显示桌面图标的功能。为此,我们需要先下载并安装AutoHotkey这一免费软件,然后新建一个AHK文件(后缀名为.ahk),在其中输入以下代码: #NoTrayIcon #Persistent #IfWinActive ahk_class Progman ^!d:: SendMessage 0x111, 0x7, 0, 0, , Progman Return 其中,“#NoTrayIcon”表示喊AutoHotkey将不会在系统托盘中显示图标,“#Persistent”则表示脚本将持续运行,“#IfWinActive ahk_class Progman”指定当桌面为当前活动窗口时才会生效。 然后,在代码中的“^!d::”后面,我们可以自定义所需的热键,这里的“^”表示Ctrl键,“!”表示Alt键,“d”表示D键,即组合键Ctrl+Alt+D。我们可以根据实际需求修改热键。发送消息“SendMessage 0x111, 0x7, 0, 0, , Progman”则实现了隐藏/显示桌面图标的功能。 当我们保存并运行该脚本后,在Windows 10操作系统中使用Ctrl+Alt+D组合键,即可实现隐藏/显示桌面图标的功能。需要注意的是,该脚本的效果不会立即生效,我们需要重新启动Windows Explorer程序或注销/重新登录才能看到效果。 总的来说,通过AutoHotkey软件自定义热键可以方便快捷地实现Windows 10系统中的各种功能,包括隐藏/显示桌面图标。但是需要注意的是,在操作时请确保准确按下组合键,以避免出现意外情况。 ### 回答3: 在Windows 10操作系统中,隐藏和显示桌面图标的方法有很多种,其中使用热键是一种方便快捷的方式。 首先,我们需要使用AutoHotkeyAHK)软件来定义一个热键AutoHotkey是一款小巧而强大的脚本语言软件,它可以让我们自定义各种热键和脚本,实现更为高效的电脑操作。如果没有安装AutoHotkey,我们需要先下载和安装此软件。 接着,我们打开AutoHotkey软件,右键点击桌面,选择“新建AutoHotkey脚本”,在打开的编辑器中书写以下代码: ^!h:: WinGet, exStyle, Style, ahk_class Progman If (exStyle & 0x100) { WinSet, Style, -0x100, ahk_class Progman WinGet, ExStyle, Style, ahk_class WorkerW WinSet, Style, -0x20, ahk_class WorkerW } Else { WinSet, Style, +0x100, ahk_class Progman WinGet, ExStyle, Style, ahk_class WorkerW WinSet, Style, +0x20, ahk_class WorkerW } 上述代码的含义是:按下Ctrl+Alt+H的热键,可以隐藏或显示桌面图标。当桌面图标处于显示状态时,按下此热键会隐藏桌面图标;反之,当桌面图标处于隐藏状态时,按下此热键会显示桌面图标。 最后,我们保存脚本,并双击打开它。接着,我们就可以使用Ctrl+Alt+H的热键快捷地隐藏或显示桌面图标了。当然,如果需要修改热键,可以在脚本中将“^!h”更改为其他热键。 总之,使用热键可以让我们更方便快捷地隐藏和显示桌面图标,极大地提高了我们的工作效率和操作体验。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值