Показать это окно на всех рабочих столах

Вопрос или проблема

У меня проблема с HWiNFO, при которой виджеты не отображаются на всех рабочих столах, даже если я щелкаю правой кнопкой мыши и выбираю опцию показать приложения из окна на всех桌ах: https://www.hwinfo.com/forum/threads/widgets-not-showing-on-all-screens-on-windows-10.7833/#post-33664

Да, я использую метод, указанный здесь: Как показать окно на всех виртуальных рабочих столах

Единственный способ заставить виджеты отображаться — это щелкнуть правой кнопкой мыши на каждом из них и выбрать «Показать это окно на всех рабочих столах». Однако это сбрасывается после каждой перезагрузки, и мне снова нужно делать это при каждой перезагрузке для всех моих дюжины виджетов.

Есть ли возможность выполнить действие через командную строку, чтобы сделать это пакетно для виджетов? Я хотел бы создать скрипт AHK или что-то подобное, чтобы иметь возможность это сделать.

Еще одно решение AHK:

#Persistent
VD.init()

SetTimer, Show_HWiNFO, 100 
Return 

Show_HWiNFO: 
VD.PinWindow("ahk_exe HWiNFO64.EXE")
return

; VD.ahk
; https://github.com/FuPeiJiang/VD.ahk
; https://www.autohotkey.com/boards/viewtopic.php?f=6&t=83381&p=442769#p442769

