AUTOHOTKEY | WinMove | Virtueller Desktop der Wahl

628
fohrums
AKTUALISIERT-STATEMENT: 20181118 @ 205016 @ SUN Es wurde vorgeschlagen, den virtuellen Desktop meiner Wahl manuell zu fokussieren. Dies macht es mir jedoch unmöglich, andere Aufgaben auf einem anderen virtuellen Desktop auszuführen. Wartet immer noch auf eine gültige Take-Care-of-Self-Lösung. UPDATED-STATEMENT: 20181118 @ 210851 @ SUN Autohotkey kann auf keinen Fall mit dem Verschieben von Apps auf einen bestimmten virtuellen Desktop ohne DLL-Aufrufe (* siehe unten *) arbeiten. Mit anderen Worten, die Verwendung von DLL-Dateien ist vorerst erforderlich, dh es ist Windows-Sprache und nicht so bequem wie eine ahk-Anweisung. Wer weiß, vielleicht kann ahk diese Funktion irgendwann implementieren, um sie leicht zu halten und sie ihrer Anweisungsbibliothek hinzuzufügen. 
SPEZIFIKATION: win10_1803_17134.407 autohotkeyahk_1.1.30.00_20180822 

Geschwindigkeit ist alles, wenn Sie auf Ihrem Stuhl vor einem Computerbildschirm sitzen.

Warum benutze ich AHK?

Verwenden Sie Autohotkey in Windows 10, um häufig verwendete Apps zu öffnen, die das Öffnen eines Programms nicht duplizieren, wenn es bereits gestartet wurde ( IfWinNotExist ). Verschieben Sie sie dann dorthin, wo jede App ( WinMove ) bevorzugt werden soll . Ich habe einen Timer ( Sleep ) eingestellt, weil einige Apps langsamer als andere geöffnet werden ( ich würde gerne wissen, ob es einen besseren Weg gibt, dies zu tun ). Ich mag ahk, wie leicht es ist, aber es gibt Windows 10-bezogene Funktionen, die von ihnen nicht dokumentiert werden, wie etwa die Einbindung von Virtual Desktop.

PROBLEM

Das Problem ist, dass es keine Möglichkeit gibt WinMove, einen virtuellen Desktop für win10 zum Starten einer Anwendung anzugeben. Daher kann ich michfrequentlyusedapps-script schwer tun, meinen virtuellen Desktop zu starten und einen anderen virtuellen Desktop aufzurufen, um andere Anwendungen gleichzeitig zu öffnen. Dies liegt daran, dass das, worauf ich mich bei Virtual Desktop konzentriere, mein häufig genutztes App-Skript das Fenster verschieben wird.

FRAGE

Wie kann eine Anwendung automatisch auf einen virtuellen Desktop meiner Wahl verschoben werden? Ich glaube nicht, dass dies mit möglich ist. ahk-WinMoveWenn die Virtualdesktop-Nummer nicht erstellt wird, kann das Skript die App natürlich nicht verschieben. Dies ist jedoch noch nicht mein Fokus. Ansonsten könnte ich vor dem Start meines frequentusedapps-Skripts die entsprechende Anzahl an virtuellen Desktops erstellen . Was ich damit verstehe, dass ahk dies erreichen kann, ist reiner ahk-Code und nicht Gabel / Zweig, der wahrscheinlich aus den unglücklichen Gründen nicht aktualisiert wird. Wenn es sich um ein verzweigtes Projekt handelt, sollten wir uns darüber unterhalten, welche ahk-Elemente sie verwenden, um Virtual Desktop einzubeziehen, um Fenster in ein bestimmtes Fenster zu verschieben.

! ^ + o :: IfWinNotExist, ahk_exe program1.exe Führen Sie "C: \ Dir \ program1.exe" aus WinWait, ahk_exe program1.exe WinMove, ahk_exe program1.exe ,, 953, 61, 967, 1019 TrayTip, openfrequentlyusedapps, ok, 1, IfWinNotExist, ahk_exe program2.exe Führen Sie "C: \ Dir \ program2.exe" aus. WinWait, ahk_exe program2.exe WinMove, ahk_exe program2.exe ,, -7, 61, 813, 516 TrayTip, openfrequentlyusedapps, ok, 1, 

LÖSUNG

  • Wie bei @miroxlav: " Autohotkey kann dies mit ihren aktuellen Anweisungen nicht. " Dies ist zwar nicht unmöglich, erfordert jedoch mehr Aufwand, da Windows jetzt ahk mit dll-Aufrufen verwendet.
    • Es würde jemandem helfen zu zeigen, wie das funktioniert
