IEコントロールのスクリプトエラー表示を消す

IEコントロールでJavascriptなどを含むページを表示しているときにスクリプトエラーダイアログが表示されないようにするにはIOleCommandTarget::Exec()でOLECMDID_SHOWSCRIPTERRORがIEに処理されないようにすればいい。

IOleCommandTarget::Exec()を自前で処理するには、HTMLページの読み込みが終わった時にICustomDoc::SetUIHandler()を使い、IEコントロールに対してIDocHostUIHandlerを設定する。


1.Visual Studio 2008の「ファイル」メニューにある「新規」メニューから「プロジェクト」を選択する。

2.「新しいプロジェクト」の画面で「ATL/WTLアプリケーションウイザード」を選択する。ここではプロジェクト名を「HideScriptError」とした。

3.アプリケーションウイザードが開いたら、「ユーザーインターフェース機能」のタブにある「ビューウインドウの形式」で「HTML」ページを選択して「完了」ボタンを押す。

4.(以上の操作でアプリケーションウイザードにより自動的にひな形となるソースコードが自動生成される)

5.生成したソースコードのViewクラスを開き、以下のソースコードを追加する。

#pragma once

//■以下の宣言を3行追加
#define SINKID_COMTESTEVENTS 0
#include "Exdispid.h"
#include "DnpDocHostUIHandlerImpl.h"


class CHideScriptErrorView : public CWindowImpl<CHideScriptErrorView, CAxWindow>
	,public CComObjectRootEx<CComSingleThreadModel>		//■追加
	,public IDnpDocHostUIHandlerImpl	//■追加
	,public	IDispatchImpl<IDispatch>	//■追加
	,public IOleCommandTarget	//■追加
	,public IDispEventImpl<SINKID_COMTESTEVENTS, CHideScriptErrorView, &DIID_DWebBrowserEvents2>	//■追加
{
	//■メンバー変数を追加
	CComPtr<IWebBrowser2>	_pIWebBrowser2;

public:
	DECLARE_WND_SUPERCLASS(NULL, CAxWindow::GetWndClassName())

	BOOL PreTranslateMessage(MSG* pMsg)
	{
		if((pMsg->message < WM_KEYFIRST || pMsg->message > WM_KEYLAST) &&
		   (pMsg->message < WM_MOUSEFIRST || pMsg->message > WM_MOUSELAST))
			return FALSE;

		// このメッセージを翻訳する機会をHTML ページに与える
		return (BOOL)SendMessage(WM_FORWARDMSG, 0, (LPARAM)pMsg);
	}


	//■以下3行を追加
	BEGIN_SINK_MAP(CHideScriptErrorView)
		SINK_ENTRY_EX(SINKID_COMTESTEVENTS, DIID_DWebBrowserEvents2, DISPID_DOCUMENTCOMPLETE, OnDocumentComplete)
	END_SINK_MAP()

	//■以下5行を追加
	BEGIN_COM_MAP(CHideScriptErrorView)
		COM_INTERFACE_ENTRY(IDispatch)
		COM_INTERFACE_ENTRY(IDocHostUIHandler)
		COM_INTERFACE_ENTRY(IOleCommandTarget)
	END_COM_MAP()

	BEGIN_MSG_MAP(CHideScriptErrorView)
		MESSAGE_HANDLER(WM_DESTROY, OnDestroy)	//■1行追加
	END_MSG_MAP()


	//■OnDocumentCompleteを追加
	HRESULT	_stdcall OnDocumentComplete(IDispatch* pDisp, VARIANT* URL)
	{
		//ドキュメントを読み込み終わった時点でUIHandlerを変更する

		CComPtr<IDispatch>	pIDispatch;
		CComPtr<ICustomDoc>	pICustomDoc;

		_pIWebBrowser2->get_Document(&pIDispatch);
		if(pIDispatch)
			pIDispatch->QueryInterface(IID_ICustomDoc,(void **)&pICustomDoc);
		if(pICustomDoc)
			pICustomDoc->SetUIHandler(static_cast<IDocHostUIHandler*>(this));

		return	S_OK;
	}



	//■IOleCommandTargetの関数追加
    STDMETHODIMP QueryStatus( const GUID* pguidCmdGroup, ULONG cCmds, OLECMD prgCmds[], OLECMDTEXT* pCmdText ) 
	{
		return E_NOTIMPL; 
    }


	//■IOleCommandTargetの関数追加
    STDMETHODIMP Exec( const GUID* pguidCmdGroup, DWORD nCmdID, DWORD nCmdExecOpt, VARIANTARG* pvaIn, VARIANTARG* pvaOut)
    {
		//コマンドがスクリプトエラーを示すものなら、エラー表示を無効にする
		if(nCmdID == OLECMDID_SHOWSCRIPTERROR)
		{
			(*pvaOut).vt		= VT_BOOL;
			(*pvaOut).boolVal	= VARIANT_TRUE;
			return S_OK;
		}

		return E_NOTIMPL;
    }


	//■生成時処理用に関数を追加
	HWND Create(HWND hWndParent, _U_RECT rect = NULL, LPCTSTR szWindowName = NULL,
			DWORD dwStyle = 0, DWORD dwExStyle = 0,
			_U_MENUorID MenuOrID = 0U, LPVOID lpCreateParam = NULL)
	{
		HWND	hWnd;

		hWnd = __super::Create(hWndParent,rect,szWindowName,dwStyle,dwExStyle,MenuOrID,lpCreateParam);
		if(hWnd == NULL)
			return	NULL;

		_pIWebBrowser2 = NULL;
		QueryControl(&_pIWebBrowser2);
		if(_pIWebBrowser2 == NULL)
		{
			ATLASSERT(0);
			return	hWnd;
		}

		//IEとの接続
		Advise(_pIWebBrowser2);

		return	hWnd;
	}


	//■IEからの切断処理を追加
	LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& bHandled)
	{
		bHandled = FALSE;

		if(_pIWebBrowser2)
			Unadvise(_pIWebBrowser2);
		_pIWebBrowser2 = NULL;

		return	0;
	}
};
6.「MainFrm.h」を開き、
	CHideScriptErrorView		m_view;
