AUTOHOTKEY | WinMove | 首选虚拟桌面

AUTOHOTKEY | WinMove | 首选虚拟桌面
更新声明:20181118@205016@SUN 有人建议手动聚焦我选择的虚拟桌面,但这会阻止我在另一个虚拟桌面上执行其他任务。仍在等待有效的自处理解决方案。
更新声明:20181118@210851@SUN autohotkey 无法在没有 dll 调用的情况下自行将应用程序移动到特定的虚拟桌面(*见下文*)。换句话说,目前需要使用 dll 文件,这是 Windows 语言,不像 ahk 语句那么方便。谁知道呢,也许 ahk 有一天可以实现此功能以保持其轻量级并将其添加到他们的语句库中。
更新声明:20190509@212923@THU @Shayan 建议使用 sdias-win10virtualdesktopenhancer 作为管理窗口和虚拟桌面的方式。
规格:
WIN10_1803_17134.407
autohotkeyahk_1.1.30.00_20180822

为了这个主题我已经有 5 个月没有使用过虚拟桌面了。

虚拟桌面并没有使导航变得更容易,也许有些人会喜欢清晰的壁纸视图,但我不会。

我为什么使用 AHK

在 Windows 10 中使用 Autohotkey 打开常用应用程序,不会重复打开已启动的程序(如果胜利不存在)。然后,将它们移动到我希望每个应用程序所在的位置(温莫夫我已经设置了一个计时器(睡觉)因为有些应用程序的打开速度比其他应用程序慢(我很想知道是否有更好的方法可以做到这一点)。我喜欢 ahk,因为它非常轻量,但是 Windows 10 相关的功能没有记录在案,例如虚拟桌面参与。

问题

问题是没有办法WinMove为 win10 指定虚拟桌面来启动应用程序。因此我努力运行我的应用程序frequentlyusedapps-script并进入另一个虚拟桌面来同时打开其他应用程序。这是因为我关注的虚拟桌面就是我的常用应用程序脚本将窗口移动到。

问题

如何让自动热键将应用程序移动到我选择的虚拟桌面?我不认为这可行,ahk-WinMove如果没有创建虚拟桌面编号,那么脚本显然无法移动应用程序,但这不是我现在关注的重点。否则,我可以在启动我的应用程序之前创建适当数量的虚拟桌面oftenusedapps-脚本。我所说的 ahk 实现此目的的方法是指使用纯 ahk 代码,而不是可能由于不幸的原因而无法更新的分叉/分支。如果它确实必须来自分支项目,那么让我们讨论一下他们使用哪些 ahk 元素来让虚拟桌面将窗口移动到特定窗口。

!^+o::
  如果WinNotExist,ahk_exe程序1.exe
    运行“C:\Dir\program1.exe”
    WinWait,ahk_exe 程序1.exe
    WinMove,ahk_exe 程序 1.exe,953,61,967,1019
    TrayTip,打开常用应用程序,确定,1,
  如果WinNotExist,ahk_exe程序2.exe
    运行“C:\Dir\program2.exe”
    WinWait,ahk_exe 程序2.exe
    WinMove,ahk_exe 程序 2.exe,,-7,61,813,516
    TrayTip,打开常用应用程序,确定,1,

解决方案

  • 正如 @miroxlav 所说,“Autohotkey 根本无法通过其当前的语句来做到这一点。“虽然并非不可能,但需要付出更多努力,因为现在的 Windows 语言使用带有 dll 调用的 ahk。
    • 如果有人能展示这是如何运作的,那将会有很大帮助
笔记

答案1

根据这个答案,您将能够使用 / 将当前窗口移动到下一个/上一个虚拟桌面Win1Win2

我知道有两种方法可以实现这一点,我更喜欢方法 1,因为它可以更好地兼容 Windows 版本/构建。

方法 1(新):使用德国汽车工业协会

#Include %A_ScriptDir%\VD.ahk\VD.ahk

MoveCurrentWindowToPrevDesktop(){
    currDeskNum := VD.getCurrentDesktopNum()
    if (currDeskNum != 1) {
        WinGet, ActivateMePls, PID , A
        VD.goToDesktopNum(VD.MoveWindowToRelativeDesktopNum("A", -1))
        WinActivate, ahk_pid %ActivateMePls%
    }
}
MoveCurrentWindowToNextDesktop(){
    currDeskNum := VD.getCurrentDesktopNum()
    totalDeskCount := VD.getCount()
    if (currDeskNum != totalDeskCount) {
        WinGet, ActivateMePls, PID , A
        VD.goToDesktopNum(VD.MoveWindowToRelativeDesktopNum("A", 1))
        WinActivate, ahk_pid %ActivateMePls%
    }
}
#3::MoveCurrentWindowToPrevDesktop()
#4::MoveCurrentWindowToNextDesktop()



方法 2(旧答案):使用虚拟桌面访问器

根据你使用的 Windows 10 版本(你可以使用 winver 检查,在开始菜单中搜索),下载正确的x64 版本

例如如果你使用 1803 下载

如果你使用的是 1809,请下载

更新:此 DLL 的最新版本应该适用于 Windows 10 的最新更新和 Windows 11 的某些版本。

创建一个新的 ahk 脚本,并将您下载的 dll 文件和刚刚创建的脚本放在同一个文件夹中。

将其复制粘贴到您的脚本中:

#SingleInstance Force

VDALoc := A_ScriptDir "\VirtualDesktopAccessor.dll"

hVirtualDesktopAccessor := DllCall("LoadLibrary", Str, VDALoc, "Ptr") 
GoToDesktopNumberProc := DllCall("GetProcAddress", Ptr, hVirtualDesktopAccessor, AStr, "GoToDesktopNumber", "Ptr")
GetCurrentDesktopNumberProc := DllCall("GetProcAddress", Ptr, hVirtualDesktopAccessor, AStr, "GetCurrentDesktopNumber", "Ptr")
MoveWindowToDesktopNumberProc := DllCall("GetProcAddress", Ptr, hVirtualDesktopAccessor, AStr, "MoveWindowToDesktopNumber", "Ptr")
activeWindowByDesktop := {}

MoveCurrentWindowToPrevDesktop() {
    global MoveWindowToDesktopNumberProc, GoToDesktopNumberProc, activeWindowByDesktop, GetCurrentDesktopNumberProc
    current := DllCall(GetCurrentDesktopNumberProc, UInt)
    WinGet, activeHwnd, ID, A
    if (current = 0) {
        return
    } else {
        activeWindowByDesktop[current - 1] := 0 ; Do not activate
        DllCall(MoveWindowToDesktopNumberProc, UInt, activeHwnd, UInt, current - 1)
        Send, {Blind}{Ctrl Down}{LWin Down}{Left Down}{Left Up}{LWin Up}{Ctrl Up}
    }
    return
}

MoveCurrentWindowToNextDesktop() {
    global MoveWindowToDesktopNumberProc, GoToDesktopNumberProc, activeWindowByDesktop, GetCurrentDesktopNumberProc
    current := DllCall(GetCurrentDesktopNumberProc, UInt)
    WinGet, activeHwnd, ID, A
    if (current = 3) {
        return
    } else {
        activeWindowByDesktop[current + 1] := 0 ; Do not activate
        DllCall(MoveWindowToDesktopNumberProc, UInt, activeHwnd, UInt, current + 1)
        Send, {Blind}{Ctrl Down}{LWin Down}{Right Down}{Right Up}{LWin Up}{Ctrl Up}
    }
    return
}

#1::MoveCurrentWindowToPrevDesktop()
#2::MoveCurrentWindowToNextDesktop()

答案2

使用键盘快捷键。

在脚本中,当您按顺序启动应用程序时,在序列的中间只需通过发送 ++ 即可切换到下Ctrl一个Win桌面

;here you run and position your windows
Run app1
Move app1  'etc.
WinWait app1window   'wait until app window is open

;switch to next desktop*  (see note below the code)
Send ^#{Right}

;opening apps on next desktop
Run app2
Move app2  'etc.

*) 如果您当时没有准备“下一个桌面”,请发送++Ctrl来创建并打开它。AltD