HINWEIS
0
Versuchen Sie https://github.com/sdias/win-10-virtual-desktop-enhancer user3419297 vor 5 Jahren 1
Ich wollte an den Wurzeln von ahk festhalten und nicht an einem Zweig, der von seinem Kern abweicht (* wegen Branding *). Was denkst du, verwendet dieser andere Enhancer, um Fenster auf einen anderen Desktop zu verschieben? Weil ich die Verwendung von DLL-Dateien bemerkt habe, die nicht mehr so ​​leicht ist. fohrums vor 5 Jahren 1
Was ist falsch an der Verwendung von DLL-Dateien, um die Ausführung von Aufgaben zu erleichtern oder sogar zu ermöglichen, wenn sie von einer sicheren Site stammen? Kein Programm kann alle Funktionen und Funktionen mit eigenen Modulen oder Ressourcen ausführen. Und DLL-Dateien sind Dateien, die bestimmten Code enthalten, den viele installierte Programme verwenden und freigeben. user3419297 vor 5 Jahren 0
Woher wissen Sie überhaupt, dass diese DLL-Dateien sogar gesichert sind? Wenn Sie dll-Dateien von einer anderen Software beziehen, bedeutet dies nur **, dass Sie die Software ** haben müssen, die nicht erhältlich ist, wenn Sie sie überhaupt nicht haben, insbesondere wenn Sie gerade kein Internet haben Sein. Ich meinte es wirklich ernst, als ich über die Verwendung von ahk sprach und es "leicht" sei. Ich brauche nur Hilfe zur Verwendung von DLL-Aufrufen und welche DLL-Dateien als * Abhängigkeiten * erforderlich sind, um Fenster auf einen bestimmten virtuellen Desktop zu verschieben. fohrums vor 5 Jahren 0

2 Antworten auf die Frage

2
miroxlav

Gehen Sie mit Tastenkombinationen.

Wenn Sie innerhalb des Skripts nacheinander Ihre Apps starten, wechseln Sie in der Mitte Ihrer Sequenz einfach zum nächsten Desktop, indem Sie Ctrl+ Win+ senden :

;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 ^#  ;opening apps on next desktop Run app2 Move app2 'etc. 

*) Wenn Sie diesen "nächsten Desktop" nicht vorbereitet haben, senden Sie Ctrl+ Alt+ D, um ihn zu erstellen und zu öffnen.

Weitere Informationen finden Sie im Abschnitt Tastenkombinationen für virtuelle Desktops in der offiziellen Liste der Windows-Tastenkombinationen .


Aktualisieren:

Die Funktionalität für andere Desktops ist auf Anfrage nicht direkt in AHK-Anweisungen vorhanden. Möglicherweise können Sie dies erreichen, indem Sie DLL-Aufrufe in der AHK verwenden .

