WinRT - 如何在桌面应用程序上显示Metro对话框?

时间:2015-01-31 14:06:38

标签: c++ windows windows-runtime messagebox abi

我相信这可能是某种方式,因为Windows PE加载器已经做到了:

enter image description here

我尝试直接创建一个Windows.UI.Popups.MessageDialog类并实例化“ShowAsync”,但它失败了,找不到Element。 (HRESULT异常:0x80070490)'。我读了this但是我没能像这样创建一个Windows.UI.Core.CoreDispatcher:

#include <Roapi.h>
#include <Winstring.h>
#include <Windows.h>
#include <windows.ui.popups.h>
#include <windows.ui.core.h>
#include <windows.foundation.h>
#include <Unknwn.h>

inline void CheckHresult(HRESULT hr)
{
    if (FAILED(hr))
    {
        DebugBreak();
    }
}

struct WinRTString
{
    WinRTString() {}

    WinRTString(const WinRTString &) = delete;

    template<size_t tSizeCharArr>
    WinRTString(const wchar_t(&chArr)[tSizeCharArr])
    {
        *this = chArr;
    }

    template<size_t tSizeCharArr>
    WinRTString & operator= (const wchar_t(&chArr)[tSizeCharArr])
    {
        this->~WinRTString();

        CheckHresult(WindowsCreateString(chArr, sizeof(chArr) / sizeof(chArr[0]) - 1, &hStr));

        return *this;
    }

    operator HSTRING() { return hStr;  }

    ~WinRTString()
    {
        if (hStr)
            WindowsDeleteString(hStr);

        hStr = nullptr;
    }

    HSTRING hStr = nullptr;
};

int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow)
{
    ABI::Windows::UI::Core::ICoreDispatcher *pUIDispatcher;

    CheckHresult(RoActivateInstance(WinRTString(L"Windows.UI.Core.CoreDispatcher"), (IInspectable**) &pUIDispatcher)); //fails
}

'RoActivateInstance'HINSTANCE'0x80040154:Class not registered'。

任何想法如何显示equvilent消息。我知道在msdn文档中它说只有Metro应用程序支持此API,但是当“此应用程序无法在您的PC上运行”时,如何在桌面上显示此消息?

1 个答案:

答案 0 :(得分:0)

Desktop apps Windows Runtime classes列出了公开提供的课程。引用的消息框示例必须使用WRL将WinRT API作为传统COM使用,其实现细节仅供内部使用。