更多信息,请参阅章节虚拟桌面键盘快捷键在官方Windows 键盘快捷键列表


更新:

您请求的其他桌面功能目前不直接出现在 AHK 语句中。您可以通过使用从 AHK 内部调用 DLL

答案3

下面是我的 AutoHotKey 函数,它将窗口从当前桌面移动到相邻桌面(如果当前只有一个桌面,则移动到新桌面)。

这不是一个真正的答案,因为它没有提供选择要移动到哪个桌面,但却满足了我对配置应用程序以登陆特定桌面的迫切需求。

它是纯 AutoHotKey 脚本代码,因为它不依赖于第三方 DLL。例如,它不是取决于虚拟桌面访问器因为自 2021-05-01 起,有一个错误(停止在 Windows 10 build 20231 上工作 #33) 无法修复,直到微软提供稳定的 API

此解决方案慢的因为它需要大量的鼠标和键盘活动才能完成其目标,同时还需要睡眠才能工作。这也是为什么它很适合使用的另一个原因虚拟桌面访问器而是一旦有可能就立即执行。但如果您需要将多个窗口定位到特定桌面,至少这提供了一种自动化方法,只要您愿意等待它在每个窗口上执行该操作即可。

我对此进行了测试,测试版本为 Windows 10 版本 1909(操作系统内部版本 18363.1441)。

; MoveWindowToOtherDesktop(title)
;
;  Move a window to some other desktop.
;
;  Example usage:
;
;    pid := MoveWindowToOtherDesktop("window title here")
;    if !pid
;    {
;      MsgBox, Could not find the window.
;    }
;
MoveWindowToOtherDesktop(title)
{
  WinGet, pid, PID, %title%
  if (pid)
  {
    ; Activate the window so that it will be the first one in the
    ; upper left corner in the windows shown in the Task View, right
    ; under the desktops in the first row:
    WinActivate, %title%

    ; Sent Win+Tab to open up the Task View:
    Send, #{Tab}

    ; Wait for it to be active:
    WinWaitActive, Task

    ; Move mouse cursor into that upper left window
    ;   You will have to adjust these coordinates for the size of your monitor:
    MouseMove, 300, 300

    ; For some reason, we need to sleep here, as otherwise the right
    ; mouse click opens the menu but then it quickly
    ; disappears. Reason unknown:
    Sleep, 500

    ; Click right mouse button to bring up the context menu:
    Click, Right

    ; Another little sleep is needed here again as otherwise the first {Down} arrow is somehow ignored:
    Sleep, 500

    ; Send two down arrows to get to "Move to":
    Send, {Down}{Down}

    ; Another little sleep is needed here again for similar reasons as above:
    Sleep, 500

    ; Send one right arrow to get to the selection of the desktops:
    Send, {Right}

    ; Another little sleep is needed here again for similar reasons as above:
    Sleep, 500

    ; Send Enter key to select whatever desktop happens to be there in that position:
    ;
    ;   Note: If there is no desktop to the right, the menu entry will
    ;   point to Desktop 1 and that is the desktop the window will be
    ;   moved to. There is a "New Desktop" menu entry, but it seems
    ;   impossible to select it (Up/Down arrows rotate, and Home/End
    ;   are not recognized).
    ;
    Send, {Enter}

    ; Exit Task View:
    Send, {Esc}

    return %pid%
  }
  return
}

答案4

我使用以下脚本来通过 AHK 更好地管理工作区:

; Workspace menagement
;; Mask office opening with Shift+Alt+Ctrl+Win
#^!Shift::
#^+Alt::
#!+Ctrl::
^!+LWin::
^!+RWin::
Send {Blind}{vk07}
return

;; Ctrl-Alt-Shift-Arrow for moveing window to next workspace
!^+Right::
; Get current window
WindowId := WinExist("A")
if (WindowId) {
    ; Hide the window and show it again in in the next workspace
    WinHide ahk_id %WindowId%
    ; Use Blind and alt and shift up so that only ctrl and win are active
    Send {Blind}{Alt up}{Shift up}^#{Right}
    WinShow ahk_id %WindowId%
    WinActivate ahk_id %WindowId%
}
return

!^+Left::
; Get current window
WindowId := WinExist("A")
if (WindowId) {
    ; Hide the window and show it again in in the next workspace
    WinHide ahk_id %WindowId%
    ; Use Blind and alt and shift up so that only ctrl and win are active
    Send {Blind}{Alt up}{Shift up}^#{Left}
    WinShow ahk_id %WindowId%
    WinActivate ahk_id %WindowId%
}
return

;; Ctrl-Alt-Arrow for chaning workspaces
!<^>Right::
Send ^#{Right}
return

!<^>Left::
Send ^#{Left}
return

我发现隐藏窗口、更改工作区并再次打开它是将窗口移动到下一个工作区的最干净、最可靠的方法

相关内容