Dies ist eine Aktion nach einer Aktion, die nur bedeutet, dass ich mich immer noch auf den Desktop konzentrieren muss, in dem die Fenster nach dem Öffnen landen sollen. Dadurch kann ich nicht mehr gleichzeitig auf einen anderen virtuellen Desktop gehen, um andere Aufgaben zu erledigen, während ich auf den Start langsamer Apps warte (* aber danke, dass Sie mich über ahk-WinWait informiert haben, also ersetzte ich stattdessen ahk-sleep *). fohrums vor 5 Jahren 0
Das ist kein Problem für mich, ich weiß nicht, warum es so wäre. [Virtual Desktop] (https://en.wikipedia.org/wiki/Virtual_desktop) ist wunderbar, weil er das Arbeiten auf mehreren Computern simulieren kann, aber nur ein einziges Rig verwendet. Ich weiß nicht, wie viele davon arbeiten können, aber dann würde ich einen anderen virtuellen Desktop verwenden, um weitere Apps zu öffnen. Ich hoffe, das beantwortet dir * Sorge. * fohrums vor 5 Jahren 0
Danke für die Hilfe @miroxlav, das musste ich nur wissen. Ich dachte, es gäbe einen versteckten Befehl, den ich ausgraben musste, um dies zu erreichen, aber es sieht aus, als wäre es fabelhaft neu. Ich denke, AHK könnte dies eines Tages möglich machen, da Windows 10 nun für über 3 Jahre veröffentlicht wurde. Virtual Desktop scheint nicht so schnell zu verschwinden, daher ist es gut, dass ich mit diesem Thema begonnen habe. fohrums vor 5 Jahren 0
0
user3419297

Versuche dies

#NoEnv #SingleInstance Force SetBatchLines -1 SetWorkingDir %A_ScriptDir%  main(), return  ; Ctrl + number from 1 to 9 switch_to_desktop: switchToDesktop(StrReplace(A_ThisHotkey, "^",, , 1) - 1) Focus() return  ; Ctrl + Win + number from 1 to 9 move_A_to_desktop: WinGet, active_id, ID, A If !IsWindowOnCurrentVirtualDesktop(active_id) return IniRead, active_desktop, active_desktop.ini, active_desktop, desktop  WinHide ahk_id %active_id% switchToDesktop(StrReplace(A_ThisHotkey, "^#",, , 1) - 1) WinShow ahk_id %active_id% switchToDesktop(active_desktop - 1)  return  ; Ctrl + Shift + number from 1 to 9 move_A_and_switch_to_desktop: WinGet, active_id, ID, A If !IsWindowOnCurrentVirtualDesktop(active_id) return WinHide ahk_id %active_id% switchToDesktop(StrReplace(A_ThisHotkey, "^+",, , 1) - 1) WinShow ahk_id %active_id% WinActivate, ahk_id %active_id% Focus() return  ; https://autohotkey.com/boards/viewtopic.php?f=6&t=14881&hilit=Virtual+Desktop switchToDesktop(idx) { global ppDesktopManager, IID_IVirtualDesktop DllCall(vtable(ppDesktopManager, 7), "Ptr", ppDesktopManager, "Ptr*", pDesktops) if (pDesktops) { DllCall(vtable(pDesktops, 4), "Ptr", pDesktops, "UInt", idx, "Ptr", &IID_IVirtualDesktop, "Ptr*", VirtualDesktop) if (VirtualDesktop) { DllCall(vtable(ppDesktopManager, 9), "Ptr", ppDesktopManager, "Ptr", VirtualDesktop) ObjRelease(VirtualDesktop) ; I assume these should be freed } ObjRelease(pDesktops) } If (idx = "") Index := 1 else Index := idx +1  IniWrite, %Index%, active_desktop.ini, active_desktop, desktop CoordMode, ToolTip, Screen ToolTip, Desktop %Index%, (A_ScreenWidth -20), 0 }  main() { OnExit, cleanup OnMessage(DllCall("RegisterWindowMessage", Str, "TaskbarCreated"), "WM_TASKBARCREATED") static ImmersiveShell := ComObjCreate("", "") global IID_IVirtualDesktop, ppDesktopManager  try ppDesktopManager := ComObjQuery(ImmersiveShell, "", "") if (!ppDesktopManager) ppDesktopManager := ComObjQuery(ImmersiveShell, "", "") GUID(IID_IVirtualDesktop, "") ObjRelease(ImmersiveShell)   Loop 9 { Hotkey, ^%A_Index%, switch_to_desktop Hotkey, ^#%A_Index%, move_A_to_desktop Hotkey, ^+%A_Index%, move_A_and_switch_to_desktop  } return  cleanup: if (ppDesktopManager) ObjRelease(ppDesktopManager) ExitApp }  WM_TASKBARCREATED() { Reload }  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) }  GUID(ByRef GUID, sGUID) { ; Converts a string to a binary GUID VarSetCapacity(GUID, 16, 0) DllCall("ole32\CLSIDFromString", "Str", sGUID, "Ptr", &GUID) }  Focus() { ; Give focus to the foremost window on the desktop. WinGet, id, list Loop, %id% { this_ID := id%A_Index% If IsWindowOnCurrentVirtualDesktop(this_ID) { WinActivate, ahk_id %this_ID% break } } }  ; https://autohotkey.com/boards/viewtopic.php?p=64295#p64295 ; Indicates whether the provided window is on the currently active virtual desktop. IsWindowOnCurrentVirtualDesktop(hWnd) { onCurrentDesktop := "" CLSID := ""  IID := "" IVirtualDesktopManager := ComObjCreate(CLSID, IID)  Error := DllCall(NumGet(NumGet(IVirtualDesktopManager+0), 3*A_PtrSize), "Ptr", IVirtualDesktopManager, "Ptr", hWnd, "IntP", onCurrentDesktop) ObjRelease(IVirtualDesktopManager)  if !(Error=0) return false, ErrorLevel := true return onCurrentDesktop, ErrorLevel := false }