这是一个奇怪的问题,让我试着解释一下。我在支持拖放的 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;
}