[AHK]Windows10中如何只通过键盘就将窗口移动到其他虚拟桌面?

105 篇文章 5 订阅

最新解决办法:

; Capslock + 数字  -->  切换桌面
; Capslock + Shift + 数字  -->  把当前窗口带到某桌面
; [Switch to desktop] OR [Move the current window to the X-th desktop]
Capslock & 1:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(1) 
else SwitchToDesktop(1)
Return
Capslock & 2:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(2) 
else SwitchToDesktop(2)
Return
Capslock & 3:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(3) 
else SwitchToDesktop(3)
Return
Capslock & 4:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(4) 
else SwitchToDesktop(4)
Return
Capslock & 5:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(5) 
else SwitchToDesktop(5)
Return
Capslock & 6:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(6) 
else SwitchToDesktop(6)
Return
Capslock & 7:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(7) 
else SwitchToDesktop(7)
Return
Capslock & 8:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(8) 
else SwitchToDesktop(8)
Return
Capslock & 9:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(9) 
else SwitchToDesktop(9)
Return
Capslock & 0:: 
If GetKeyState("Shift")
MoveActiveWindowToDesktop(10) 
else SwitchToDesktop(1)
Return
; Capslock & -:: 
;If GetKeyState("Shift")
;MoveActiveWindowToDesktop(11) 
;else SwitchToDesktop(1)
;Return
; Capslock & =:: 
;If GetKeyState("Shift")
;MoveActiveWindowToDesktop(12) 
;else SwitchToDesktop(1)
;Return

SwitchToDesktop(idx){
    if (!SwitchToDesktopByInternalAPI(idx)){
        TrayTip , WARN, SwitchToDesktopByHotkey
        SwitchToDesktopByHotkey(idx)
    }
}
SwitchToDesktopByHotkey(idx){
    SendInput ^#{Left 10}
    idx -= 1
    Loop %idx% {
        SendInput ^#{Right}
    }
}

SwitchToDesktopByInternalAPI(idx){
    succ := 0
    IServiceProvider := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{6D5140C1-7436-11CE-8034-00AA006009FA}")
    IVirtualDesktopManagerInternal := ComObjQuery(IServiceProvider, "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}", "{F31574D6-B682-4CDC-BD56-1827860ABEC6}")
    ObjRelease(IServiceProvider)
    if (IVirtualDesktopManagerInternal){
        GetCount := vtable(IVirtualDesktopManagerInternal, 3)
        GetDesktops := vtable(IVirtualDesktopManagerInternal, 7)
        SwitchDesktop := vtable(IVirtualDesktopManagerInternal, 9)
        ; TrayTip, , % IVirtualDesktopManagerInternal
        pDesktopIObjectArray := 0
        DllCall(GetDesktops, "Ptr", IVirtualDesktopManagerInternal, "Ptr*", pDesktopIObjectArray)
        if (pDesktopIObjectArray){
            GetDesktopCount := vtable(pDesktopIObjectArray, 3)
            GetDesktopAt := vtable(pDesktopIObjectArray, 4)
            DllCall(GetDesktopCount, "Ptr", IVirtualDesktopManagerInternal, "UInt*", DesktopCount)
            ; if idx-th desktop doesn't exists then create a new desktop
            if (idx > DesktopCount){
                diff := idx - DesktopCount
                loop %diff% {
                    Send ^#d
                }
                succ := 1
            }
            GetGUIDFromString(IID_IVirtualDesktop, "{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4}")
            DllCall(GetDesktopAt, "Ptr", pDesktopIObjectArray, "UInt", idx - 1, "Ptr", &IID_IVirtualDesktop, "Ptr*", VirtualDesktop)
            ObjRelease(pDesktopIObjectArray)
            if (VirtualDesktop){
                DllCall(SwitchDesktop, "Ptr", IVirtualDesktopManagerInternal, "Ptr", VirtualDesktop)
                ObjRelease(VirtualDesktop)
                succ := 1
            }
        }
        ObjRelease(IVirtualDesktopManagerInternal)
    }
    Return succ
}