という部分を
	CComObject<CHideScriptErrorView> m_view;
に変更する。


7.最後に「DnpDocHostUIHandlerImpl.h」というファイルを作成し、その内容を以下のようにする。

#pragma	once


///
///\brief
///	IDocHostUIHandler実装補助用クラス
///
///実処理はないがS_FALSEやS_OKを返す仮想関数もある
///
class	IDnpDocHostUIHandlerImpl :
	public IDocHostUIHandler
{
	virtual HRESULT STDMETHODCALLTYPE ShowContextMenu( 
		/* [in] */ DWORD dwID,
		/* [in] */ POINT *ppt,
		/* [in] */ IUnknown *pcmdtReserved,
		/* [in] */ IDispatch *pdispReserved)
	{
		return	E_NOTIMPL;
	}

	virtual HRESULT STDMETHODCALLTYPE GetHostInfo( 
		/* [out][in] */ DOCHOSTUIINFO *pInfo)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE ShowUI( 
		/* [in] */ DWORD dwID,
		/* [in] */ IOleInPlaceActiveObject *pActiveObject,
		/* [in] */ IOleCommandTarget *pCommandTarget,
		/* [in] */ IOleInPlaceFrame *pFrame,
		/* [in] */ IOleInPlaceUIWindow *pDoc)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE HideUI( void)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE UpdateUI( void)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE EnableModeless( 
		/* [in] */ BOOL fEnable)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE OnDocWindowActivate( 
		/* [in] */ BOOL fActivate)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE OnFrameWindowActivate( 
		/* [in] */ BOOL fActivate)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE ResizeBorder( 
		/* [in] */ LPCRECT prcBorder,
		/* [in] */ IOleInPlaceUIWindow *pUIWindow,
		/* [in] */ BOOL fRameWindow)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE TranslateAccelerator( 
		/* [in] */ LPMSG lpMsg,
		/* [in] */ const GUID *pguidCmdGroup,
		/* [in] */ DWORD nCmdID)
	{
		return	E_NOTIMPL;
	}

	virtual HRESULT STDMETHODCALLTYPE GetOptionKeyPath( 
		/* [out] */ 
		__out  LPOLESTR *pchKey,
		/* [in] */ DWORD dw)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE GetDropTarget( 
		/* [in] */ IDropTarget *pDropTarget,
		/* [out] */ IDropTarget **ppDropTarget)
	{
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE GetExternal( 
		/* [out] */ IDispatch **ppDispatch)
	{
		return	E_NOTIMPL;
	}

	virtual HRESULT STDMETHODCALLTYPE TranslateUrl( 
		/* [in] */ DWORD dwTranslate,
		/* [in] */ 
		__in __nullterminated  OLECHAR *pchURLIn,
		/* [out] */ 
		__out  OLECHAR **ppchURLOut)
	{
		if(ppchURLOut)
			*ppchURLOut = NULL;
		return	S_FALSE;
	}

	virtual HRESULT STDMETHODCALLTYPE FilterDataObject( 
		/* [in] */ IDataObject *pDO,
		/* [out] */ IDataObject **ppDORet)
	{
		return	S_FALSE;
	}
};

プロジェクトファイルをダウンロード


カテゴリー「Internet Explorer」 のエントリー