拖动和下降,由IE 9成我的应用程序

问题描述:

这是一种奇怪的问题,让我试着解释。我在C++/MFC中编写了一个支持拖放的基于对话框的应用程序。拖动和下降,由IE 9成我的应用程序

我在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; 
} 

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

更新:它看起来像Internet Explorer中特别是在拖&拖放操作造成附加的限制时,它是在保护模式下运行:

How to handle drag & drop from low integrity Internet Explorer

Understanding and Working in Protected Mode Internet Explorer - Allowing Drag and Drop Operations in your Application

+0

感谢您的信息。我现在可以将文件拖到我的应用程序中,但“拖放”部分似乎不起作用。出于某种原因,从处理QueryDataObject时调用的'IDataObject :: QueryGetData'在我从IE中拖动文本时返回'0x80004005'或'E_FAIL'。 – c00000fd

+0

您是否正在查询'IDataObject'实际支持的数据格式? –

+0

我用代码更新了我的原始帖子。如果你看一下'QueryDataObject'法,'HRESULT'我得到了两种情况下'CF_HDROP'和'CF_UNICODETEXT'是'E_FAIL'。我不知道为什么? PS。请注意,上面的代码适用于Chrome和FF。 PS2。仅供参考,我正在拖动文本选择。 – c00000fd