class VD {
    init()
    {
        splitByDot:=StrSplit(A_OSVersion, ".")
        buildNumber:=splitByDot[3]
        if (buildNumber < 22000)
        {
            ; Windows 10
            IID_IVirtualDesktopManagerInternal_:="{F31574D6-B682-4CDC-BD56-1827860ABEC6}" ;https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop.cs#L177-L191
            IID_IVirtualDesktop_:="{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4}" ;https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop.cs#L149-L150
            ;условно назначить метод на метод
            this._dll_GetCurrentDesktop:=this._dll_GetCurrentDesktop_Win10
            this._dll_GetDesktops:=this._dll_GetDesktops_Win10
            this._dll_SwitchDesktop:=this._dll_SwitchDesktop_Win10
            this._dll_CreateDesktop:=this._dll_CreateDesktop_Win10
            this._dll_GetName:=this._dll_GetName_Win10
        }
        else
        {
            ; Windows 11
            IID_IVirtualDesktopManagerInternal_:="{B2F925B9-5A0F-4D2E-9F4D-2B1507593C10}" ;https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop11.cs#L163-L185
            IID_IVirtualDesktop_:="{536D3495-B208-4CC9-AE26-DE8111275BF8}" ;https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop11.cs#L149-L150
            ;условно назначить метод на метод
            this._dll_GetCurrentDesktop:=this._dll_GetCurrentDesktop_Win11
            this._dll_GetDesktops:=this._dll_GetDesktops_Win11
            this._dll_SwitchDesktop:=this._dll_SwitchDesktop_Win11
            this._dll_GetName:=this._dll_GetName_Win11
        }
        ;----------------------
        this.IVirtualDesktopManager := ComObjCreate("{AA509086-5CA9-4C25-8F95-589D3C07B48A}", "{A5CD92FF-29BE-454C-8D04-D82879FB3F1B}")
        this.GetWindowDesktopId := this._vtable(this.IVirtualDesktopManager, 4)

        IServiceProvider := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{6D5140C1-7436-11CE-8034-00AA006009FA}")

        this.IVirtualDesktopManagerInternal := ComObjQuery(IServiceProvider, "{C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B}", IID_IVirtualDesktopManagerInternal_)

        ; this.GetCount := this._vtable(this.IVirtualDesktopManagerInternal, 3 ; int GetCount();
        this.MoveViewToDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 4) ; void MoveViewToDesktop(object pView, IVirtualDesktop desktop);
        this.CanViewMoveDesktops := this._vtable(this.IVirtualDesktopManagerInternal, 5) ; bool CanViewMoveDesktops(IApplicationView view);
        this.GetCurrentDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 6) ; IVirtualDesktop GetCurrentDesktop(); || IVirtualDesktop GetCurrentDesktop(IntPtr hWndOrMon);
        if (buildNumber < 22000) {
            ;Windows 10 https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop.cs#L177-L191

            this.GetDesktops := this._vtable(this.IVirtualDesktopManagerInternal, 7) ; void GetDesktops(out IObjectArray desktops);
            ; this.GetAdjacentDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 8) ; int GetAdjacentDesktop(IVirtualDesktop from, int direction, out IVirtualDesktop desktop);
            this.SwitchDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 9) ; void SwitchDesktop(IVirtualDesktop desktop);
            this.Ptr_CreateDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 10) ; IVirtualDesktop CreateDesktop();
            this.Ptr_RemoveDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 11) ; void RemoveDesktop(IVirtualDesktop desktop, IVirtualDesktop fallback);
            this.FindDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 12) ; IVirtualDesktop FindDesktop(ref Guid desktopid);
        } else if (buildNumber < 22489) {
            ;Windows 11 https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop11.cs#L163-L185

            this.GetDesktops := this._vtable(this.IVirtualDesktopManagerInternal, 7) ; void GetDesktops(IntPtr hWndOrMon, out IObjectArray desktops);
            ; this.GetAdjacentDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 8) ; int GetAdjacentDesktop(IVirtualDesktop from, int direction, out IVirtualDesktop desktop);
            this.SwitchDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 9) ; void SwitchDesktop(IntPtr hWndOrMon, IVirtualDesktop desktop);
            this.Ptr_CreateDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 10) ; IVirtualDesktop CreateDesktop(IntPtr hWndOrMon);
            ; this.MoveDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 11) ; void MoveDesktop(IVirtualDesktop desktop, IntPtr hWndOrMon, int nIndex);
            this.Ptr_RemoveDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 12) ; void RemoveDesktop(IVirtualDesktop desktop, IVirtualDesktop fallback);
            this.FindDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 13) ; IVirtualDesktop FindDesktop(ref Guid desktopid);
        } else {
            ;Windows 11 Insider build 22489 https://github.com/MScholtes/VirtualDesktop/blob/9f3872e1275408a0802bdbe46df499bb7645dc87/VirtualDesktop11Insider.cs#L163-L186

            ; this.GetAllCurrentDesktops := this._vtable(this.IVirtualDesktopManagerInternal, 7) ; IObjectArray GetAllCurrentDesktops();
            this.GetDesktops := this._vtable(this.IVirtualDesktopManagerInternal, 8) ; void GetDesktops(IntPtr hWndOrMon, out IObjectArray desktops);
            ; this.GetAdjacentDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 9) ; int GetAdjacentDesktop(IVirtualDesktop from, int direction, out IVirtualDesktop desktop);
            this.SwitchDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 10) ; void SwitchDesktop(IntPtr hWndOrMon, IVirtualDesktop desktop);
            this.Ptr_CreateDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 11) ; IVirtualDesktop CreateDesktop(IntPtr hWndOrMon);
            ; this.MoveDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 12) ; void MoveDesktop(IVirtualDesktop desktop, IntPtr hWndOrMon, int nIndex);
            this.Ptr_RemoveDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 13) ; void RemoveDesktop(IVirtualDesktop desktop, IVirtualDesktop fallback);
            this.FindDesktop := this._vtable(this.IVirtualDesktopManagerInternal, 14) ; IVirtualDesktop FindDesktop(ref Guid desktopid);
        }

        ;https://github.com/MScholtes/VirtualDesktop/blob/812c321e286b82a10f8050755c94d21c4b69812f/VirtualDesktop.cs#L225-L234
        this.IVirtualDesktopPinnedApps := ComObjQuery(IServiceProvider, "{B5A399E7-1C87-46B8-88E9-FC5747B171BD}", "{4CE81583-1E4C-4632-A621-07A53543148F}")

        ; this.IsAppIdPinned := this._vtable(this.IVirtualDesktopPinnedApps, 3) ; bool IsAppIdPinned(string appId);
        ; this.PinAppID := this._vtable(this.IVirtualDesktopPinnedApps, 4) ; void PinAppID(string appId);
        ; this.UnpinAppID := this._vtable(this.IVirtualDesktopPinnedApps, 5) ; void UnpinAppID(string appId);
        this.IsViewPinned := this._vtable(this.IVirtualDesktopPinnedApps, 6) ; bool IsViewPinned(IApplicationView applicationView);
        this.PinView := this._vtable(this.IVirtualDesktopPinnedApps, 7) ; void PinView(IApplicationView applicationView);
        this.UnpinView := this._vtable(this.IVirtualDesktopPinnedApps, 8) ; void UnpinView(IApplicationView applicationView);


        ImmersiveShell := ComObjCreate("{C2F03A33-21F5-47FA-B4BB-156362A2F239}", "{00000000-0000-0000-C000-000000000046}")
        ; if !(IApplicationViewCollection := ComObjQuery(ImmersiveShell,"{1841C6D7-4F9D-42C0-AF41-8747538F10E5}" ) ) ; doesn't work
        ; ТО ЖЕ CLSID и IID ?
        ; подождите, это не CLSID:
        ; SID
        ; Идентификатор службы в такой же форме, как IID. При опускании этого параметра также опустите запятую.
        this.IApplicationViewCollection := ComObjQuery(ImmersiveShell,"{1841C6D7-4F9D-42C0-AF41-8747538F10E5}","{1841C6D7-4F9D-42C0-AF41-8747538F10E5}" )
        if (!this.IApplicationViewCollection) ; 1607-1809
        {
            MsgBox Интерфейс IApplicationViewCollection не поддерживается.
        }
        this.GetViewForHwnd := this._vtable(this.IApplicationViewCollection, 6) ; (IntPtr hwnd, out IApplicationView view);


        ;----------------------

        ; VarSetCapacity(IID_IVirtualDesktop, 16)
        ; это никогда не будет сборки мусора
        this.Ptr_IID_IVirtualDesktop := DllCall( "GlobalAlloc", "UInt",0x40, "UInt", 16, "Ptr")
        DllCall("Ole32.dll\CLSIDFromString", "Str", IID_IVirtualDesktop_, "Ptr", this.Ptr_IID_IVirtualDesktop)

        ;----------------------

    }
    ;dll методы начинаются
    _dll_GetCurrentDesktop_Win10() {
        IVirtualDesktop_ofCurrentDesktop := 0
        DllCall(this.GetCurrentDesktop, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr*", IVirtualDesktop_ofCurrentDesktop)
        return IVirtualDesktop_ofCurrentDesktop
    }
    _dll_GetCurrentDesktop_Win11() {
        IVirtualDesktop_ofCurrentDesktop := 0
        DllCall(this.GetCurrentDesktop, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr", 0, "Ptr*", IVirtualDesktop_ofCurrentDesktop)
        return IVirtualDesktop_ofCurrentDesktop
    }
    _dll_GetDesktops_Win10() {
        IObjectArray := 0
        DllCall(this.GetDesktops, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr*", IObjectArray)
        return IObjectArray
    }
    _dll_GetDesktops_Win11() {
        IObjectArray := 0
        DllCall(this.GetDesktops, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr", 0, "UPtr*", IObjectArray)
        return IObjectArray
    }
    _dll_SwitchDesktop_Win10(IVirtualDesktop) {
        DllCall(this.SwitchDesktop, "ptr", this.IVirtualDesktopManagerInternal, "UPtr", IVirtualDesktop)
    }
    _dll_SwitchDesktop_Win11(IVirtualDesktop) {
        DllCall(this.SwitchDesktop, "ptr", this.IVirtualDesktopManagerInternal, "Ptr", 0, "UPtr", IVirtualDesktop)
    }
    _dll_CreateDesktop_Win10() {
        IVirtualDesktop_ofNewDesktop:=0
        DllCall(this.Ptr_CreateDesktop, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr*", IVirtualDesktop_ofNewDesktop)
        return IVirtualDesktop_ofNewDesktop
    }
    _dll_CreateDesktop_Win11() {
        IVirtualDesktop_ofNewDesktop:=0
        DllCall(this.Ptr_CreateDesktop, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr", 0, "Ptr*", IVirtualDesktop_ofNewDesktop)
        return IVirtualDesktop_ofNewDesktop
    }
    _dll_GetName_Win10(IVirtualDesktop) {
        QueryInterface:=this._vtable(IVirtualDesktop, 0)
        VarSetCapacity(CLSID, 16)
        DllCall("Ole32.dll\CLSIDFromString", "Str","{31EBDE3F-6EC3-4CBD-B9FB-0EF6D09B41F4}", "Ptr",&CLSID)
        DllCall(QueryInterface, "UPtr",IVirtualDesktop, "Ptr",&CLSID, "Ptr*", IVirtualDesktop2)

        GetName:=this._vtable(IVirtualDesktop2,5)
        DllCall(GetName, "UPtr", IVirtualDesktop2, "Ptr*", Handle_DesktopName)
        if (Handle_DesktopName==0) {
            return "" ;вы не можете иметь пустое имя рабочего стола, поэтому это может представлять ошибку
        }
        Ptr_DesktopName:=DllCall("combase\WindowsGetStringRawBuffer", "Ptr",Handle_DesktopName, "UInt*",length, "Ptr")
        desktopName:=StrGet(Ptr_DesktopName+0,"UTF-16")
        return desktopName
    }
    /* _dll_GetName_Win10(IVirtualDesktop) {
        GetId := this._vtable(IVirtualDesktop, 4)
        VarSetCapacity(GUID_Desktop, 16)
        DllCall(GetId, "UPtr",IVirtualDesktop, "Ptr",&GUID_Desktop)

        strGUID:=this._string_from_GUID(GUID_Desktop)
        KeyName:="HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\VirtualDesktops\Desktops\" strGUID
        ;RegRead дает "" на ключ не найден, удобно
        RegRead, desktopName, % KeyName, % "Name"
        ; Мне это не нравится, потому что реестр можно редактировать, тогда он не будет отражать имя рабочего стола
        return desktopName
    }
    */
    _dll_GetName_Win11(IVirtualDesktop) {
        GetName:=this._vtable(IVirtualDesktop,6)
        DllCall(GetName, "UPtr", IVirtualDesktop, "Ptr*", Handle_DesktopName)
        if (Handle_DesktopName==0) {
            return "" ;вы не можете иметь пустое имя рабочего стола, поэтому это может представлять ошибку
        }
        Ptr_DesktopName:=DllCall("combase\WindowsGetStringRawBuffer", "Ptr",Handle_DesktopName, "UInt*",length, "Ptr")
        desktopName:=StrGet(Ptr_DesktopName+0,"UTF-16")
        return desktopName
    }
    ;dll методы заканчиваются

    ;фактические методы начинаются
    getCount() { ;сколько виртуальных рабочих столов у вас сейчас есть
        return this._GetDesktops_Obj().GetCount()
    }

    goToDesktopNum(desktopNum) {
        IVirtualDesktop:=this._GetDesktops_Obj().GetAt(desktopNum)
        this._SwitchIVirtualDesktop(IVirtualDesktop)

        if (this._isWindowFullScreen("A")) {
            timerFunc := ObjBindMethod(this, "_pleaseSwitchDesktop", desktopNum) ;https://www.autohotkey.com/docs/commands/SetTimer.htm#ExampleClass
            SetTimer % timerFunc, -50
        }

    }

    getNameFromDesktopNum(desktopNum) {
        IVirtualDesktop:=this._GetDesktops_Obj().GetAt(desktopNum)
        _name:=this._dll_GetName(IVirtualDesktop)
        return _name
        ; if (_name=="") {
            ; return "Рабочий стол " _name
        ; }
    }

    getDesktopNumOfWindow(wintitle) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        theHwnd:=found[1]

        desktopNum_ofWindow:=this._desktopNum_from_Hwnd(theHwnd)
        return desktopNum_ofWindow ; 0 для "Показать на всех рабочих столах"
    }

    goToDesktopOfWindow(wintitle, activateYourWindow:=true) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        theHwnd:=found[1]

        desktopNum_ofWindow:=this._desktopNum_from_Hwnd(theHwnd)
        this.goToDesktopNum(desktopNum_ofWindow)

        if (activateYourWindow) {
            WinActivate, ahk_id %theHwnd%
        }
    }

    MoveWindowToDesktopNum(wintitle, desktopNum)
    {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        theHwnd:=found[1]
        thePView:=found[2]

        IVirtualDesktop:=this._GetDesktops_Obj().GetAt(desktopNum)

        this._MoveView_to_IVirtualDesktop(thePView, IVirtualDesktop)
    }

    MoveWindowToRelativeDesktopNum(wintitle, relative_desktopNum)
    {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        theHwnd:=found[1]
        thePView:=found[2]

        desktopNum_ofWindow:=this._desktopNum_from_Hwnd(theHwnd)

        Desktops_Obj:=this._GetDesktops_Obj()
        count_Desktops:=Desktops_Obj.GetCount()

        absolute_desktopNum:=desktopNum_ofWindow + relative_desktopNum
        ;// Индексы с 1 оборачиваются на первом и последнем рабочем столе.
        ;// скажем count_Desktops:=3
        absolute_desktopNum:=Mod(absolute_desktopNum, count_Desktops)
        ; 4 -> 1
        if (absolute_desktopNum <= 0) {
            ; 0 -> 3
            absolute_desktopNum:=absolute_desktopNum + count_Desktops
        }

        IVirtualDesktop:=Desktops_Obj.GetAt(absolute_desktopNum)

        this._MoveView_to_IVirtualDesktop(thePView, IVirtualDesktop)
        return absolute_desktopNum
    }

    MoveWindowToCurrentDesktop(wintitle, activateYourWindow:=true)
    {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        theHwnd:=found[1]
        thePView:=found[2]

        currentDesktopNum:=this.getCurrentDesktopNum()
        IVirtualDesktop:=this._GetDesktops_Obj().GetAt(currentDesktopNum)

        this._MoveView_to_IVirtualDesktop(thePView, IVirtualDesktop)

        if (activateYourWindow) {
            WinActivate % "ahk_id " theHwnd
        }
    }

    getCurrentDesktopNum() {
        IVirtualDesktop_ofCurrentDesktop:=this._dll_GetCurrentDesktop()

        desktopNum:=this._desktopNum_from_IVirtualDesktop(IVirtualDesktop_ofCurrentDesktop)
        return desktopNum
    }

    createDesktop(goThere:=false) {
        IVirtualDesktop_ofNewDesktop:=this._dll_CreateDesktop()

        if (goThere) {
            ;мы могли бы предположить, что это крайний рабочий стол:
            ; desktopNum:=this.getCount()
            ;но я не рискую
            desktopNum:=this._desktopNum_from_IVirtualDesktop(IVirtualDesktop_ofNewDesktop)
            this.goToDesktopNum(desktopNum)
        }
    }

    createUntil(howMany, goToLastlyCreated:=false) {
        howManyThereAlreadyAre:=this.getCount()
        if (howManyThereAlreadyAre>=howMany) {
            return
        }

        ;это будет создаваться до одного меньше, чем надо
        loop % howMany - howManyThereAlreadyAre - 1 {
            this.createDesktop(false)
        }
        this.createDesktop(goToLastlyCreated)
    }

    removeDesktop(desktopNum, fallback_desktopNum:=false) {
        ;РЕЗЕРВ НЕОБХОДИМ, ЕСЛИ ВЫ В НОСИТЕЛЕ, У КОТОРОГО УДАЛЯЕТСЯ
        ;но нам НУЖЕН резерв, в любом случае, так что я не проверяю, если вы сейчас на рабочем столе, который удаляется

        Desktops_Obj:=this._GetDesktops_Obj()

        ;если нет резерва,
        if (!fallback_desktopNum) {

            ;посмотрите налево
            if (desktopNum > 1) {
                fallback_desktopNum:=desktopNum - 1
            }
            ;посмотрите вправо
            else if (desktopNum < Desktops_Obj.GetCount()) {
                fallback_desktopNum:=desktopNum + 1
            }
            ;нет запаса для перехода
            else {
                return false
            }
        }

        IVirtualDesktop:=Desktops_Obj.GetAt(desktopNum)
        IVirtualDesktop_fallback:=Desktops_Obj.GetAt(fallback_desktopNum)

        DllCall(this.Ptr_RemoveDesktop, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr", IVirtualDesktop, "Ptr", IVirtualDesktop_fallback)
    }

    IsWindowPinned(wintitle) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        thePView:=found[2]

        viewIsPinned:=this._IsViewPinned(thePView)
        return viewIsPinned
    }
    TogglePinWindow(wintitle) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        thePView:=found[2]

        viewIsPinned:=this._IsViewPinned(thePView)
        if (viewIsPinned) {
            DllCall(this.UnPinView, "UPtr", this.IVirtualDesktopPinnedApps, "Ptr", thePView)
        } else {
            DllCall(this.PinView, "UPtr", this.IVirtualDesktopPinnedApps, "Ptr", thePView)
        }

    }
    PinWindow(wintitle) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        thePView:=found[2]

        DllCall(this.PinView, "UPtr", this.IVirtualDesktopPinnedApps, "Ptr", thePView)
    }
    UnPinWindow(wintitle) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return -1 ;для ложного значения
        }
        thePView:=found[2]

        DllCall(this.UnPinView, "UPtr", this.IVirtualDesktopPinnedApps, "Ptr", thePView)
    }

    ;фактические методы заканчиваются

    ;внутренние методы начинаются
    _MoveView_to_IVirtualDesktop(thePView, IVirtualDesktop) {
        DllCall(this.MoveViewToDesktop, "ptr", this.IVirtualDesktopManagerInternal, "Ptr", thePView, "Ptr", IVirtualDesktop)
        DllCall(this.MoveViewToDesktop, "ptr", this.IVirtualDesktopManagerInternal, "Ptr", thePView, "Ptr", IVirtualDesktop)
        this._activateWindowUnder()
    }
    _SwitchIVirtualDesktop(IVirtualDesktop) {
        ;активировать панель задач перед этим; https://github.com/mzomparelli/zVirtualDesktop/issues/59#issuecomment-317613971
        WinActivate, ahk_class Shell_TrayWnd
        WinWaitActive, ahk_class Shell_TrayWnd

        this._dll_SwitchDesktop(IVirtualDesktop)
        this._dll_SwitchDesktop(IVirtualDesktop)
        this._activateWindowUnder()
    }

    _pleaseSwitchDesktop(desktopNum) {
        ;IVirtualDesktop следует рассчитывать снова, потому что IVirtualDesktop может измениться
        ;что мы хотим - это тот же desktopNum
        IVirtualDesktop:=this._GetDesktops_Obj().GetAt(desktopNum)
        this._SwitchIVirtualDesktop(IVirtualDesktop)
        ;этот метод - goToDesktopNum(), но без рекурсии, чтобы избежать рекурсии
    }

    _activateWindowUnder() {
        ; если это не сработает
        ;попробуйте https://www.autohotkey.com/boards/viewtopic.php?t=28760#p326541
        found:=this._getFirstWindowUnder()
        if (!found) {
            return -1 ;для ложного значения
        }
        theHwnd:=found[1]
        ; MsgBox % theHwnd

        WinGet, OutputVar_MinMax, MinMax, % "ahk_id " theHwnd
        if (!(OutputVar_MinMax==-1)) {
            WinActivate, ahk_id %theHwnd%
        }
    }

    _getFirstWindowUnder() {
        returnValue:=false
        WinGet, outHwndList, List
        loop % outHwndList {
            if (pView:=this._isValidWindow(outHwndList%A_Index%)) {
                returnValue:=[outHwndList%A_Index%, pView]
                break
            }
        }
        return returnValue
    }

    _getFirstValidWindow(wintitle) {

        bak_DetectHiddenWindows:=A_DetectHiddenWindows
        bak_TitleMatchMode:=A_TitleMatchMode
        DetectHiddenWindows, on
        SetTitleMatchMode, 2
        WinGet, outHwndList, List, % wintitle

        returnValue:=false
        loop % outHwndList {
            if (pView:=this._isValidWindow(outHwndList%A_Index%)) {
                returnValue:=[outHwndList%A_Index%, pView]
                break
            }
        }

        SetTitleMatchMode % bak_TitleMatchMode
        DetectHiddenWindows % bak_DetectHiddenWindows
        return returnValue
    }

    _view_from_Hwnd(theHwnd) {
        pView := 0
        DllCall(this.GetViewForHwnd, "UPtr", this.IApplicationViewCollection, "Ptr", theHwnd, "Ptr*", pView)
        return pView
    }

    _IVirtualDesktop_from_Hwnd(theHwnd) {
        VarSetCapacity(GUID_Desktop, 16)
        HRESULT := DllCall(this.GetWindowDesktopId, "UPtr", this.IVirtualDesktopManager, "Ptr", theHwnd, "Ptr", &GUID_Desktop)
        if (!(HRESULT==0)) {
            return false
        }

        IVirtualDesktop_ofWindow:=0
        DllCall(this.FindDesktop, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr", &GUID_Desktop, "Ptr*", IVirtualDesktop_ofWindow)

        return IVirtualDesktop_ofWindow
    }

    _desktopNum_from_IVirtualDesktop(IVirtualDesktop) {
        Desktops_Obj:=this._GetDesktops_Obj()
        Loop % Desktops_Obj.GetCount()
        {
            IVirtualDesktop_ofDesktop:=Desktops_Obj.GetAt(A_Index)

            if (IVirtualDesktop_ofDesktop == IVirtualDesktop) {
                return A_Index
            }
        }
        return 0 ;для "Показать на всех рабочих столах"
    }

    _desktopNum_from_Hwnd(theHwnd) {
        IVirtualDesktop:=this._IVirtualDesktop_from_Hwnd(theHwnd)
        desktopNum:=this._desktopNum_from_IVirtualDesktop(IVirtualDesktop)
        return desktopNum
    }

    _GetDesktops_Obj() {
        IObjectArray:=this._dll_GetDesktops()
        return new this.IObjectArray_Wrapper(IObjectArray, this.Ptr_IID_IVirtualDesktop)
    }

    _IsViewPinned(thePView) {
        viewIsPinned:=0
        DllCall(this.IsViewPinned, "UPtr", this.IVirtualDesktopPinnedApps, "Ptr", thePView, "Int*",viewIsPinned)
        return viewIsPinned
    }

    ;внутренние методы заканчиваются

    ;утилитные методы начинаются
    _isWindowFullScreen( winTitle ) {
        ;проверяет, является ли указанное окно полноэкранным

        winID := WinExist( winTitle )

        If ( !winID )
            Return false

        WinGet style, Style, ahk_id %WinID%
        WinGetPos ,,,winW,winH, %winTitle%
        ; 0x800000 это WS_BORDER.
        ; 0x20000000 это WS_MINIMИЗИРОВАНО.
        ; никакой границы и не минимизирован
        Return ((style & 0x20800000) or winH < A_ScreenHeight or winW < A_ScreenWidth) ? false : true
    }

    _isValidWindow(hWnd) ;возвращает pView, если успешно
    {
        ; DetectHiddenWindows, on ;это необходимо, но для оптимизации вызывающий сделает это

        returnValue:=false
        breakToReturnFalse:
        loop 1 {
            ; WinGetTitle, title, ahk_id %hWnd%
            WinGetTitle, title, % "ahk_id " hwnd
            if (!title) {
                break breakToReturnFalse
            }

            WinGet, dwStyle, Style, ahk_id %hWnd%
            if ((dwStyle&0x08000000) || !(dwStyle&0x10000000)) {
                break breakToReturnFalse
            }
            WinGet, dwExStyle, ExStyle, ahk_id %hWnd%
            if (dwExStyle & 0x00000080) {
                break breakToReturnFalse
            }
            WinGetClass, szClass, ahk_id %hWnd%
            if (szClass = "TApplication") {
                break breakToReturnFalse
            }

            pView:=this._view_from_Hwnd(hWnd)
            if (!pView) {
                break breakToReturnFalse
            }
            pfCanViewMoveDesktops := 0
            DllCall(this.CanViewMoveDesktops, "UPtr", this.IVirtualDesktopManagerInternal, "Ptr", pView, "int*", pfCanViewMoveDesktops) ; возвращаемое значение BOOL
            if (!pfCanViewMoveDesktops) {
                break breakToReturnFalse
            }

            returnValue:=pView
        }
        ; DetectHiddenWindows, off ;это необходимо, но для оптимизации вызывающий сделает это
        return returnValue
    }
    _IsViewActive(Ptr_View) {
        found:=this._getFirstValidWindow(wintitle)
        if (!found) {
            return false
        }
        thePView:=found[2]

        return thePView == Ptr_View
    }
    ;-------------------
    _vtable(ppv, index) {
        Return NumGet(NumGet(0+ppv)+A_PtrSize*index)
    }
    _string_from_GUID(Byref byref_GUID) {
        VarSetCapacity(strGUID, 38 * 2) ;38 это StrLen("{FF72FFDD-BE7E-43FC-9C03-AD81681E88E4}")
        DllCall("Ole32.dll\StringFromGUID2", "UPtr", &byref_GUID, "UPtr", &strGUID, "Int", 38 + 1)
        return StrGet(&strGUID, "UTF-16")
    }

    class IObjectArray_Wrapper {
        __New(IObjectArray, Ptr_IID_Interface) {
            this.IObjectArray:=IObjectArray
            this.Ptr_IID_Interface:=Ptr_IID_Interface

            this.Ptr_GetAt:=VD._vtable(IObjectArray,4)
        }
        __Delete() {
            ;IUnknown::Release
            Ptr_Release:=VD._vtable(this.IObjectArray,2)
            DllCall(Ptr_Release, "UPtr", this.IObjectArray)
        }
        GetAt(oneBasedIndex) {
            Ptr_Interface:=0
            DllCall(this.Ptr_GetAt, "UPtr", this.IObjectArray, "UInt", oneBasedIndex - 1, "Ptr", this.Ptr_IID_Interface, "Ptr*", Ptr_Interface)
            return Ptr_Interface
        }
        GetCount() {
            Ptr_GetCount:=VD._vtable(this.IObjectArray,3)
            Count := 0
            DllCall(Ptr_GetCount, "UPtr", this.IObjectArray, "UInt*", Count)
            return Count
        }

    }
    ;утилитные методы заканчиваются
}

