web-dev-qa-db-ja.com

プログラム(具体的にはChrome)を同じ仮想デスクトップで開く

Windowsには素晴らしい仮想デスクトップがあります。私は自分が取り組んでいるさまざまなことに別々のデスクトップを使用しています。しかし、プログラムを閉じる(または再起動する)と、プログラムを再度開くと、現在使用しているデスクトップにプログラムが表示されます。そのため、手動でプログラムを元に戻す必要があります。

chromeは、同じプログラムでウィンドウが異なるため、さらに複雑になると思います。ウィンドウを閉じる前のデスクトップに置いておくと便利です。


これらの問題と同様に、明示的に設定するのではなく、ウィンドウの位置を覚えておくように求める私の質問の違いがあります。

3
Jan Stanstrup

これは、以下の AutoHotKey スクリプトを使用して実行できます。このスクリプトは、2つのショートカットキーを受け入れます。

  • 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より前のWindows10バージョンでは機能しない可能性があります。

スクリプト自体は以下にあり、1つのモニターに対してのみプログラムされています。仮想デスクトップは作成されないため、実行する前に作成する必要があります。それは私のために働いたが、テストされるべきである。文書化されていない機能を使用しているため、将来的には機能しなくなる可能性があります。

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
}
1
harrymc

Harrymcのソリューションを試しましたが、Win1064ビットv1903で正常に機能しました。このソリューションでは、異なる仮想デスクトップ(Fn + F11)で実行されている複数のChromeウィンドウを記録できます。再起動後にすべてのChromeウィンドウが同じ仮想デスクトップに表示される場合、 (Fn + F12)を使用すると、各Chromeウィンドウが記録された仮想デスクトップに送信されます。

10台の仮想デスクトップに分散された50個のChromeウィンドウを試してみました。ファイルの生成には2〜3秒かかりました。

@harrymc:ありがとうございました!何らかの理由で、ラップトップでFn + F11またはFn + F12を押す必要があります。 F11キーとF12キーだけでは、AutoHotKeyスクリプトの機能はトリガーされません。

1
MATT

現在、そのようなプレーンWindowsを構成する方法はありませんが、この問題は、VDesk( https://github.com/eksime/VDesk )と呼ばれるサードパーティの軽量ユーティリティを使用することで解決できます。特定の仮想デスクトップでプログラムを起動するショートカットを作成できます。

また、別の仮想デスクトップに切り替えずにプログラムを起動することもできます(実際には、手動でそのデスクトップに切り替えるまで、そのアプリを非表示にして実行します)。これは非常に便利な機能です。

特にChromeの場合、次のようなショートカットを作成することで(そしてクリックするだけで)、さまざまなデスクトップにさまざまなWindowsを作成できます。

vdesk on:3 run:"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" /new-window "https://superuser.com"

(上記はデスクトップ#3でsuperuser.comを実行します)

0
blami