使程序(特别是 chrome)在同一虚拟桌面上打开

Jan*_*rup 12 google-chrome virtual-desktop windows-10

Windows 有虚拟桌面,这很棒。我使用单独的桌面来处理我正在处理的不同事情。但是,如果我关闭程序(或重新启动),那么当我再次打开该程序时,该程序会出现在我当前所在的桌面上。所以我必须手动将程序移回来。

我想对于 chrome 来说它甚至更复杂,因为它是不同窗口的相同程序。如果窗口能够保留在关闭之前的桌面上,那就太好了。


与这些问题类似,我的问题要求记住窗口位置而不是明确设置它。

编辑(2022):所有这些解决方法现在似乎都是不必要的。Chrome 现在将在桌面上打开 Chrome 关闭时的窗口。

har*_*ymc 3

这可以通过下面的AutoHotKey脚本来完成,该脚本接受两个快捷键:

  • F11:将所有当前窗口的标题及其虚拟桌面编号写入脚本FILENAME 开头的参数指定的文本文件中。
  • F12:读取文本文件并将所有可以通过标题找到的窗口移动到指定的虚拟桌面。

将以下文本复制到.ahk文件中,可能会更改“FILENAME”、“F11”和“F12”。双击该文件以开始执行。它将在托盘栏中创建一个绿色的“H”图标,您可以右键单击该图标并选择Exit停止。如果您始终希望执行此脚本,请将其复制到位于 的用户启动文件夹中 C:\Users\<user name>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

该脚本需要从 Github 项目 windows-desktop-switcher下载 DLL VirtualDesktopAccessor.dll 并将其存储在与 AutoHotKey 脚本相同的文件夹中。它可能不适用于 1809 以下的 Windows 10 版本。

脚本本身如下,仅针对一台显示器进行编程。它不会创建虚拟桌面,因此应在运行之前创建虚拟桌面。它对我有用,但应该进行测试。由于它使用未记录的功能,因此它可能会在未来某个时候停止工作。

DetectHiddenWindows Off
SetTitleMatchMode, 2

FILENAME = C:\Temp\possaves.txt

hVirtualDesktopAccessor := DllCall("LoadLibrary", Str, "VirtualDesktopAccessor.dll", "Ptr") 
MoveWindowToDesktopNumberProc := DllCall("GetProcAddress", Ptr, hVirtualDesktopAccessor, AStr, "MoveWindowToDesktopNumber", "Ptr")
IsWindowOnDesktopNumberProc := DllCall("GetProcAddress", Ptr, hVirtualDesktopAccessor, AStr, "IsWindowOnDesktopNumber", "Ptr")

global numdesktops := GetDesktopsNumber()

F11::  ; Write list of "desktop@title"
EnumAddress := RegisterCallback("EnumWindowsProc", "Fast")
global numwins := 0
global file := FileOpen(FILENAME, "w")
DllCall("EnumWindows", "Ptr", EnumAddress, "Ptr", 0)
file.Close()
return

F12::  ; Read list and execute
global result
Loop, Read, %FILENAME%
{
    word_array := StrSplit(A_LoopReadLine, "@",, 2)  ; Omits periods.
    hwnd := WinExist(word_array[2])
    if (hwnd)
        DllCall(MoveWindowToDesktopNumberProc, UInt, hwnd, UInt, word_array[1] - 1)
}
return

GetDesktopsNumber()
{
    RegRead, cur, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\SessionInfo\1\VirtualDesktops, CurrentVirtualDesktop
    RegRead, alldesktops, HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VirtualDesktops, VirtualDesktopIDs
    return floor(strlen(alldesktops) / strlen(cur))
}

EnumWindowsProc(hwnd, lParam)
{
    WinGetTitle, title, ahk_id %hwnd%
    if title {
        desktopnum := GetHWNDDesktopNumber(hwnd)
        if (desktopnum >= 0) {
            numwins := numwins + 1
            line = % desktopnum "@" title "`r`n"
            file.Write(line)
        }
    }
    return true
}

GetHWNDDesktopNumber(hwnd)
{
  global  numdesktops, IsWindowOnDesktopNumberProc
  Loop, %numdesktops% {
    ix := A_Index - 1
    windowIsOnDesktop := DllCall(IsWindowOnDesktopNumberProc, UInt, hwnd, UInt, ix)
    if (windowIsOnDesktop == 1)
      return A_Index
  }
  return -1
}
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

5109 次

最近记录:

3 年 前