AUTOHOTKEY | WinMove | Виртуальный рабочий стол на выбор

571
fohrums
ОБНОВЛЕНО-ЗАЯВЛЕНИЕ: 20181118 @ 205016 @ СОЛНЦЕ. Было предложено вручную настроить виртуальный рабочий стол по моему выбору, но это лишает меня возможности выполнять другие задачи на другом виртуальном рабочем столе. Все еще жду действующего решения по уходу за собой. ОБНОВЛЕННОЕ ЗАЯВЛЕНИЕ: 20181118 @ 210851 @ SUN AutoHockkey не может работать с перемещением приложений на конкретный виртуальный рабочий стол самостоятельно без вызовов dll (* см. Ниже *). Другими словами, использование dll-файлов на данный момент требуется на языке Windows и не так удобно, как инструкция ahk. Кто знает, может быть, когда-нибудь ahk сможет реализовать эту функцию, чтобы облегчить ее и добавить в свою библиотеку операторов. 
СПЕЦИФИКАЦИЯ: win10_1803_17134.407 autohotkeyahk_1.1.30.00_20180822 

Скорость это все, если она влияет на вас, сидя на стуле перед экраном компьютера.

ПОЧЕМУ Я ИСПОЛЬЗУЮ AHK

Использование Autohotkey в Windows 10 для открытия часто используемых приложений, которые не будут дублировать открытие программы, если она уже запущена ( IfWinNotExist ). Затем переместите их туда, где я предпочитаю каждое приложение ( WinMove ). Я установил таймер ( сон ), потому что некоторые приложения открываются медленнее, чем другие ( мне было бы интересно узнать, есть ли лучший способ сделать это ). Мне нравится ахк за его легкость, но есть функции, связанные с Windows 10, которые не документированы, например, участие в виртуальном рабочем столе.

ПРОБЛЕМА

Проблема в том, что нет способа использовать WinMoveвиртуальный рабочий стол для win10 для запуска приложения. Поэтому я изо всех силfrequentlyusedapps-script пытаюсь запустить мой и перейти на другой виртуальный рабочий стол, чтобы одновременно открывать другие приложения. Это потому, что то, на чем я всегда фокусируюсь на Virtual Desktop, это то, на что мой часто используемый скрипт приложения будет перемещать окно.

ВОПРОС

Как заставить autohotkey переместить приложение на виртуальный рабочий стол по моему выбору? Я не думаю, что это возможно в ahk-WinMoveслучае, если virtualdesktop-number не создан, тогда скрипт, очевидно, не сможет переместить приложение, но это пока не моя задача. В противном случае я мог бы создать соответствующее количество виртуальных рабочих столов до запуска моего часто используемого скрипта apps. То, что я имею в виду, имея способ добиться этого с помощью ahk, - это чистый код ahk, а не ветвь / ветвь, которая, вероятно, не будет обновлена ​​по неудачным причинам. Если это действительно должно происходить из разветвленного проекта, давайте обсудим, какие элементы ahk они используют, чтобы задействовать Virtual Desktop для перемещения окон к конкретному.

! ^ + О :: IfWinNotExist, ahk_exe program1.exe Запустите "C: \ Dir \ program1.exe" WinWait, ahk_exe program1.exe WinMove, ahk_exe program1.exe ,, 953, 61, 967, 1019 TrayTip, часто используемые приложения, хорошо, 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, часто используемые приложения, хорошо, 1, 

РЕШЕНИЕ

  • Согласно @miroxlav, «у Autohotkey нет способа сделать это с их текущими утверждениями». Хотя это и не невозможно, но требует больше усилий, поскольку сейчас язык Windows использует ahk w / dll-звонки.
    • Это поможет многим людям показать, как это работает.
НОТА
0
Попробуйте https://github.com/sdias/win-10-virtual-desktop-enhancer user3419297 5 лет назад 1
Я хотел придерживаться корней ахка, а не ветви от его ядра (* из-за брендинга *). Как вы думаете, что еще один энхансер использует для перемещения окон на другой рабочий стол? Потому что я заметил использование dll-файлов, которые больше не легкие. fohrums 5 лет назад 1
Что плохого в использовании dll-файлов для облегчения или даже возможности выполнения задач, если они приходят с безопасного сайта? Ни одна программа не может выполнять все свои функции и различные функции, используя свои собственные модули или ресурсы. И dll-файлы - это файлы, которые содержат определенный код, который используют и разделяют многие установленные программы. user3419297 5 лет назад 0
Откуда ты вообще знаешь, что эти dll-файлы онлайн даже защищены? Если вы получаете dll-файлы из другого программного обеспечения, то это означает только, что ** у вас должно быть программное обеспечение **, которое невозможно получить, если у вас его нет, особенно если у вас нет Интернета в то время бытия. Я действительно имел в виду это, когда я говорил об использовании ахк, и это «легкий». Мне просто нужна помощь по использованию dll-вызовов и какие dll-файлы требуются как * зависимости * для перемещения окон на конкретный виртуальный рабочий стол. fohrums 5 лет назад 0

2 ответа на вопрос

2
miroxlav

Перейти с сочетаниями клавиш.

Внутри скрипта, когда вы последовательно запускаете свои приложения, в середине вашей последовательности просто переключитесь на следующий рабочий стол, отправив 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 ^#  ;opening apps on next desktop Run app2 Move app2 'etc. 

*) Если у вас не подготовлен этот «следующий рабочий стол» в то время, вместо этого отправьте Ctrl+ Alt+, Dчтобы создать и открыть его.

Дополнительные сведения см. В разделе « Сочетания клавиш виртуальных рабочих столов» в официальном списке сочетаний клавиш Windows .


Обновить:

Функциональность, относящаяся к другим рабочим столам по вашему запросу, в настоящее время отсутствует непосредственно в отчетах AHK. Вы можете достичь этого, используя вызовы DLL из AHK .

Это действие после действия, которое только означает, что я все еще должен быть сосредоточен на рабочем столе. Я хочу, чтобы окна, как оказалось, приземлялись при открытии. Это избавляет меня от необходимости одновременно переходить на другой виртуальный рабочий стол для выполнения других задач, пока я ожидаю запуска медленных приложений (* но, спасибо, что сообщили мне об ahk-WinWait, поэтому я заменил вместо него ahk-Sleep *). fohrums 5 лет назад 0
Это не проблема для меня, я не знаю, почему это будет. [Виртуальный рабочий стол] (https://en.wikipedia.org/wiki/Virtual_desktop) изумителен тем, что может моделировать работу на нескольких компьютерах, но с использованием только одной установки. Я не знаю предела того, сколько из них выполнимо, но я бы тогда использовал другой виртуальный рабочий стол, чтобы продолжать открывать другие приложения. Я надеюсь, что это ответит вам * беспокойство. * fohrums 5 лет назад 0
Спасибо за помощь @miroxlav, мне просто нужно было это знать. Я думал, что есть какая-то скрытая команда, которую я должен был выкопать, чтобы добиться этого, но похоже, что она совершенно новая. Я полагаю, что AHK может сделать это когда-нибудь возможным, поскольку Windows 10 выпускается уже более 3 лет. Виртуальный рабочий стол не собирается исчезать в ближайшее время, поэтому хорошо, что я начал эту тему. fohrums 5 лет назад 0
0
user3419297

Попробуй это

#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 } 

Похожие вопросы