最新解决办法:
; 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