3

这是一个奇怪的问题,让我试着解释一下。我在支持拖放的 c++/MFC 中编写了一个(基于对话框的)应用程序。

我在 Windows 7 上使用默认主题进行以下测试。我的应用程序正在屏幕上运行。它不是一个顶部窗口(在它的 z 顺序中),或者换句话说,它被它上面的其他窗口遮住了。

如果我开始从 Chrome 或 Firefox 网络浏览器中拖动链接或仅选择文本,首先进入任务栏上我的应用程序图标,图标闪烁并且我的应用程序在屏幕上弹出(通过接收顶部 z 顺序)所以我然后可以拖放到我的应用程序中。一切正常。

如果我在 IE 9(版本 9.0.8112,更新版本 9.0.12)中执行相同操作,则首先将选定的文本或链接拖到我的应用程序的任务栏图标以使我的应用程序成为顶部窗口(按 z 顺序),应用程序图标继续闪烁,但它从未像 Chrome 或 FF 那样显示在屏幕上,因此我不得不放弃我的拖放操作。

知道为什么 IE 会发生这种情况,是否有办法解决它?

编辑:下面是关于我的评论的代码示例:

HRESULT __stdcall DragEnter(IDataObject* pDataObject, DWORD grfKeyState, POINTL pt, DWORD* pdwEffect)
{
    //IDropTarget::DragEnter
    m_fAllowDrop = QueryDataObject(pDataObject);

    if(m_fAllowDrop)
    {
        //SUCCESS
        // get the dropeffect based on keyboard state
    }
    else
    {
        //FAILURE
        *pdwEffect = DROPEFFECT_NONE;
    }

    return S_OK;
}

BOOL QueryDataObject(IDataObject* pDataObject, int* pnOutDataType)
{
    static FORMATETC fmtetc_file = {CF_HDROP, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};
    static FORMATETC fmtetc_txt = {CF_UNICODETEXT, 0, DVASPECT_CONTENT, -1, TYMED_HGLOBAL};

    BOOL bRes = FALSE;
    HRESULT hr;

    //See if our data type
    hr = pDataObject->QueryGetData(&fmtetc_file);
    if(hr == S_OK)
    {
        bRes = TRUE;
    }

    //In my case hr is E_FAIL or 0x80004005

    hr = pDataObject->QueryGetData(&fmtetc_txt);
    if(hr == S_OK)
    {
        bRes = TRUE;
    }

    //In my case hr is E_FAIL or 0x80004005

    return bRes;
}
4

1 回答 1

7

作为其沙盒的一部分,以防止对机器进行未经授权的更改,Internet Explorer 以比其他应用程序更低的 UIPI(用户界面特权隔离)完整性级别运行。因此,默认情况下它没有访问您的应用程序的权限,这更有可能以中等或高 UIPI 完整性级别运行(取决于它是否提升了 UAC)。闪烁的任务栏按钮意味着某些东西正试图将您的应用程序带到前台,但没有权限这样做(请参阅文档SetForegroundWindow()更多细节)。UIPI 不允许低完整性进程向高完整性进程发送窗口消息,除非接收进程明确告诉 UIPI 允许。Chrome 和 FireFox 可能运行在与您的应用程序相同的完整性级别。为了支持从 Internet Explorer 拖放,调用ChangeWindowMessageFilter()ChangeWindowMessageFilterEx()让您的应用程序接收来自低完整性进程的 、 和 (0x0049)WM_DROPFILES消息WM_COPYDATAWM_COPYGLOBALDATA

更新:看起来 Internet Explorer 在保护模式下运行时特别对拖放操作施加了额外的限制:

如何处理来自低完整性 Internet Explorer 的拖放

了解和在保护模式下工作 Internet Explorer - 允许在应用程序中进行拖放操作

于 2013-01-23T01:07:09.263 回答