vtable(ptr, n){
    ; NumGet(ptr+0) Returns the address of the object's virtual function
    ; table (vtable for short). The remainder of the expression retrieves
    ; the address of the nth function's address from the vtable.
    Return NumGet(NumGet(ptr+0), n*A_PtrSize)
}

GetGUIDFromString(ByRef GUID, sGUID) ; Converts a string to a binary GUID
{
    VarSetCapacity(GUID, 16, 0)
    DllCall("ole32\CLSIDFromString", "Str", sGUID, "Ptr", &GUID)
}

MoveActiveWindowToDesktop(idx){
    activeWin := WinActive("A")
    WinHide ahk_id %activeWin%
    SwitchToDesktop(idx)
    WinShow ahk_id %activeWin%
    WinActivate ahk_id %activeWin%
}

以下旧方案,遗弃。

先补充个题外话:如何定义Alt+1 为切换上一个虚拟桌面,Alt+2为切换下一个虚拟桌面

系统自动的Win+Ctr+←  以及Win+Ctr+→ 太难用了

!1::send  {CTRLDOWN}{LWINDOWN}{Left}{LWINUP}{CTRLUP}
!2::send  {CTRLDOWN}{LWINDOWN}{Right}{LWINUP}{CTRLUP

或者干脆简写成 

!1::Send ^#{left}
!2::Send ^#{right}

吃完开胃小菜,咱来个挑战:如何将当前窗口一到下一个虚拟桌面?

龙缘科技神林在MSDN上提问 Windows10中如何只通过键盘就将窗口移动到其他虚拟桌面?

如何通过键盘移动窗口至其他虚拟桌面?
Winkey+Tab以后一定要用到鼠标右键吗?纯键盘不可以吗?
我举例,比如Ctrl+Winkey+Alt+左右方向键(当然这现在是没用的)。最好是一个组合键就可以移动。
这样可以方便设置给键盘G键。
我现在只知道Ctrl+Winkey+左右方向键可以切换工作区,Ctrl+Winkey+Shift+全方向键可以移动窗口在当前桌面中的位置
但是我需要将窗口移动到其他工作区。
请问有什么单个组合键就能解决的快捷键吗?

龙缘科技神林看到官方人员不靠谱回答后的补充:

问题概括为:在任务视图下右键窗口移至桌面的功能,如何通过键盘实现。

官方不管,自己动手丰衣足食,ahker从来都是DIY

热键 Alt + →  把当前窗口 向右 移到虚拟桌面2 并切到  移到虚拟桌面2
热键 Alt + ←  把当前窗口 向左 移到虚拟桌面1 并切到  移到虚拟桌面1

[解决方案]

/*
作者:sunwind
时间:2019年10月23日17:33:29
最新版地址 https://blog.csdn.net/liuyukuan/article/details/102731088
用法:
热键 Alt + →  把当前窗口 向右 移到虚拟桌面2 并切到  移到虚拟桌面2
热键 Alt + ←  把当前窗口 向左 移到虚拟桌面1 并切到  移到虚拟桌面1  
*/

;Alt+→  从虚拟桌面1 把窗口移到 虚拟桌面2
alt & right::
send  {LWin down}{tab}{LWin up}
WinWaitActive,ahk_class Windows.UI.Core.CoreWindow
send {AppsKey}
Sleep,200
Send {Down 2}
Sleep,200
Send {Right 1}
Sleep,200
Send {Enter}
Sleep,200
Send {Enter 2}
Sleep,500
Send ^#{right}
return

;Alt+←  从虚拟桌面2 把窗口移到 虚拟桌面1
alt &  left::
send  {LWin down}{tab}{LWin up}
WinWaitActive,ahk_class Windows.UI.Core.CoreWindow
send {AppsKey}
Sleep,200
Send {Down 2}
Sleep,200
Send {Right 1}
Sleep,200
Send {Enter 2}
Sleep,500
Send ^#{left}
return

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答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操作系统,隐藏和显示桌面图标的方法有很多种,其使用热键是一种方便快捷的方式。 首先,我们需要使用AutoHotkey(AHK)软件来定义一个热键。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”更改为其他热键。 总之,使用热键可以让我们更方便快捷地隐藏和显示桌面图标,极大地提高了我们的工作效率和操作体验。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值