• 4506阅读
  • 1回复

[讨论]QWidget 在windows10 下问题点 [复制链接]

上一主题 下一主题
离线vilas
 

只看楼主 倒序阅读 楼主  发表于: 2015-08-19
切换到windows10 的任务视图下
代码如下:
       QWidget × mWidget = new QWidget(0);
       mWidget ->setWindowFlags(  Qt::Tool | Qt::FramelessWindowHint );
       mWidget ->resize( 300,300);
       mWidget ->move(0, 0);
       mWidget ->show();

Qt::Tool 属性使得该窗口不会出现在虚拟桌面的窗口列表中。
但是问题出来了,在每个虚拟桌面上都出现了该QWidget窗口。

没有办法使该QWidget只显示在一个虚拟桌面上,并且不会出现在该虚拟桌面的窗口列表中?
离线vilas

只看该作者 1楼 发表于: 2015-08-21
找到了虚拟桌面的一些资料,不过貌似IVirtualDesktop的IID有问题,资料如下:大侠们,请赐教!


#ifndef INCLUDED_VISUALDESKTOPUTIL_H_
#define INCLUDED_VISUALDESKTOPUTIL_H_

//#include "stdafx.h"
#include <objbase.h>
//#include <ObjectArray.h>
#include <iostream>

const CLSID CLSID_ImmersiveShell = {
    0xC2F03A33, 0x21F5, 0x47FA, 0xB4, 0xBB, 0x15, 0x63, 0x62, 0xA2, 0xF2, 0x39 };

const IID IID_IServiceProvider = {
    0x6D5140C1, 0x7436, 0x11CE, 0x80, 0x34, 0x00, 0xAA, 0x00, 0x60, 0x09, 0xFA };

const CLSID CLSID_VirtualDesktopAPI_Unknown = {
    0xC5E0CDCA, 0x7B6E, 0x41B2, 0x9F, 0xC4, 0xD9, 0x39, 0x75, 0xCC, 0x46, 0x7B };

const IID IID_IVirtualDesktopManagerInternal = {
    0xAF8DA486, 0x95BB, 0x4460, 0xB3, 0xB7, 0x6E, 0x7A, 0x6B, 0x29, 0x62, 0xB5 };


struct IApplicationView : public IUnknown
{
public:

};

//namespace ABI {
//        namespace Windows {
//            namespace UI {
//                namespace ViewManagement {
//                    
//                    MIDL_INTERFACE("D222D519-4361-451E-96C4-60F4F9742DB0")
//                    IApplicationView : public IInspectable
//                    {
//                    public:
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Orientation(
//                            /* [out][retval] */ __RPC__out ABI::Windows::UI::ViewManagement::ApplicationViewOrientation *value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AdjacentToLeftDisplayEdge(
//                            /* [out][retval] */ __RPC__out boolean *value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_AdjacentToRightDisplayEdge(
//                            /* [out][retval] */ __RPC__out boolean *value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsFullScreen(
//                            /* [out][retval] */ __RPC__out boolean *value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsOnLockScreen(
//                            /* [out][retval] */ __RPC__out boolean *value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_IsScreenCaptureEnabled(
//                            /* [out][retval] */ __RPC__out boolean *value) = 0;
//                        
//                        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_IsScreenCaptureEnabled(
//                            /* [in] */ boolean value) = 0;
//                        
//                        virtual /* [propput] */ HRESULT STDMETHODCALLTYPE put_Title(
//                            /* [in] */ __RPC__in HSTRING value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Title(
//                            /* [out][retval] */ __RPC__deref_out_opt HSTRING *value) = 0;
//                        
//                        virtual /* [propget] */ HRESULT STDMETHODCALLTYPE get_Id(
//                            /* [out][retval] */ __RPC__out INT32 *value) = 0;
//                        
//                        virtual HRESULT STDMETHODCALLTYPE add_Consolidated(
//                            /* [in] */ __RPC__in_opt __FITypedEventHandler_2_Windows__CUI__CViewManagement__CApplicationView_Windows__CUI__CViewManagement__CApplicationViewConsolidatedEventArgs *handler,
//                            /* [out][retval] */ __RPC__out EventRegistrationToken *token) = 0;
//                        
//                        virtual HRESULT STDMETHODCALLTYPE remove_Consolidated(
//                            /* [in] */ EventRegistrationToken token) = 0;
//                        
//                    };
//
//                    extern const __declspec(selectany) IID & IID_IApplicationView = __uuidof(IApplicationView);
//
//                    
//                }  /* end namespace */
//            }  /* end namespace */
//        }  /* end namespace */
//    }  /* end namespace */


EXTERN_C const IID IID_IVirtualDesktop;

MIDL_INTERFACE("FF72FFDD-BE7E-43FC-9C03-AD81681E88E4")
IVirtualDesktop : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE IsViewVisible(
        IApplicationView *pView,
        int *pfVisible) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetID(
        GUID *pGuid) = 0;
};

