WindowTabs icon indicating copy to clipboard operation
WindowTabs copied to clipboard

It combines the explorers in different desktops, but I want it to work independently on both.

Open Femtometer opened this issue 2 years ago • 1 comments

OS:Windows10

image

Femtometer avatar Nov 22 '23 10:11 Femtometer

I've got an idea for this, but it isn't very easy and may take more time.

Meanwhile, you can drag any tab out of the group so it stays on the virtual desktop. Will this alternative method work for you?


For reference later.

How WindowTabs adds a window to a group: https://github.com/leafOfTree/WindowTabs/blob/859aed584a11e76a987032ac603a4af46c90b45e/WtProgram/Program.fs#L197


There is an interface for virtual desktop:

interface IVirtualDesktopManager: https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nn-shobjidl_core-ivirtualdesktopmanager?redirectedfrom=MSDN

method GetWindowDesktopId: https://learn.microsoft.com/en-us/windows/win32/api/shobjidl_core/nf-shobjidl_core-ivirtualdesktopmanager-getwindowdesktopid

We can use GetWindowDesktopId to group tabs for each desktop.

An example

open System
open System.Runtime.InteropServices

[<ComImport; Guid("A5CD92FF-29BE-454C-8D04-D82879FB3F1B"); InterfaceType(ComInterfaceType.InterfaceIsIUnknown)>]
type IVirtualDesktopManager =
    abstract member IsWindowOnCurrentVirtualDesktop: IntPtr * byref<bool> -> int
    abstract member GetWindowDesktopId: IntPtr * byref<Guid> -> int
    abstract member MoveWindowToDesktop: IntPtr * byref<Guid> -> int

let getWindowDesktopId (windowHandle: IntPtr) =
    // Create an instance of IVirtualDesktopManager
    let clsid = new Guid("C5E0CDCA-7B6E-41B2-9FC4-D93975CC467B")
    let vdmType = Type.GetTypeFromCLSID(clsid)
    let vdm = Activator.CreateInstance(vdmType) :?> IVirtualDesktopManager

    // Get the desktop ID
    let mutable desktopId = Guid.Empty
    let hr = vdm.GetWindowDesktopId(windowHandle, &desktopId)

    if hr = 0 then
        printfn "Window is on Desktop ID: %A" desktopId
    else
        printfn "Failed to get Desktop ID. HRESULT: %d" hr

// Example window handle (replace with actual handle)
let windowHandle = IntPtr.Zero
getWindowDesktopId windowHandle

leafOfTree avatar Oct 06 '24 08:10 leafOfTree