Ответ или решение

Для решения проблемы, когда виджеты HWiNFO не отображаются на всех виртуальных рабочих столах Windows 10, необходимо использовать подход, который позволяет закрепить окна виджетов на всех рабочих столах автоматически, избегая необходимости вручную задавать эту опцию для каждого виджета при каждом перезагрузке системы. Поскольку Windows сама по себе не предоставляет стандартного решения для этого, мы можем воспользоваться автозагрузкой скриптов AutoHotkey, которые помогут добиться желаемого результата.

Вот основные шаги, которые нужно выполнить:

1. Установите AutoHotkey:

Если вы еще не установили AutoHotkey, скачайте и установите его с официального сайта: AutoHotkey.

2. Создайте скрипт AutoHotkey:

Создайте новый текстовый файл с расширением .ahk, например HWiNFO_Pinning.ahk, и вставьте в него следующий код:

#Persistent
SetTitleMatchMode, 2 ; Настроить режим совпадения заголовка окон
SetTimer, PinHWINFOWidgets, 100 ; Повторять каждые 100 миллисекунд
Return 

PinHWINFOWidgets:
    WinGet, id, List, HWiNFO64 ; Получить список окон HWiNFO64
    Loop, %id% ; Пройтись по всем найденным окнам
    {
        thisID := id%A_Index% ; Получить ID окна
        WinSet, AlwaysOnAllDesktops, On, ahk_id %thisID% ; Установить окно на все рабочие столы
    }
Return

3. Запустите скрипт:

Дважды щелкните на созданный файл HWiNFO_Pinning.ahk, чтобы запустить его. Скрипт будет работать в фоновом режиме и будет автоматически устанавливать все окна HWiNFO64 на всех рабочих столах каждые 100 миллисекунд.

4. Добавьте в автозагрузку (по желанию):

Чтобы скрипт запускался автоматически при старте системы, добавьте его в папку "Автозагрузка":

  1. Нажмите Win + R и введите shell:startup, затем нажмите Enter.
  2. Создайте ярлык на ваш скрипт AHK в открывшейся папке.

5. Настройте задержку, если нужно:

Вы можете отрегулировать значение в строке SetTimer, PinHWINFOWidgets, 100. Уменьшение его ускорит проверку, хотя 100 миллисекунд является вполне приемлемым значением для большинства систем.

Таким образом, этот подход обеспечит автоматическую установку всех виджетов HWiNFO на всех рабочих столах Windows 10, даже после перезагрузки системы, без необходимости вручную настраивать каждое окно.

Если у вас возникнут дополнительные вопросы или понадобится помощь в настройке, пожалуйста, дайте знать!

Оцените материал
Добавить комментарий

Капча загружается...