enum AdjacentDesktop
{
    LeftDirection = 3,
    RightDirection = 4
};


EXTERN_C const IID IID_IVirtualDesktopManagerInternal;

MIDL_INTERFACE("AF8DA486-95BB-4460-B3B7-6E7A6B2962B5")
IVirtualDesktopManagerInternal : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE GetCount(
        UINT *pCount) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveViewDesktop(
        IApplicationView *pView,
        IVirtualDesktop *pDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetCurrentDesktop(
        IVirtualDesktop** desktop) = 0;

    /*virtual HRESULT STDMETHODCALLTYPE GetDesktops(
        IObjectArray **ppDesktops) = 0;*/

    virtual HRESULT STDMETHODCALLTYPE GetAdjacentDesktop(
        IVirtualDesktop *pDesktopReference,
        AdjacentDesktop uDirection,
        IVirtualDesktop **ppAdjacentDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE SwitchDesktop(
        IVirtualDesktop *pDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE CreateDesktopW(
        IVirtualDesktop **ppNewDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE RemoveDesktop(
        IVirtualDesktop *pRemove,
        IVirtualDesktop *pFallbackDesktop) = 0;

//10240
    virtual HRESULT STDMETHODCALLTYPE CanViewMoveDesktops(
        IApplicationView *pView,
        int *pfCanViewMoveDesktops) = 0;

    virtual HRESULT STDMETHODCALLTYPE FindDesktop(
        GUID *desktopId,
        IVirtualDesktop **ppDesktop) = 0;
};


EXTERN_C const IID IID_IVirtualDesktopManager;

MIDL_INTERFACE("a5cd92ff-29be-454c-8d04-d82879fb3f1b")
IVirtualDesktopManager : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE IsWindowOnCurrentVirtualDesktop(
        /* [in] */ __RPC__in HWND topLevelWindow,
        /* [out] */ __RPC__out BOOL *onCurrentDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE GetWindowDesktopId(
        /* [in] */ __RPC__in HWND topLevelWindow,
        /* [out] */ __RPC__out GUID *desktopId) = 0;

    virtual HRESULT STDMETHODCALLTYPE MoveWindowToDesktop(
        /* [in] */ __RPC__in HWND topLevelWindow,
        /* [in] */ __RPC__in REFGUID desktopId) = 0;
};

EXTERN_C const IID IID_IVirtualDesktopNotification;

MIDL_INTERFACE("C179334C-4295-40D3-BEA1-C654D965605A")
IVirtualDesktopNotification : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE VirtualDesktopCreated(
        IVirtualDesktop *pDesktop) = 0;

    virtual HRESULT STDMETHODCALLTYPE VirtualDesktopDestroyBegin(
        IVirtualDesktop *pDesktopDestroyed,
        IVirtualDesktop *pDesktopFallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE VirtualDesktopDestroyFailed(
        IVirtualDesktop *pDesktopDestroyed,
        IVirtualDesktop *pDesktopFallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE VirtualDesktopDestroyed(
        IVirtualDesktop *pDesktopDestroyed,
        IVirtualDesktop *pDesktopFallback) = 0;

    virtual HRESULT STDMETHODCALLTYPE ViewVirtualDesktopChanged(
        IApplicationView *pView) = 0;

    virtual HRESULT STDMETHODCALLTYPE CurrentVirtualDesktopChanged(
        IVirtualDesktop *pDesktopOld,
        IVirtualDesktop *pDesktopNew) = 0;

};

EXTERN_C const IID IID_IVirtualDesktopNotificationService;

MIDL_INTERFACE("0CD45E71-D927-4F15-8B0A-8FEF525337BF")
IVirtualDesktopNotificationService : public IUnknown
{
public:
    virtual HRESULT STDMETHODCALLTYPE Register(
        IVirtualDesktopNotification *pNotification,
        DWORD *pdwCookie) = 0;

    virtual HRESULT STDMETHODCALLTYPE Unregister(
        DWORD dwCookie) = 0;
};


void PrintGuid(const GUID &guid)
{
    std::wstring guidStr(40, L'\0');
    ::StringFromGUID2(guid, const_cast<LPOLESTR>(guidStr.c_str()), guidStr.length());

    std::wcout << guidStr.c_str();
}

//HRESULT EnumVirtualDesktops(IVirtualDesktopManagerInternal *pDesktopManager)
//{
//    std::wcout << L"<<< EnumDesktops >>>" << std::endl;
//
//    IObjectArray *pObjectArray = nullptr;
//    HRESULT hr = pDesktopManager->GetDesktops(&pObjectArray);
//
//    if (SUCCEEDED(hr))
//    {
//        UINT count;
//        hr = pObjectArray->GetCount(&count);
//
//        if (SUCCEEDED(hr))
//        {
//            std::wcout << L"Count: " << count << std::endl;
//
//            for (UINT i = 0; i < count; i++)
//            {
//                IVirtualDesktop *pDesktop = nullptr;
//
//                if (FAILED(pObjectArray->GetAt(i, __uuidof(IVirtualDesktop), (void**)&pDesktop)))
//                    continue;
//
//                GUID id = { 0 };
//                if (SUCCEEDED(pDesktop->GetID(&id)))
//                {
//                    std::wcout << L"\t #" << i << L": ";
//                    PrintGuid(id);
//                    std::wcout << std::endl;
//                }
//
//                pDesktop->Release();
//            }
//        }
//
//        pObjectArray->Release();
//    }
//
//    std::wcout << std::endl;
//    return hr;
//}

HRESULT GetCurrentVirtualDesktop(IVirtualDesktopManagerInternal *pDesktopManager, GUID *id)
{
    IVirtualDesktop *pDesktop = NULL;
    HRESULT hr = pDesktopManager->GetCurrentDesktop(&pDesktop);

    if (SUCCEEDED(hr))
    {
  GUID desktopId = { 0 };
  hr = pDesktop->GetID(&desktopId);
        if( SUCCEEDED(hr) )
        {
            id = &desktopId;
        }

        pDesktop->Release();
    }
    return hr;
}

HRESULT EnumAdjacentDesktops(IVirtualDesktopManagerInternal *pDesktopManager)
{
    std::wcout << L"<<< EnumAdjacentDesktops >>>" << std::endl;

    IVirtualDesktop *pDesktop = NULL;
    HRESULT hr = pDesktopManager->GetCurrentDesktop(&pDesktop);

    if (SUCCEEDED(hr))
    {
        GUID id = { 0 };
        IVirtualDesktop *pAdjacentDesktop = NULL;
        hr = pDesktopManager->GetAdjacentDesktop(pDesktop, AdjacentDesktop::LeftDirection, &pAdjacentDesktop);

        std::wcout << L"At left direction: ";

        if (SUCCEEDED(hr))
        {
            if (SUCCEEDED(pAdjacentDesktop->GetID(&id)))
                PrintGuid(id);

            pAdjacentDesktop->Release();
        }
        else
            std::wcout << L"NULL";
        std::wcout << std::endl;

        pAdjacentDesktop = NULL;
        hr = pDesktopManager->GetAdjacentDesktop(pDesktop, AdjacentDesktop::RightDirection, &pAdjacentDesktop);

        std::wcout << L"At right direction: ";

        if (SUCCEEDED(hr))
        {
            if (SUCCEEDED(pAdjacentDesktop->GetID(&id)))
                PrintGuid(id);

            pAdjacentDesktop->Release();
        }
        else
            std::wcout << L"NULL";
        std::wcout << std::endl;

        pDesktop->Release();
    }

    std::wcout << std::endl;
    return hr;
}

HRESULT ManageVirtualDesktops(IVirtualDesktopManagerInternal *pDesktopManager)
{
    std::wcout << L"<<< ManageVirtualDesktops >>>" << std::endl;
    std::wcout << L"Sleep period: 2000 ms" << std::endl;

    ::Sleep(2000);


    IVirtualDesktop *pDesktop = NULL;
    HRESULT hr = pDesktopManager->GetCurrentDesktop(&pDesktop);

    if (FAILED(hr))
    {
        std::wcout << L"\tFAILED can't get current desktop" << std::endl;
        return hr;
    }

    std::wcout << L"Creating desktop..." << std::endl;

    IVirtualDesktop *pNewDesktop = NULL;
    hr = pDesktopManager->CreateDesktopW(&pNewDesktop);

    if (SUCCEEDED(hr))
    {
        GUID id;
        hr = pNewDesktop->GetID(&id);

        if (FAILED(hr))
        {
            std::wcout << L"\tFAILED GetID" << std::endl;
            pNewDesktop->Release();
            return hr;
        }

        std::wcout << L"\t";
        PrintGuid(id);
        std::wcout << std::endl;

        std::wcout << L"Switching to desktop..." << std::endl;
        hr = pDesktopManager->SwitchDesktop(pNewDesktop);

        if (FAILED(hr))
        {
            std::wcout << L"\tFAILED SwitchDesktop" << std::endl;
            pNewDesktop->Release();
            return hr;
        }

        ::Sleep(2000);

        std::wcout << L"Removing desktop..." << std::endl;

        if (SUCCEEDED(hr))
        {
            hr = pDesktopManager->RemoveDesktop(pNewDesktop, pDesktop);
            pDesktop->Release();

            if (FAILED(hr))
            {
                std::wcout << L"\tFAILED RemoveDesktop" << std::endl;
                pNewDesktop->Release();
                return hr;
            }
        }
    }

    return hr;
}

/*
int _tmain(int argc, _TCHAR* argv[])
{
    ::CoInitialize(NULL);

    IServiceProvider* pServiceProvider = nullptr;
    HRESULT hr = ::CoCreateInstance(
        CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER,
        __uuidof(IServiceProvider), (PVOID*)&pServiceProvider);

    if (SUCCEEDED(hr))
    {
        IVirtualDesktopManagerInternal* pDesktopManagerInternal = nullptr;
        hr = pServiceProvider->QueryService(CLSID_VirtualDesktopAPI_Unknown, &pDesktopManagerInternal);

        if (SUCCEEDED(hr))
        {
            EnumVirtualDesktops(pDesktopManagerInternal);
            GetCurrentVirtualDesktop(pDesktopManagerInternal);
            EnumAdjacentDesktops(pDesktopManagerInternal);
            ManageVirtualDesktops(pDesktopManagerInternal);

            pDesktopManagerInternal->Release();
            pDesktopManagerInternal = nullptr;
        }

        std::wcout << L"<<< Desktop for current window >>>" << std::endl;

        IVirtualDesktopManager *pDesktopManager = nullptr;
        hr = pServiceProvider->QueryService(__uuidof(IVirtualDesktopManager), &pDesktopManager);

        if (SUCCEEDED(hr))
        {
            GUID desktopId = { 0 };
            hr = pDesktopManager->GetWindowDesktopId(GetConsoleWindow(), &desktopId);

            if (SUCCEEDED(hr))
            {
                std::wcout << L"\t";
                PrintGuid(desktopId);
                std::wcout << std::endl;
            }

            pDesktopManager->Release();
            pDesktopManager = nullptr;
            std::wcout << std::endl;
        }

        pServiceProvider->Release();
    }

    std::wcout << L"End. Press enter to end...";
    std::wcin.get();
    return 0;
}

*/

HRESULT moveWindowToCurrentVirtualDesktop(HWND hwndMoved, HWND hwndSrc)
{
    ::CoInitialize(NULL);

    IServiceProvider* pServiceProvider = NULL;
    HRESULT hr = ::CoCreateInstance(
        CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER,
        __uuidof(IServiceProvider), (PVOID*)&pServiceProvider);

GUID desktopId = { 0 };
    if (SUCCEEDED(hr))
    {
        IVirtualDesktopManagerInternal* pDesktopManagerInternal = NULL;
        hr = pServiceProvider->QueryService(CLSID_VirtualDesktopAPI_Unknown, &pDesktopManagerInternal);

        if (SUCCEEDED(hr))
        {
            IVirtualDesktop *pDesktop = NULL;
   IVirtualDesktop *pAdjacentDesktop = NULL;
   //hr = pDesktopManagerInternal->GetCurrentDesktop(&pDesktop);
   UINT pCount = 0;
   pDesktopManagerInternal->GetCount( &pCount);
  
   if (SUCCEEDED(hr))
   {
    //hr = pDesktop->GetID(&desktopId);

    if (SUCCEEDED(hr))
    {
     IVirtualDesktopManager *pDesktopManager = NULL;
     hr = pServiceProvider->QueryService(__uuidof(IVirtualDesktopManager), &pDesktopManager);
        
     if (SUCCEEDED(hr))
     {
      pDesktopManager->GetWindowDesktopId(hwndSrc, &desktopId);
      //pDesktopManagerInternal->FindDesktop(&desktopId, &pDesktop);
      //pDesktopManagerInternal->GetAdjacentDesktop(pDesktop, AdjacentDesktop::RightDirection, &pAdjacentDesktop);
      //pAdjacentDesktop->GetID(&desktopId);
      hr = pDesktopManager->MoveWindowToDesktop( hwndMoved, desktopId );

      pDesktopManager->Release();
      pDesktopManager = NULL;
     }
    }
  
    //pDesktop->Release();
   }

            pDesktopManagerInternal->Release();
            pDesktopManagerInternal = NULL;
        }
    
        pServiceProvider->Release();
}

return hr;
}

BOOL isWindowOnCurrentVirtualDesktop(HWND hwnd)
{
    BOOL bOnCurVirtualDesktop = 0;
    ::CoInitialize(NULL);

    IServiceProvider* pServiceProvider = NULL;
    HRESULT hr = ::CoCreateInstance(
        CLSID_ImmersiveShell, NULL, CLSCTX_LOCAL_SERVER,
        __uuidof(IServiceProvider), (PVOID*)&pServiceProvider);

    if (SUCCEEDED(hr))
    {
        IVirtualDesktopManager *pDesktopManager = NULL;
        hr = pServiceProvider->QueryService(__uuidof(IVirtualDesktopManager), &pDesktopManager);
    
        if (SUCCEEDED(hr))
        {
            hr = pDesktopManager->IsWindowOnCurrentVirtualDesktop( hwnd, &bOnCurVirtualDesktop );
   if (SUCCEEDED(hr))
    bOnCurVirtualDesktop = 1;

            pDesktopManager->Release();
            pDesktopManager = NULL;
        }

        pServiceProvider->Release();
    }

    return bOnCurVirtualDesktop;
}

#endif //
快速回复
限100 字节
 
上一个 下一个