拖动和下降,由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_DROPFILES
,WM_COPYDATA
和WM_COPYGLOBALDATA
(0x0049)消息。
更新:它看起来像Internet Explorer中特别是在拖&拖放操作造成附加的限制时,它是在保护模式下运行:
How to handle drag & drop from low integrity Internet Explorer
感谢您的信息。我现在可以将文件拖到我的应用程序中,但“拖放”部分似乎不起作用。出于某种原因,从处理QueryDataObject时调用的'IDataObject :: QueryGetData'在我从IE中拖动文本时返回'0x80004005'或'E_FAIL'。 – c00000fd
您是否正在查询'IDataObject'实际支持的数据格式? –
我用代码更新了我的原始帖子。如果你看一下'QueryDataObject'法,'HRESULT'我得到了两种情况下'CF_HDROP'和'CF_UNICODETEXT'是'E_FAIL'。我不知道为什么? PS。请注意,上面的代码适用于Chrome和FF。 PS2。仅供参考,我正在拖动文本选择。 – c00000fd