AUTOHOTKEY | WinMove | 虚拟桌面的选择


0
更新声明:20181118 @ 205016 @ SUN建议手动关注我选择的虚拟桌面,但这使我无法在另一个虚拟桌面上执行其他任务。仍在等待有效的照顾自己的解决方案。
更新声明:20181118 @ 210851 @ SUN如果没有dll-calls(*见下文*),autohotkey无法将应用程序移动到特定的虚拟桌面。换句话说,暂时使用dll文件是Windows语言,并不像ahk语句那样方便。谁知道,也许ahk有一天可以实现这个功能,以保持它的轻量级并将其添加到他们的语句库中。
UPDATED-TATEMENT:20190509 @ 212923 @ THU @Shayan建议使用sdias-win10virtualdesktopenhancer作为管理Windows和虚拟桌面的方法。
规格:
win10_1803_17134.407
autohotkeyahk_1.1.30.00_20180822

在此主题的5个月空闲时间之后,我现在已停止使用虚拟桌面。

虚拟桌面不会使导航变得更容易,也许某些人可以享受壁纸的清晰视图,但不是我。

为什么我使用AHK

在Windows 10中使用Autohotkey打开经常使用的应用程序,如果它已经启动(IfWinNotExist),它将不会重复打开程序。然后,将它们移动到我更喜欢每个应用程序的位置(WinMove)。我设置了一个计时器(睡眠),因为有些应用程序打开速度比其他应用程序慢(我有兴趣知道是否有更好的方法来执行此操作)。我喜欢ahk它的轻量级,但是有与Windows 10相关的功能没有记录,如虚拟桌面参与。

问题

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

如何让autohotkey将应用程序移动到我选择的虚拟桌面?我不认为ahk-WinMove如果没有创建virtualdesktop-number那么脚本显然无法移动应用程序,但这不是我的焦点。在启动我经常使用的应用程序脚本之前,我可以创建适当数量的虚拟桌面我的意思是为ahk实现这一点的方法是纯粹的ahk代码而不是fork / branch,由于不幸的原因可能不会更新。如果它必须来自一个分支项目,那么让我们讨论一下他们使用什么ahk元素来让Virtual Desktop将窗口移动到特定的一个。

!^ + O ::
  IfWinNotExist,ahk_exe program1.exe
    运行“C:\ Dir \ program1.exe”
    WinWait,ahk_exe program1.exe
    WinMove,ahk_exe program1.exe ,, 953,61,967,1019
    TrayTip,openfrequentlyusedapps,ok,1,
  IfWinNotExist,ahk_exe program2.exe
    运行“C:\ Dir \ program2.exe”
    WinWait,ahk_exe program2.exe
    WinMove,ahk_exe program2.exe ,, -7,61,813,516
    TrayTip,openfrequentlyusedapps,ok,1,

  • 根据@miroxlav,“ Autohotkey无法用他们当前的语句做到这一点。 ”虽然并非不可能,但需要更多的努力,因为现在Windows语言正在使用ahk w / dll-calls。
    • 这将有助于很多人能够展示这甚至是如何工作的
注意


1
我想坚持ahk的根源,而不是远离它的核心(由于品牌)。您如何看待这又一个增强器用于将窗口移动到另一个桌面?因为我注意到使用不再轻量级的dll文件了。
fohrums

如果来自安全站点,使用dll文件来促进甚至可以执行任务有什么问题?任何程序都无法使用自己的模块或资源执行其所有功能和各种功能。dll文件是包含许多已安装程序使用和共享的特定代码的文件。
3419297

你怎么知道那些在线的dll文件甚至是安全的?如果从另一个软件获取dll文件,那么这只意味着你必须拥有如果你没有首先获得它的软件,特别是如果你当时没有互联网。当我谈到使用ahk并且它是“轻量级”时,我真的是这个意思。我只需要帮助使用dll-calls以及需要什么dll文件作为依赖项来将窗口移动到特定的虚拟桌面。
fohrums

@fohrums使用Windows 10 Virtual Desktop Enhancer它具有您需要的所有功能。
Shayan

Answers:


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+ Alt+ D来创建并打开它。

有关更多信息,请参阅Windows键盘快捷键官方列表中的虚拟桌面键盘快捷键部分


更新:

当您请求时,其他桌面的功能目前不会直接出现在AHK语句中。您可以通过在AHK中使用DLL调用来实现它。


这是一个动作之后的一个动作,这只意味着我仍然需要专注于桌面我希望Windows一旦打开就会落地。当我等待慢速应用程序启动时,这使我无法同时进入另一个虚拟桌面执行其他任务(但是,感谢让我知道ahk-WinWait所以我用它代替了ahk-Sleep)。
fohrums

这对我来说不是问题,我不知道为什么会这样。虚拟桌面非常出色,能够模拟在多台计算机上工作,但只使用一台设备。我不知道有多少是可行的限制,但我会使用另一个虚拟桌面继续打开其他应用程序。我希望这能回答你的关注。
1818年

感谢@miroxlav的帮助,我只需要知道这一点。我认为有一些隐藏的命令,我必须挖掘才能实现这一点,但它看起来像是新的。我想有一天,当Windows 10已经发布超过3年时,AHK可以实现这一目标。Virtual Desktop似乎不会很快消失,所以我开始讨论这个话题。
fohrums

1

继这个答案,你将能够移动当前窗口到您的下一个/上一个虚拟桌面Win1/ Win2

您将需要VirtualDesktopAccessor

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

例如,如果你使用1803下载这个

或者,如果您使用的是1809,请下载此内容

创建一个新的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()
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.