3

それはちょっと奇妙な問題です、説明させてください。ドラッグアンドドロップをサポートする(ダイアログベースの)アプリをc ++/MFCで作成しました。

デフォルトのテーマを使用して、Windows7で次のテストを実行します。私のアプリは画面上で実行されています。これは(zオーダーの)トップウィンドウではありません。つまり、その上にある他のウィンドウによって隠されています。

リンクまたはChromeまたはFirefoxWebブラウザーからのテキスト選択だけをドラッグし始めると、最初にタスクバーのアプリのアイコンにアイコンが点滅し、アプリが画面にポップアップします(一番上のzオーダーを受け取ることによって)。その後、アプリにドラッグアンドドロップできます。すべてが正常に動作します。

選択したテキストまたはリンクを最初にアプリのタスクバーアイコンにドラッグしてアプリをトップウィンドウ(Zオーダー)にしたときに、IE 9(バージョン9.0.8112、バージョン9.0.12を更新)から同じことを行うと、アプリのアイコンは点滅し続けますが、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()か、整合性の低いプロセスからの、、、および(0x0049)メッセージをChangeWindowMessageFilterEx()アプリに受信させます。WM_DROPFILESWM_COPYDATAWM_COPYGLOBALDATA

更新:特にInternet Explorerは、保護モードで実行されている場合、ドラッグアンドドロップ操作に追加の制限を課しているようです。

整合性の低いInternetExplorerからのドラッグアンドドロップを処理する方法

保護モードのInternetExplorerの理解と操作-アプリケーションでのドラッグアンドドロップ操作の許可

于 2013-01-23T01:07:09.263 に答える