锘??xml version="1.0" encoding="utf-8" standalone="yes"?>
浣滆咃細鏉ㄨ佸笀
涓嬭澆婧愪唬鐮?/font> Band 鏍峰紡 緇勪歡綾誨瀷 CATID
鍏抽敭瀛?/strong>錛欱and錛孌esk Band錛孍xplorer Band錛孴ool Band錛屾祻瑙堝櫒鏍忥紝宸ュ叿鏍忥紝妗岄潰宸ュ叿鏍?br>
涓銆佸紩璦
銆銆鏈榪戯紝鐢變簬宸ヤ綔鐨勮姹傦紝鎴戦渶瑕佸湪 IE 涓婂仛涓浜涘紑鍙戝伐浣溿備簬鏄湪 MSDN 涓婄炕闃呬簡涓浜涜祫鏂欙紝鏍規嵁 MSDN 涓婄殑璇存槑鎴戠敤 ATL 鑳滃埄瀹屾垚浜?#8220;璧勬湰瀹惰佹澘”鍒嗛厤鐨勪換鍔°?br>錛堝茍涓斿湪鐧藉ぉ鐫¤鐨勮繃紼嬩腑姊﹀埌浜嗚佹澘緇欐垜鍔犲伐璧勫暒......錛?br>鐜板湪錛屾垜鎶?MSDN 涓婄殑鍘熸枃璧勬枡錛岀粡榪囩炕璇戞暣鐞嗗茍鎶婁竴涓?ATL 鐨勫疄鐜板璐ょ粰 VCKBASE 涓婄殑鏈嬪弸浠?/p>
鍩烘湰band 瀵硅薄
蹇呴』瀹炵幇鐨?COM 鎺ュ彛
IPersistStream
IObjectWithSite
IDeskBand銆両DockingWindow銆両OleWindow
閫夋嫨瀹炵幇鐨?COM 鎺ュ彛
Band 瀵硅薄娉ㄥ唽
銆銆鍦ㄧ炕璇戠殑榪囩▼涓紝鏈変袱涓瘝姹囬潪甯鎬笉濂界悊瑙c傜涓涓瘝鏄?Band 瀵硅薄錛岃瘝鍏鎬腑緲昏瘧涓?#8220;闀惰竟銆佽瀛愯竟銆佸甫瀛愩佷箰闃?.....”鎴戠殑鑻辨枃姘村鉤鏈夐檺錛屽疄鍦ㄤ笉鐭ラ亾搴旇緲昏瘧涓轟粈涔堣瘝姹囨洿鍚堥傘備簬鏄垜姣呯劧鍐崇劧鍦板喅瀹氾細鍦ㄥ涓嬬殑璁鴻堪涓紝渚濈劧浣跨敤 band 榪欎釜璇嶏紒錛堜粈涔堬紵娌″惉鏄庣櫧錛熸垜鐨勬剰鎬濆氨鏄錛屾垜涓嶇炕璇戣繖涓瘝浜嗭級浣嗗埌搴?Band 瀵硅薄搴旇濡備綍鐞嗚В閭o紵璇風湅鍥句竴錛?br>
鍥句竴
銆銆鍥句竴涓敾綰㈠湀鐨勫湴鏂癸紝鍒嗗埆縐頒綔“鍨傜洿鐨勬祻瑙堝櫒鏍?#8221;銆?#8220;姘村鉤鐨勬祻瑙堝櫒鏍?#8221;銆?#8220;宸ュ叿鏍?#8221;鍜?#8220;妗岄潰宸ュ叿鏍?#8221;銆傝繖浜?#8220;鏍?#8221;錛岄兘鍙互鍦?IE 鐨?#8220;鏌ョ湅”鑿滃崟涓垨榧犳爣鍙抽敭鐨勪笂涓嬫枃蹇嵎鏂瑰紡鑿滃崟涓樉紺烘垨闅愯棌璧鋒潵銆傝繖浜涚晫闈㈢獥鍙g殑瀹炵幇錛屽叾瀹炲氨鏄疄鐜頒竴縐?COM 鎺ュ彛瀵硅薄錛岃岃繖涓璞″彨 band銆傝繖涓蹇靛疄鍦ㄦ槸鍙兘鎰忎細鑰屾棤娉曡█浼犵殑錛屾垜鎬諱笉鑳藉湪鏂囩珷涓妸瀹冪炕璇戜負“鎬繪槸闈犲湪 IE 涓葷獥鍙h竟涓婄殑瀵硅薄”鍚э紵^_^
銆銆鍙﹀錛岃繕鏈変竴涓瘝鍙?site銆傝繖涓緢濂界炕璇戯紝鍙?#8220;绔欑偣”錛併傚懙鍛碉紝鎴戞暍鎵撳寘紲紝濡傛灉浣犺鑳界悊瑙h繖涓炕璇戝湪璁$畻鏈虹被鏂囩珷涓殑鍚箟錛岄偅灝卞彧鑳芥伃鍠滀綘浜嗭紝浣犵殑鏅烘収澶珮浜嗐傦紙閮芥槸瀛﹁綆楁満杞歡鐨勪漢錛屽仛浜虹殑宸窛鍜嬪氨榪欎箞澶у憿錛燂級鍦ㄦ湰綃囨枃绔犱腑錛宻ite 鍙互榪欐牱鐞嗚В錛欼E 鐨勪富妗嗘灦鍥涘懆錛屽氨濂芥瘮鏄?#8220;姹借濺绔?#8221;錛岄偅浜?band 瀵硅薄錛屽氨濂芥瘮鏄?#8220;姹借濺”銆俠and 姹借濺鎬繪槸鍙互鍋滈潬鍦?#8220;姹借濺绔?#8221;涓娿傛墍浠ワ紝site 灝辨槸“绔欑偣”錛屽畠涔熸槸 COM 鎺ュ彛鐨勫璞★紙IObjectWithSite銆両InputObjectSite錛夈?br>
3.1銆鍩烘湰 band 瀵硅薄
銆銆Band 瀵硅薄錛屼粠 Shell 4.71(IE 5.0) 寮濮嬫彁渚涙敮鎸併侭and 鏄竴涓?COM 瀵硅薄錛屽繀欏繪斁鍦ㄤ竴涓鍣ㄤ腑鍘諱嬌鐢紝褰撶劧浣跨敤瀹冧滑灝卞ソ璞′嬌鐢ㄦ櫘閫氱獥鍙f槸涓鏍風殑銆侷E 灝辨槸涓涓鍣紝妗岄潰 Shell 涔熸槸涓涓鍣紝瀹冧滑鎻愪緵涓嶅悓鐨勫嚱鏁板姛鑳斤紝浣嗗熀鏈殑瀹炵幇鏄浉浼肩殑銆?br>銆銆Band 瀵硅薄鍒嗕笁縐嶇被鍨嬶紝嫻忚鍣ㄦ爮 band錛圗xplorer bands錛夈佸伐鍏鋒爮 band錛圱ool Bands錛夊拰妗岄潰宸ュ叿鏍?Desk bands)錛岃屾祻瑙堝櫒鏍?band 鍙堟湁涓ょ琛ㄧ幇褰㈠紡錛氬瀭鐩村拰姘村鉤鐨勩傞偅涔?IE 鍜?Shell 濡備綍鍖哄垎騫跺姞杞借繖浜?bands 瀵硅薄鍛紵鏂規硶鏄細浣犺瀵逛笉鍚岀殑 band 瀵硅薄錛屽湪娉ㄥ唽琛ㄤ腑娉ㄥ唽涓嶅悓鐨勭粍浠剁被鍨嬶紙CATID錛夈?br>
鍨傜洿鐨勬祻瑙堝櫒鏍?/td>
CATID_InfoBand
00021493-0000-0000-C000-000000000046
姘村鉤鐨勬祻瑙堝櫒鏍?/td>
CATID_CommBand
00021494-0000-0000-C000-000000000046
妗岄潰鐨勫伐鍏鋒爮
CATID_DeskBand
00021492-0000-0000-C000-000000000046
銆銆IE 宸ュ叿鏍忎笉浣跨敤緇勪歡綾誨瀷娉ㄥ唽錛岃屾槸浣跨敤鍦ㄦ敞鍐岃繘琛?CLSID 鐨勭櫥璁版柟寮忋傝緇嗘儏鍐佃 3.3銆?br>銆銆鍦ㄤ緥瀛愮▼搴忎腑錛屽疄鐜頒簡鍏ㄩ儴鍥涗釜綾誨瀷鐨?band 瀵硅薄錛屽瀭鐩存祻瑙堝櫒鏍?CVerticalBar)鏄劇ず浜嗕竴涓?HTML 鏂囦歡錛屽茍涓斿疄鐜頒簡瀵?IE 涓葷獥鍙f祻瑙堢綉欏電殑瀵艱埅絳夊姛鑳斤紱姘村鉤鐨勬祻瑙堝櫒鏍?CHorizontalBar)鏄竴涓紪杈戠獥錛屽畠鍚屾鏄劇ず褰撳墠緗戦〉鐨?BODY 婧愭枃浠跺唴瀹癸紱IE 宸ュ叿鏍?CToolBar)鏈綆鍗曪紝鍙槸娣誨姞浜嗕竴涓┖鐨勫伐鍏鋒爮錛涙闈㈠伐鍏鋒爮(CDeskBar)瀹炵幇浜嗕竴涓崟琛岀紪杈戠獥鍙o紝浣犲彲浠ュ湪涓婇潰杈撳叆鍛戒護琛屾垨鏂囦歡鍚嶇О錛屽洖杞﹀悗瀹冧細鎵ц Shell 鐨勬墦寮鍔ㄤ綔銆?br>
3.2銆蹇呴』瀹炵幇鐨?COM 鎺ュ彛
銆銆Band 瀵硅薄鏄?IE 鎴?Shell 鐨勮繘紼嬪唴鏈嶅姟鍣紝鎵浠ュ畠琚寘瑁呭湪 DLL 涓傝屼綔涓?COM 瀵硅薄錛屽畠蹇呴』瑕佸疄鐜?IUnknown 鍜?IClassFactory 鎺ュ彛銆傦紙澶у鍙互涓嶅悓鎿嶅績錛屽洜涓烘垜浠敤 ATL 鍐欑▼搴忥紝榪欎袱涓帴鍙f槸涓嶇敤鎴戜滑鑷繁鍐欎唬鐮佺殑銆傦級鍙﹀錛孊and 瀵硅薄榪樺繀欏誨疄鐜?IDeskBand銆両ObjectWithSite 鍜?IPersistStream 涓変釜鎺ュ彛錛?br>銆銆IPersistStream 鏄寔緇ф帴鍙g殑涓縐嶃傚綋 IE 鍔犺澆 band 瀵硅薄鐨勬椂鍊欙紝瀹冮氳繃榪欎釜鎺ュ彛鐨?Load 鏂規硶浼犻掑睘鎬у肩粰瀵硅薄錛岃鍏惰繘琛屽垵濮嬪寲錛涜屽綋鍗歌澆鍓嶏紝IE 鍒欒皟鐢ㄨ繖涓帴鍙g殑 Save 鏂規硶淇濆瓨瀵硅薄鐨勫睘鎬с傜敤 ATL 瀹炵幇榪欎釜鎺ュ彛寰堢畝鍗曪細
class ATL_NO_VTABLE Cxxx : ...... public IPersistStreamInitImpl, // 娣誨姞緇ф壙 ......{public: BOOL m_bRequiresSave; // IPersistStreamInitImpl 鎵蹇呴』鐨勫彉閲?.....BEGIN_COM_MAP(CVerticalBar) ...... COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit) COM_INTERFACE_ENTRY2(IPersistStream, IPersistStreamInit) COM_INTERFACE_ENTRY(IPersistStreamInit) ......END_COM_MAP()BEGIN_PROP_MAP(Cxxx)...... // 娣誨姞闇瑕佹寔緇х殑灞炴ND_PROP_MAP()
銆銆涓婇潰鐨勪唬鐮侊紝鍏跺疄瀹炵幇鐨勬槸 IPersistStreamInit 鎺ュ彛錛屼笉榪囨病鏈夊叧緋伙紝鍥犱負 IPersistStreamInit 媧劇敓鑷?IPersistStream錛屽疄渚嬪寲浜嗘淳鐢熺被錛岃嚜鐒跺氨瀹炰緥鍖栦簡鍩虹被銆傚湪渚嬪瓙紼嬪簭涓紝鎴戝彧鍦ㄦ闈㈠伐鍏鋒爮瀵硅薄涓坊鍔犱簡鎸佺畫鎬у睘鎬э紝鐢ㄦ潵淇濆瓨鍜屽垵濮嬪寲“鍛戒護琛?#8221;銆傚彟澶?COM_INTERFACE_ENTRY2(A錛孊)琛ㄧず鐨勫惈涔夋槸錛氬鏋滄兂鏌ヨA鎺ュ彛鐨勬寚閽堬紝鍒欐彁渚汢鎺ュ彛鎸囬拡鏉ヤ唬鏇褲備負浠涔堝彲浠ヨ繖鏍烽偅錛熷洜涓築鎺ュ彛媧劇敓鑷狝鎺ュ彛錛岄偅涔圔鎺ュ彛鐨勫墠鍑犱釜鍑芥暟蹇呯劧灝辨槸A鎺ュ彛鐨勫嚱鏁頒簡錛岃嚜鐒禕鎺ュ彛鐨勫湴鍧鍏跺疄鍜孉鎺ュ彛鐨勫湴鍧鏄竴鏍風殑浜嗐?br>銆銆IObjectWithSite 鏄?IE 鐢ㄦ潵瀵規彃浠惰繘琛岀鐞嗗拰閫氳鐢ㄧ殑涓涓帴鍙c傚繀欏昏瀹炵幇榪欎釜鎺ュ彛鐨?涓嚱鏁幫細SetSite() 鍜?GetSite()銆傚綋 IE 鍔犺澆 band 瀵硅薄鍜岄噴鏀?band 瀵硅薄鐨勬椂鍊欙紝閮借璋冪敤 SetSite()鍑芥暟錛岄偅涔堝湪榪欎釜鍑芥暟閲屾濂芥槸鍐欏垵濮嬪寲鍜岄噴鏀炬搷浣滀唬鐮佺殑鍦版柟錛?
STDMETHODIMP Cxxx::SetSite(IUnknown *pUnkSite){ if( NULL == pUnkSite ) // 閲婃斁 band 鐨勬椂鍊?{ // 濡傛灉鍔犺澆鐨勬椂鍊欙紝淇濆瓨浜嗕竴浜涙帴鍙? // 閭d箞鐜板湪錛氶噴鏀懼畠 } else // 鍔犺澆 band 鐨勬椂鍊?{ m_hwndParent = NULL; // 瑁呰澆 band 鐨勭埗紿楀彛(灝辨槸甯︽湁鏍囬鐨勯偅涓鏋剁獥鍙? // 榪欎釜紿楀彛鐨勫彞鏌勶紝鏄皟鐢?IUnknown::QueryInterface() 寰楀埌 IOleWindow // 鐒跺悗璋冪敤 IOleWindow::GetWindow() 鑰岃幏寰楃殑銆? CComQIPtr< IOleWindow, &IID_IOleWindow > spOleWindow(pUnkSite); if( spOleWindow ) spOleWindow->GetWindow(&m_hwndParent); if( !m_hwndParent ) return E_FAIL; // 鐜板湪錛屾濂芥槸寤虹珛瀛愮獥鍙g殑鏃舵満銆? // 娉ㄦ剰錛屽瓙紿楀彛寤虹珛鐨勬椂鍊欙紝涓嶈浣跨敤 WS_VISIBLE 灞炴? ... ... // 鍦ㄤ緥瀛愮▼搴忎腑錛岀敤 CAxWindow 瀹炵幇浜嗕竴涓兘鍖呭ActiveX鐨勫鍣ㄧ獥鍙?鍨傜洿嫻忚鍣ㄦ爮) // 鍦ㄤ緥瀛愮▼搴忎腑錛岀敤 WIN API 鍑芥暟 CreateWindow 瀹炵幇浜嗘爣鍑嗙獥鍙?姘村鉤嫻忚鍣ㄦ爮銆佸伐鍏鋒爮) // 鍦ㄤ緥瀛愮▼搴忎腑錛岀敤 CWindowImpl 瀹炵幇浜嗕竴涓寘瀹圭獥鍙?妗岄潰宸ュ叿鏍? /*********************************************************/ 浠ヤ笅閮ㄥ垎錛屾牴鎹?band 瀵硅薄鐗規湁鐨勫姛鑳斤紝鏄彲浠ラ夋嫨瀹炵幇鐨? **********************************************************/ // 濡傛灉瀛愮獥鍙e疄鐜頒簡鐢ㄦ埛杈撳叆錛岄偅涔堝繀欏誨疄鐜?IInputObject 鎺ュ彛錛? // 鑰岃鎺ュ彛鏄 IE 鐨?IInputObjectSite 璋冪敤鐨勶紝鍥犳鍦ㄤ綘鐨勫璞? // 涓紝搴旇淇濆瓨 IInputObjectSite 鐨勬帴鍙f寚閽堛? // 鍦ㄧ被鐨勫ご鏂囦歡涓紝瀹氫箟錛? // CComQIPtr< IInputObjectSite, &IID_IInputObjectSite > m_spSite; m_spSite = pUnkSite; // 淇濆瓨 IInputObjectSite 鎸囬拡 if( !m_spSite ) return E_FAIL; // 浣犻渶瑕佹帶鍒?IE 鐨勪富妗嗘灦鍚楋紵 // 閭d箞鍦ㄧ被鐨勫ご鏂囦歡涓紝瀹氫箟錛? // CComQIPtr< IWebBrowser2, &IID_IWebBrowser2 > m_spFrameWB; // 鐒跺悗錛屽厛鍙栧緱 IServiceProvider,鍐嶅彇寰?IWebBrowser2 CComQIPtr < IServiceProvider, &IID_IServiceProvider> spSP(pUnkSite); if( !spSP ) return E_FAIL; spSP->QueryService( SID_SWebBrowserApp, &m_spFrameWB ); if( !m_spFrameWB) return E_FAIL; // 濡傛灉浣犲彇寰椾簡 IE 涓繪鏋剁殑 IWebBrowser2 鎸囬拡 // 閭d箞錛屽綋瀹冨彂鐢熶簡浠涔堜簨鎯咃紝浣犻毦閬撲笉鎯崇煡閬撳悧錛? // 瀹氫箟錛欳ComPtr m_spCP; CComQIPtr< IConnectionPointContainer, &IID_IConnectionPointContainer> spCPC( m_spFrameWB ); if( spCPC ) { spCPC->FindConnectionPoint( DIID_DWebBrowserEvents2, &m_spCP ); if( m_spCP ) { m_spCP->Advise( reinterpret_cast< IDispatch * >( this ), &m_dwCookie ); } } // 鍜硚~~ 涓嶈浜嗭紝鐪嬫簮鐮佸幓鍚с傝繖閲岃兘騫茬殑浜嬫儏澶浜?.. ... } return S_OK;}
IDeskBand 鏄竴涓壒孌婄殑 band 瀵硅薄鎺ュ彛錛屾湁涓涓柟娉曞嚱鏁幫細GetBarInfo()錛?br>IDockingWindow 鏄?IDeskBank 鐨勫熀綾伙紝鏈?涓柟娉曞嚱鏁幫細ShowDW()銆丆loseDW()銆丷esizeBorderDW()錛?br>IOleWindow 鍙堟槸 IDockingWindow 鐨勫熀綾伙紝鏈?涓柟娉曞嚱鏁幫細GetWindow()銆丆ontextSensitiveHelp()錛?class ATL_NO_VTABLE Cxxx : ...... public IDeskBand, ......{......BEGIN_COM_MAP(Cxxx) ...... COM_INTERFACE_ENTRY_IID(IID_IDeskBand, IDeskBand) ......END_COM_MAP()// IOleWindowSTDMETHODIMP Cxxx::GetWindow(HWND * phwnd){ // 鍙栧緱 band 瀵硅薄鐨勭獥鍙e彞鏌?// m_hWnd 鏄緩绔嬬獥鍙f椂鍊欎繚瀛樼殑 *phwnd = m_hWnd; return S_OK;}STDMETHODIMP Cxxx::ContextSensitiveHelp(BOOL fEnterMode){ // 涓婁笅鏂囧府鍔╋紝鍙傝?IContextMenu 鎺ュ彛 return E_NOTIMPL;}// IDockingWindowSTDMETHODIMP CVerticalBar::ShowDW(BOOL bShow){ // 鏄劇ず鎴栭殣钘?band 紿楀彛 if( m_hWnd ) ::ShowWindow( m_hWnd, bShow ? SW_SHOW : SW_HIDE); return S_OK;}STDMETHODIMP CVerticalBar::CloseDW(DWORD dwReserved){ // 閿姣?band 紿楀彛 if( ::IsWindow( m_hWnd ) ) ::DestroyWindow( m_hWnd ); m_hWnd = NULL; return S_OK;}STDMETHODIMP CVerticalBar::ResizeBorderDW(LPCRECT prcBorder, IUnknown* punkToolbarSite, BOOL fReserved){ // 褰撴鏋剁獥鍙g殑杈規澶у皬鏀瑰彉鏃?return E_NOTIMPL;}// IDeskBandSTDMETHODIMP CVerticalBar::GetBandInfo(DWORD dwBandID, DWORD dwViewMode, DESKBANDINFO* pdbi){ // 鍙栧緱 band 鐨勫熀鏈俊鎭紝浣犻渶瑕佸~鍐?pdbi 鍙傛暟浣滀負榪斿洖 if( NULL == pdbi ) return E_INVALIDARG; // 濡傛灉灝嗘潵闇瑕佽皟鐢?IOleCommandTarget::Exec() 鍒欓渶瑕佷繚瀛樿繖2涓弬鏁?m_dwBandID = dwBandID; m_dwViewMode = dwViewMode; if(pdbi->dwMask & DBIM_MINSIZE) { // 鏈灝忓昂瀵? pdbi->ptMinSize.x = 10; pdbi->ptMinSize.y = 10; } if(pdbi->dwMask & DBIM_MAXSIZE) { // 鏈澶у昂瀵?(-1 琛ㄧず 4G) pdbi->ptMaxSize.x = -1; pdbi->ptMaxSize.y = -1; } if(pdbi->dwMask & DBIM_INTEGRAL) { pdbi->ptIntegral.x = 1; pdbi->ptIntegral.y = 1; } if(pdbi->dwMask & DBIM_ACTUAL) { pdbi->ptActual.x = 0; pdbi->ptActual.y = 0; } if(pdbi->dwMask & DBIM_TITLE) { // 紿楀彛鏍囬 wcscpy(pdbi->wszTitle,L"紿楀彛鏍囬"); } if(pdbi->dwMask & DBIM_MODEFLAGS) { pdbi->dwModeFlags = DBIMF_VARIABLEHEIGHT; } if(pdbi->dwMask & DBIM_BKCOLOR) { // 濡傛灉浣跨敤榛樿鐨勮儗鏅壊錛屽垯縐婚櫎璇ユ爣蹇? pdbi->dwMask &= ~DBIM_BKCOLOR; } return S_OK;}
3.3銆閫夋嫨瀹炵幇鐨?COM 鎺ュ彛STDMETHODIMP CExplorerBar::UIActivateIO(BOOL fActivate, LPMSG pMsg){ if(fActivate) SetFocus(m_hWnd); return S_OK;}STDMETHODIMP CExplorerBar::HasFocusIO(void){ if(m_bFocus) return S_OK; return S_FALSE;}STDMETHODIMP CExplorerBar::TranslateAcceleratorIO(LPMSG pMsg){ return S_FALSE;}
銆銆Band 瀵硅薄鑳藉閫氳繃鍖呭鍣ㄧ殑 IOleCommandTarget::Exec() 璋冪敤鎵ц鍛戒護銆傝?IOleCommandTarget 鎺ュ彛鎸囬拡錛屽垯鍙互閫氳繃璋冪敤鍖呭鍣ㄧ殑 IInputOjbectSite::QueryInterface錛圛ID_IOleCommandTarget,...錛?鍑芥暟寰楀埌銆侰GID_DeskBand 鏄懡浠ょ粍錛屽綋涓涓?band 瀵硅薄鐨?GetBandInfo 琚皟鐢ㄧ殑鏃跺欙紝鍖呭鍣ㄩ氳繃 dwBandID 鍙傛暟鎸囧畾涓涓?ID 緇?band 瀵硅薄錛屽璞¤淇濆瓨浣忚繖涓狪D錛屼互渚胯皟鐢?IOleCommandTarget::Exec()鐨勬椂鍊欎嬌鐢ㄣ侷D 鐨勫懡浠ゆ湁錛?
| 鍊?/font> | 鎻忚堪 |
|---|---|
| pUnk | band 瀵硅薄鐨?IUnknown 鎸囬拡錛屽叾瀹冪殑妗岄潰 bands 灝嗚闅愯棌 |
| 0 | 闅愯棌鎵鏈夌殑妗岄潰 bands |
| 1 | 鏄劇ず鎵鏈夌殑妗岄潰 bands |
3.4銆Band 瀵硅薄娉ㄥ唽
銆銆Band 瀵硅薄蹇呴』娉ㄥ唽涓轟竴涓?OLE 榪涚▼鍐呯殑鏈嶅姟鍣紝騫朵笖鏀寔 apartment 綰跨▼鍏瘬銆傛敞鍐岃〃涓粯璁ら敭鐨勫兼槸琛ㄧず鑿滃崟鐨勬枃瀛椼傚浜庢祻瑙堝櫒鏍忥紝瀹冨姞鍒?IE 鑿滃崟鐨?#8220;鏌ョ湅\嫻忚鍣ㄦ爮”涓紱瀵逛簬宸ュ叿鏍?band 錛屽畠鍔犲埌 IE 鑿滃崟鐨?#8220;鏌ョ湅\宸ュ叿鏍?#8221;涓紱瀵逛簬妗岄潰 band錛?瀹冨姞鍒扮郴緇熶換鍔℃爮鐨勫揩鎹瘋彍鍗曚腑銆傚湪鑿滃崟璧勬簮涓紝鍙互浣跨敤“&”鎸囨槑鍔犻熼敭銆?br>
閫氬父錛屼竴涓熀鏈殑 band 瀵硅薄鐨勬敞鍐岃〃欏圭洰鏄細
HKEY_CLASSES_ROOT
CLSID
{浣犵殑 band 瀵硅薄鐨?CLSID}
銆銆(Default) = 鑿滃崟鐨勬枃瀛?
銆銆InProcServer32
銆銆銆(Default) = DLL 鐨勫叏璺緞鏂囦歡鍚?
銆銆銆ThreadingModel= Apartment
宸ュ叿鏍?bands 榪樺繀欏繪妸瀹冧滑鐨?CLSID 娉ㄥ唽鍒?IE 鐨勬敞鍐岃〃涓?br>
鍦?HKEY_LOCAL_MACHINE\Software\Microsoft\Internet Explorer\Toolbar 涓嬬粰鍑?CLSID 浣滀負閿悕錛岃屽叾閿兼槸琚拷鐣ョ殑銆?br>
HKEY_LOCAL_MACHINE
Software
Microsoft
Internet Explorer
Toolbar
銆銆{浣犵殑 band 瀵硅薄鐨?CLSID}
銆銆榪樻湁鍑犱釜鍙夌殑娉ㄥ唽琛ㄩ」鐩?渚嬪瓙紼嬪簭騫朵笉鏄繖鏍峰疄鐜扮殑)銆傛瘮濡傦紝浣犳兂璁╂祻瑙堝櫒鏍忔樉紺?HTML 鐨勮瘽錛屽繀欏昏濡備笅璁劇疆娉ㄥ唽琛細
HKEY_CLASSES_ROOT
CLSID
{浣犵殑 Band 瀵硅薄鐨?CLSID}
Instance
CLSID
銆銆(Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}
鍚屾椂錛屽鏋滆鎸囧畾涓涓湰鍦扮殑 HTML 鏂囦歡錛岄偅涔堣濡備笅璁劇疆錛?
HKEY_CLASSES_ROOT
CLSID
{浣犵殑 Band 瀵硅薄鐨?CLSID}
Instance
InitPropertyBag
銆銆Url
銆銆鍙﹀錛岃繕鍙互鎸囧畾嫻忚鍣ㄦ爮鐨勫鍜岄珮錛屽綋鐒訛紝瀹冩槸渚濊禆浜庤繖涓爮鏄旱鍚戣繕鏄í鍚戠殑銆傚叾瀹炶繖涓」鐩棤鎵璋擄紝鍥犱負褰撶敤鎴瘋皟鏁翠簡嫻忚鍣ㄦ爮鐨勫ぇ灝忓悗錛屼細鑷姩淇濆瓨鍦ㄦ敞鍐岃〃涓殑銆?br>
HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{浣犵殑 Band 瀵硅薄鐨?CLSID}
銆銆BarSize
銆銆BarSize 閿殑綾誨瀷蹇呴』鏄?REG_BINARY 綾誨瀷錛屽畠鏈?涓瓧鑺傘傚乏璧峰墠4涓瓧鑺傦紝鏄敤16榪涘埗琛ㄧず鐨勫儚绱犲搴︽垨楂樺害錛屽悗4涓瓧鑺備繚鐣欙紝浣犲簲璇ヨ緗負0銆備笅闈㈡槸涓涓彲浠ュ湪嫻忚鍣ㄦ爮涓婃樉紺?HTML 鏂囦歡鐨勫叏閮ㄦ敞鍐岃〃欏圭洰鐨勪緥瀛愶紝榛樿瀹藉害涓?91錛?x123錛変釜鍍忕礌鐐癸細
HKEY_CLASSES_ROOT
CLSID
{浣犵殑 Band 瀵硅薄鐨?CLSID}
銆(Default) = 鑿滃崟鏂囧瓧
銆InProcServer32
銆銆(Default) = DLL 鐨勫叏璺緞鏂囦歡鍚?
銆銆ThreadingModel= Apartment
Instance
CLSID
銆銆(Default) = {4D5C8C2A-D075-11D0-B416-00C04FB90376}
InitPropertyBag
銆銆Url= 浣犵殑 HTML 鏂囦歡鍚?br>
HKEY_CURRENT_USER
Software
Microsoft
Internet Explorer
Explorer Bars
{浣犵殑 Band 瀵硅薄鐨?CLSID}
銆銆BarSize= 23 01 00 00 00 00 00 00
銆銆瀵逛簬娉ㄥ唽琛ㄧ殑璁劇疆錛岀敤 ATL 瀹炵幇鍏跺疄鏄紓甯哥畝鍗曠殑銆傛墦寮宸ョ▼鐨?xxx.rgs 鏂囦歡錛屽茍鎵嬪伐緙栬緫涓涓嬪氨鍙互浜嗐?涓嬮潰榪欎釜鏂囦歡婧愮爜錛屾槸渚嬪瓙紼嬪簭涓?IE 宸ュ叿鏍忕殑娉ㄥ唽琛ㄦ牱寮忥紝HKLM 鏄渶瑕佹墜宸ユ坊鍔犵殑錛屽洜涓哄畠涓嶄嬌鐢ㄧ粍浠剁被鍨嬫柟寮忔敞鍐屻傝屽浜庡叾瀹冪被鍨嬬殑 band 瀵硅薄鍙鍦ㄧ被澹版槑涓坊鍔狅細
BEGIN_CATEGORY_MAP(Cxxx) // 鍚戞敞鍐岃〃涓敞鍐?COM 綾誨瀷 IMPLEMENTED_CATEGORY(CATID_InfoBand) // 鍨傜洿鏍峰紡鐨勬祻瑙堝櫒鏍廍ND_CATEGORY_MAP()IE 宸ュ叿鏍忕被鍨?band 瀵硅薄鐨?#8220;.rgs”鏂囦歡
HKCR // 榪欎釜欏圭洰鏄?ATL 甯綘鐢熸垚鐨勶紝浣犲彧瑕佹墜宸ヤ慨鏀?#8220;鑿滃崟涓婄殑鏂囧瓧”灝卞彲浠ヤ簡{ Bands.ToolBar.1 = s ''ToolBar Class'' { CLSID = s ''{ 浣犵殑 CLSID }'' } Bands.ToolBar = s ''ToolBar Class'' { CLSID = s ''{ 浣犵殑 CLSID }'' CurVer = s ''Bands.ToolBar.1'' } NoRemove CLSID { ForceRemove { 浣犵殑 CLSID } = s ''鐢ㄥ湪鑿滃崟涓婄殑鏂囧瓧(&T)'' { ProgID = s ''Bands.ToolBar.1'' VersionIndependentProgID = s ''Bands.ToolBar'' ForceRemove ''Programmable'' InprocServer32 = s ''%MODULE%'' { val ThreadingModel = s ''Apartment'' } ''TypeLib'' = s ''{xxxx-xxxx-xxxxxxxxxxxxxxx}'' } }}HKLM // 榪欎釜欏圭洰鏄墜宸ユ坊鍔犵殑IE宸ュ叿鏍忔墍鐗規湁鐨剓 Software { Microsoft { ''Internet Explorer'' { NoRemove Toolbar { ForceRemove val { 浣犵殑 CLSID } = s ''闅忎究緇欎釜璇存槑鎬ф枃瀛椾覆'' } } } }}
鍥涖?ATL 瀹炵幇


IDocHostUIHandler::GetDropTarget Method鈥斺擟alled by MSHTML when it is used as a drop target. This method enables the host to supply an alternative IDropTarget interface.
STDMETHODIMP CHtmlControlSite::XDocHostUIHandler::GetDropTarget(LPDROPTARGET pDropTarget, LPDROPTARGET* ppDropTarget){METHOD_PROLOGUE_EX_(CHtmlControlSite, DocHostUIHandler)*ppDropTarget = g_pDropTarget;//灝嗚嚜瀹氫箟鐨勫疄鐜板憡鐭SHTML寮曟搸return S_OK;}
IHTMLDataTransfer MembersclearData鈥斺擱emoves one or more data formats from the clipboard through dataTransfer or clipboardData object.dropEffect鈥斺擲ets or retrieves the type of drag-and-drop operation and the type of cursor to display.effectAllowed鈥斺擲ets or retrieves, on the source element, which data transfer operations are allowed for the object.getData鈥斺擱etrieves the data in the specified format from the clipboard through the dataTransfer or clipboardData objects.setData鈥斺擜ssigns data in a specified format to the dataTransfer or clipboardData object.
HRESULT CHtmlDocument2::OnInvoke(DISPID dispidMember, REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS * pdispparams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo,UINT * puArgErr){......//濡傛灉鍙槸瑕佽緗紶鏍囨嫋鎷芥晥鏋滅殑璇濓紝榪欎釜浜嬩歡鍙互涓嶅鐞?/font>case DISPID_HTMLELEMENTEVENTS_ONDRAGSTART :{OnDragStart();break ;}//閲嶇偣鍦ㄨ繖閲?/font>case DISPID_HTMLELEMENTEVENTS_ONDRAGOVER :{OnDragOver();break ;}case DISPID_HTMLELEMENTEVENTS_ONDROP :{OnDrop();break ;}......}void CHtmlDocument2::OnDragOver( void ){SetDragEffect(); //璁劇疆榧犳爣鎷栨嫿鏁堟灉}void CHtmlDocument2::SetDragEffect( void ){CComQIPtr<IHTMLWindow2> pWindow;CComQIPtr<IHTMLEventObj> pEventObj;CComQIPtr<IHTMLEventObj2> pEventObj2;CComQIPtr<IHTMLElement> pElement;HRESULT hr = m_spHtmlObj->get_parentWindow( &pWindow );hr = pWindow->get_event( &pEventObj );//ondragover鍙戠敓鏃禝E鐨勯粯璁よ涓烘槸“娌℃湁榧犳爣鎷栨嫿鏁堟灉”銆?/font>//灝咺HTMLEventObj鐨勮繑鍥炲艱涓篺alse鍗沖彲鍙栨秷璇ヤ簨浠剁殑榛樿琛屼負錛屾墍浠ユ墽琛屽畬涓嬮潰榪欏彞璇濓紝鎷栨嫿鏁堟灉灝卞嚭鐜頒簡銆?/font>AllowDisplayDragCursor(pEventObj, FALSE);CComBSTR bstrTagName;pEventObj->get_srcElement(&pElement); //鑾峰緱褰撳墠HTML ElementpElement->get_tagName(&bstrTagName);if ( IsEditArea(bstrTagName) ) //鏍規嵁Tag Name鍒ゆ柇鏄惁榧犳爣浣嶄簬杈撳叆妗嗭紝浠ヤ究璁劇疆鐒︾偣浣垮緱鍏夋爣闅忛紶鏍囩Щ鍔?/font>{CComQIPtr<IHTMLElement2> pElement2;if ( SUCCEEDED(pElement->QueryInterface(IID_IHTMLElement2, (void **) &pElement2 ))&& pElement2 ){pElement2->focus();}//榛樿鎯呭喌涓嬶紝褰撴嫋鎷芥枃妗e埌杈撳叆妗嗘椂錛岄紶鏍囦細鍙樻垚鎷栨嫿鐨勫厜鏍囷紝鎵浠ヨ繖閲屼嬌鐢↖E鐨勯粯璁よ涓恒?/font>AllowDisplayDragCursor(pEventObj, TRUE);}}BOOL CHtmlDocument2::IsEditArea(CComBSTR bstrTagName){return bstrTagName == "INPUT" || bstrTagName == "TEXTAREA";}void CHtmlDocument2::AllowDisplayDragCursor(CComQIPtr<IHTMLEventObj> pEventObj, BOOL bAllow){VARIANT v;v.vt = VT_BOOL;v.boolVal = !bAllow ? VARIANT_FALSE : VARIANT_TRUE;pEventObj->put_returnValue(v);}void CHtmlDocument2::OnDrop( void ){CComQIPtr<IHTMLWindow2> pWindow;CComQIPtr<IHTMLEventObj> pEventObj;CComQIPtr<IHTMLEventObj2> pEventObj2;CComQIPtr<IHTMLElement> pElement;CComQIPtr<IHTMLDataTransfer> pdt; //姝ゅ婕旂ず濡備綍浣跨敤IHTMLDataTransferHRESULT hr = m_spHtmlObj->get_parentWindow( &pWindow );hr = pWindow->get_event( &pEventObj );hr = pEventObj->QueryInterface(IID_IHTMLEventObj2, (void **) &pEventObj2 );hr = pEventObj2->get_dataTransfer(&pdt);CComBSTR bstrFormat = "URL"; //棣栧厛灝濊瘯鑾峰彇URLVARIANT Data;hr = pdt->getData(bstrFormat, &Data);if ( Data.vt != VT_NULL ){ //鑾峰彇鎴愬姛錛屾嫋鏀劇殑瀵硅薄鏄疷rlDoOpenUrl(CString(Data.bstrVal));}else{ //鍚﹀垯灝濊瘯鑾峰彇閫変腑鐨勬枃鏈?/font>bstrFormat = "Text";hr = pdt->getData(bstrFormat, &Data);if ( Data.vt != VT_NULL ){ //鑾峰彇鎴愬姛錛屾嫋鏀劇殑鍐呭鏄枃鏈?/font>CComBSTR bstrTagName;pEventObj->get_srcElement(&pElement);pElement->get_tagName(&bstrTagName);if ( IsEditArea(bstrTagName) ){//Drop target鏄緭鍏ユ錛屼笉鍋氫換浣曟搷浣滐紝鐢盜E榪涜榛樿澶勭悊return ;}else{ //鍚﹀垯鎴戜滑鑷繁澶勭悊鏂囨湰錛屾垨淇濆瓨錛屾垨媯嫻嬫槸鍚﹂摼鎺ュ悗鎵撳紑錛岀瓑絳?/font>DoProcessText(CString(Data.bstrVal));//Process the text}}else{ //鏃笉鏄摼鎺ワ紝涔熶笉鏄枃鏈紝鍙涓烘槸鏉ヨ嚜澶栭儴錛堝Windows Shell錛夌殑鏂囦歡鎷栨斁DoOnDropFiles(pdt);}}}//婕旂ず濡備綍浠嶪HTMLDataTransfer寰楀埌IDataObjectvoid CHtmlDocument2::DoOnDropFiles(CComQIPtr<IHTMLDataTransfer> pDataTransfer)
{CComQIPtr<IServiceProvider> psp;CComQIPtr<IDataObject> pdo;if ( FAILED(pDataTransfer->QueryInterface(IID_IServiceProvider, (void **) &psp)) ){return ;}if ( FAILED(psp->QueryService(IID_IDataObject, IID_IDataObject, (void **) &pdo)) ){return ;}COleDataObject DataObject;DataObject.Attach(pdo);......}
HRESULT GetDropTarget( IDropTarget *pDropTarget, IDropTarget **ppDropTarget);
鍙傛暟璇存槑
pDropTarget
[in] Pointer to an IDropTarget interface for the current drop target object supplied by MSHTML.
ppDropTarget
[out] Address of a pointer variable that receives an IDropTarget interface pointer for the alternative drop target object supplied by the host.
鎯沖埌浜嗗悧錛熻В鍐抽棶棰樼殑鍏抽敭灝卞湪浜庣涓涓弬鏁皃DropTarget銆傜浉淇″緢澶氭祻瑙堝櫒鍦ㄥ鐞嗙殑鏃跺欓兘蹇界暐鎺変簡絎竴涓弬鏁拌屽彧鏄皢鑷繁鐨勫疄鐜伴氳繃絎簩涓弬鏁板憡鐭SHTML錛屽洜鑰屼涪澶變簡IE緙虹渷鐨勮涓恒傛棦鐒跺姝わ紝灝嗙己鐪佺殑IDropTarget鎺ュ彛鐨勬寚閽堜繚瀛樹笅鏉ワ紝鍦ㄩ傚綋鐨勬椂鍊欒皟鐢紝涓嶅氨鑳藉淇濈暀IE鐨勫師濮嬫嫋鏀捐涓轟簡鍚楋紵
//鏋勯犲嚱鏁幫紝浼犲叆鍙傛暟鍗蟲槸浠嶨etDropTarget寰楀埌鐨勯偅涓猵DropTarget錛屽畠鏄疢SHTML鐨勭己鐪佸疄鐜?/font>CBrowserDropTarget::CBrowserDropTarget(IDropTarget *pOrginalDropTarget): m_bDragTextToInputBox(FALSE)//榪欎釜甯冨皵鍙橀噺鐢ㄦ潵鍒ゆ柇鏄惁姝e湪鍚慖nputBox鎷栨嫿鏂囧瓧, m_pOrginalDropTarget(pOrginalDropTarget)//m_pOrginalDropTarget鐢ㄦ潵淇濆瓨MSHTML鐨勭己鐪佸疄鐜?/font>{}STDMETHODIMP CBrowserDropTarget::DragEnter(/* [unique][in] */IDataObject __RPC_FAR *pDataObj,/* [in] */ DWORD grfKeyState,/* [in] */ POINTL pt,/* [out][in] */ DWORD __RPC_FAR *pdwEffect){//璋冪敤緙虹渷鐨勮涓?/font>return m_pOrginalDropTarget->DragEnter(pDataObj, grfKeyState, pt, pdwEffect);}STDMETHODIMP CBrowserDropTarget::DragOver(/* [in] */ DWORD grfKeyState,/* [in] */ POINTL pt,/* [out][in] */ DWORD __RPC_FAR *pdwEffect){//鍦ㄧ綉欏靛唴鎷栨嫿鏂囧瓧鏃惰繖涓兼槸DROPEFFECT_COPY錛堟嫋鎷界殑鏂囧瓧涓嶅睘浜庤緭鍏ユ涓級//鎴朌ROPEFFECT_COPY | DROPEFFECT_MOVE錛堟嫋鎷界殑鏂囧瓧鏄緭鍏ユ涓殑鏂囧瓧錛?/font>DWORD dwTempEffect = *pdwEffect;//鎺ヤ笅鏉ヨ皟鐢↖E鐨勭己鐪佽涓?/font>HRESULT hr = m_pOrginalDropTarget->DragOver(grfKeyState, pt, pdwEffect);//鍒ゆ柇鏄惁鏄線杈撳叆妗嗘嫋鎷芥枃瀛?/font>m_bDragTextToInputBox = IsDragTextToInputBox(dwOldEffect, *pdwEffect);if ( !m_bDragTextToInputBox ){//涓嶆槸寰杈撳叆妗嗘嫋鎷芥枃瀛楋紝鍒欎嬌鐢ㄥ師濮嬬殑鎷栨嫿鏁堟灉銆傚惁鍒欏拰IE鐨勭己鐪佹晥鏋滀竴鏍封斺斾篃灝辨槸娌℃湁鏁堟灉*pdwEffect = dwTempEffect;}return S_OK;}//鏍規嵁璋冪敤緙虹渷琛屼負鍓嶅悗鐨凟ffect鍊煎垽鏂槸鍚︽槸寰杈撳叆妗嗘嫋鎷芥枃瀛?/font>BOOL CBrowserDropTarget::IsDragTextToInputBox(DWORD dwOldEffect, DWORD dwNewEffect){//濡傛灉鏄妸闈炶緭鍏ユ涓枃瀛楀線杈撳叆妗嗘嫋鍔紝鍒檇wOldEffect涓巇wNewEffect鐩哥瓑錛岄兘鏄疍ROPEFFECT_COPYBOOL bTextSelectionToInputBox = ( dwOldEffect == DROPEFFECT_COPY )&& ( dwOldEffect == dwNewEffect );//濡傛灉鏄妸鏂囧瓧浠庝竴涓緭鍏ユ鎷栧埌鍙︿竴涓緭鍏ユ錛屽垯dwOldEffect涓篋ROPEFFECT_COPY | DROPEFFECT_MOVE錛?/font>//鑰宒wNewEffect鐨勫煎彲鑳戒負DROPEFFECT_MOVE錛堥粯璁ゆ儏鍐碉級錛屼篃鍙兘涓篋ROPEFFECT_COPY錛堟寜涓婥trl閿椂錛?/font>BOOL bInputBoxToInputBox = ( dwOldEffect == (DROPEFFECT_COPY | DROPEFFECT_MOVE) )&& ( dwNewEffect == DROPEFFECT_MOVE || dwNewEffect == DROPEFFECT_COPY );//鏉ヨ嚜Microsoft Word鐨勬嫋鎷界壒孌婁竴浜涳紝dwOldEffect鏄墍鏈夋晥鏋滅殑緇勫悎鍊?/font>BOOL bMSWordToInputBox =( dwOldEffect == (DROPEFFECT_COPY | DROPEFFECT_MOVE | DROPEFFECT_LINK) )&& ( dwNewEffect == DROPEFFECT_MOVE || dwNewEffect == DROPEFFECT_COPY );//鏉ヨ嚜Edit Plus鐨勬嫋鎷借繃涔熺壒孌婁竴浜涳紝dwOldEffect鏄釜璐熸暟錛堟鐤戞槸Edit Plus鐨勬嫋鎷藉疄鐜版湁闂錛?/font>BOOL bEditPlusToInputBox = ( dwOldEffect < 0 )&& ( dwNewEffect == DROPEFFECT_MOVE || dwNewEffect == DROPEFFECT_COPY );//涔熻榪樻湁浜涗緥澶栵紝鍙啀娣誨姞......return bTextSelectionToInputBox || bInputBoxToInputBox || bMSWordToInputBox || bEditPlusToInputBox;}STDMETHODIMP CBrowserDropTarget::DragLeave(){//璋冪敤緙虹渷鐨勮涓?/font>return m_pOrginalDropTarget->DragLeave();}STDMETHODIMP CBrowserDropTarget::Drop(/* [unique][in] */ IDataObject __RPC_FAR *pDataObj,/* [in] */ DWORD grfKeyState,/* [in] */ POINTL pt,/* [out][in] */ DWORD __RPC_FAR *pdwEffect){if ( m_bDragTextToInputBox ){//鏄枃瀛楁嫋鏀撅紝璋冪敤IE鐨勭己鐪佽涓?/font>return m_pOrginalDropTarget->Drop(pDataObj, grfKeyState, pt, pdwEffect);}//鍚﹀垯鏄嫋鏀鵑摼鎺ャ佸浘鐗囥佹枃浠剁瓑錛屾寜甯歌鐨処DataObject澶勭悊鏂瑰紡......return S_OK;}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=677425
#include "HtmlObj.h"class CHtmlAnchorElement : public CHtmlObj<IHTMLAnchorElement,&DIID_HTMLAnchorEvents>{public:CHtmlAnchorElement(CHtmlDocument2* pParentDoc2);virtual ~CHtmlAnchorElement();virtual HRESULT OnInvoke(DISPID dispidMember,REFIID riid,LCID lcid, WORD wFlags,DISPPARAMS * pdispparams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo,UINT * puArgErr);};
HRESULT CHtmlAnchorElement::OnInvoke(DISPID dispidMember,REFIID riid, LCID lcid, WORD wFlags,DISPPARAMS * pdispparams, VARIANT * pvarResult,EXCEPINFO * pexcepinfo,UINT * puArgErr){HRESULT hr = E_NOTIMPL;switch(dispidMember){case DISPID_HTMLELEMENTEVENTS_ONMOUSEOVER :{//褰撻紶鏍囩粡榪囬摼鎺ユ椂錛屾垜浠湪榪欓噷鑾峰緱閫氱煡hr = S_OK;// TODO: add code to handle on mouse over eventsbreak;}case DISPID_HTMLELEMENTEVENTS_ONMOUSEOUT :{//褰撻紶鏍囦粠閾炬帴涓婄Щ寮鏃訛紝鎴戜滑鍦ㄨ繖閲岃幏寰楅氱煡錛屽叾瀹冪殑Dispatch ID鍙牴鎹渶瑕佹坊鍔?/font>hr = S_OK;// TODO: add code to handle on mouse out eventsbreak;}default:{break;}}return hr;}
template<class THtmlElement> class CHtmlElements{typedef CMap<LPDISPATCH, LPDISPATCH, THtmlElement*, THtmlElement*> CMapDispToHtmlElement;CMapDispToHtmlElement m_htmlElements;BOOL IsSiteConnected( LPDISPATCH pDisp ){THtmlElement *pElement;return m_htmlElements.Lookup( pDisp, pElement );}public :CHtmlElements( void ){}~CHtmlElements( void ){}public :void SetSite( LPDISPATCH pDisp ){if ( IsSiteConnected( pDisp ) ) //媯鏌ヤ互閬垮厤澶氫綑鐨凷ink{return ;}THtmlElement *pElement = new THtmlElement; //閫氳繃妯℃澘綾誨瀷鍒涘緩鐩稿簲鐨勭被鐨勫疄渚嬭繘琛岃繛鎺?/font>pElement->SetSite( pDisp );m_htmlElements.SetAt( pDisp, pElement );}//鍦ㄥ悎閫傜殑鍦版柟璋冪敤Clear閲婃斁鎵綆$悊鐨勫唴瀛?/font>
void Clear(void)
{
POSITION pos = m_htmlElements.GetStartPosition();
THtmlElement *pElement = NULL;
LPDISPATCH pDisp = NULL;
while (pos != NULL)
{
m_htmlElements.GetNextAssoc( pos, pDisp, pElement );
m_htmlElements.RemoveKey( pDisp );
delete pElement;
}
}
};
typedef CHtmlElements<CHtmlDocument2> CHtmlDocuments;typedef CHtmlElements<CHtmlAnchorElement> CHtmlAnchors;class CMyView : public CHtmlView{private :CHtmlDocuments m_htmlDocs;CHtmlAnchors m_htmlAnchors;}
void CMyView ::OnDocumentComplete(LPDISPATCH pDisp, LPCTSTR lpszURL){m_htmlDocs.SetSite(pDisp);}
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=621961
1銆佹榪?/font>
銆銆Internet Explorer寮哄ぇ鑰屾柟渚跨殑鍙紪紼嬭兘鍔涘拰鍙墿灞曡兘鍔涗負鍏舵姠鍗犳祻瑙堝櫒甯傚満鍙皳鏄珛涓嬩簡姹楅┈鍔熷姵銆傚彲緙栫▼涓昏浣撶幇涓ゆ柟闈細
銆銆鍙墿灞曡兘鍔涘垯浣撶幇鍦ㄥ嚑涓柟闈細



銆銆闅忕潃IE鐨勫彂灞曪紝鍚勭綾誨瀷鐨勬墿灞曢亶鍦板紑鑺憋紝鍏朵腑鏈涓哄紩浜烘敞鐩殑錛屽綋灞炲湴鍧鏍忔墿灞曞拰宸ュ叿鏉℃墿灞曪紙鍑犱箮鎴愪簡鍏靛蹇呬簤涔嬪湴錛夈傛湰鏂囪璁虹殑涓婚錛屾鏄伐鍏鋒潯鐨勬墿灞曘?/font>
2銆侀棶棰樼殑鎻愬嚭
銆銆涓や釜鍘熷洜淇冩垚浜咷oogle Toolbar鐨勬祦琛岋紝涓鏄箍鍛婄獥鍙g殑娉涙互銆佷簩鏄疓oogle Search銆侴oogle“綆鍗?#8221;錛堝疄鍒欎竴鐐歸兘涓嶇畝鍗曪紝娌℃湁鎼滅儲寮曟搸鐨勫己鍔涙敮鎸侊紝Toolbar鐨勭敤閫斿氨澶у彈闄愬埗錛夊湴鎶撲綇浜嗚繖涓ょ偣錛岃繀閫熷崰棰嗕簡甯傚満銆?/font>
銆銆鎻掍歡鐨勪竴澶уソ澶勫湪浜庡彲浠ヤ笉淇敼涓葷▼搴忥紝鍙渶鎹竴涓牱瀛愬樊涓嶅浣嗗姛鑳芥洿寮虹殑涓滆タ灝卞彲浠ヤ嬌寰楁暣涓簲鐢ㄧ▼搴忓姛鑳藉寮猴紝鎵浠E涓嶅崌綰уぇ瀹朵篃瑙夊緱Google Toobar瓚婃潵瓚婂ソ鐢ㄣ備簬鏄埄鐢╓ebBroser Control緙栧啓嫻忚鍣ㄧ殑寮鍙戜漢鍛樺氨鎯籌紝濡傛灉鑳藉儚IE涓鏍鋒敮鎸佷笂榪拌繖浜涙墿灞曪紝涓嶅氨鑳芥妸Google Toolbar鎷胯繃鏉ョ敤浜嗗悧錛熷叾浠栫殑浜嬩氦緇橤oogle鍘誨仛灝辮浜嗐傝繖灝辨槸鎴戜滑瑕佽璁虹殑闂錛?#8220;濡備綍鍦ㄨ嚜宸辯殑嫻忚鍣ㄤ腑宓屽叆Google Toolbar”銆?/font>
3銆佸垎鏋?/font>
銆銆寰蔣騫舵湭鍦∕SDN涓鏄庡浣曞皢Google Toolbar榪欑被IE鐨勫伐鍏鋒潯鎻掍歡宓屽叆鑷繁鐨勫簲鐢ㄧ▼搴忥紝浣嗗叾鍩轟簬COM鐨勮璁℃柟娉曞疄闄呬笂緇欎簣浜嗘垜浠繖涓兘鍔涳紙鍒涘緩宓屽叆寮忕殑宸ュ叿鏉$殑鏂規硶騫朵笉鏄湰鏂囩殑閲嶇偣錛屾澶勭暐鍘伙紝鏈夊叴瓚g殑鏈嬪弸鍙互鍙傝僊SDN錛夈傛垜浠煡閬擄紝闄や簡IUnknown鎺ュ彛澶栵紝Bands鍜孊ars錛堜互涓嬬畝縐癇and瀵硅薄錛夎繕闇瑕佸疄鐜頒笁涓帴鍙o細IObjectWithSite錛孖PersistStream鍜孖DeskBand銆傚綋鐢ㄦ埛閫夋嫨宸ュ叿鏉℃垨闈㈡澘鏃訛紝鍏跺鍣紙濡侷E鐨勫澹蟲鏋訛級灝變細璋冪敤Band瀵硅薄鐨処ObjectWithSite::SetSite鏂規硶錛堣鏂規硶浠呴渶瑕佷竴涓狪Unknown綾誨瀷鐨勬寚閽堬級錛屽皢鑷繁瀹炵幇鐨処Unknown鎸囬拡浼犻掔粰Band瀵硅薄銆傝繖灝辨槸鏁翠釜鎻掍歡寮濮嬬湡姝f縺媧葷殑鍏ュ彛錛屼篃鏄垜浠殑鐫鎵嬬偣銆?/font>
銆銆MSDN涓鍒幫紝涓鑸潵璇達紝Band瀵硅薄瀵逛簬SetSite鏂規硶鐨勫疄鐜伴渶瑕佸畬鎴愪互涓嬪嚑浠朵簨錛?/font>
銆銆鏄劇劧錛屽氨鎴戜滑瑕佽璁虹殑闂鑰岃█錛屽彧闇鎹釜瑙掑害錛堢紪鍐橧E澶栧3鐨勭殑瑙掑害錛夋潵鑰冭檻鍗沖彲銆傞鍏堬紝鎴戜滑闇瑕佷竴涓狪Unknown鎺ュ彛錛堝嵆Band瀵硅薄鎵闇鐨凷ite錛夛紝鍏舵闇瑕佷竴涓狪InputObjectSite鎺ュ彛錛岀敤浠ュ拰Band瀵硅薄鐨処InputObject鎺ュ彛浜や簰錛屽鐞嗚緭鍏ョ劍鐐硅漿縐葷殑鎯呭喌銆傛帴涓嬫潵灝卞彲浠ラ氳繃Band瀵硅薄鐨処DeskBand鎺ュ彛鏉ユ樉紺恒侀殣钘廈and瀵硅薄浜嗭紙娉ㄦ剰IDeskBand鎺ュ彛媧劇敓鑷狪DockingWindow鎺ュ彛,鍚庤呭張媧劇敓鑷狪OleWindow鎺ュ彛錛夈?/font>
4銆佸疄鐜?/font>
銆銆瀹炵幇鍒嗕負涓や釜閮ㄥ垎錛屽叾涓鏄竴涓畝鍗曠殑綾伙紝鐢ㄤ互妯℃嫙IE澶栧3錛屾垜鍙栧悕涓篊IESimulator銆傚叾浜屾槸涓涓鐞咺E鎵╁睍鐨勭被CIEBandPlugInManager錛岀敤浠ョ鐞咮and瀵硅薄鐨勬柟鏂歸潰闈€?/font>
class CIESimulator : public IInputObjectSite
{
private:
IWebBrowser2 *m_pwb; //淇濆瓨WebBrowser Control鐨勬帴鍙f寚閽?/font>
public:
CIESimulator(void){};
~CIESimulator(void){};
void SetIWebBrowser2(IWebBrowser2* pwb);
//IUnknown methods
STDMETHODIMP QueryInterface(REFIID, void **);
STDMETHODIMP_(ULONG) AddRef(void);
STDMETHODIMP_(ULONG) Release(void);
//IInputObjectSite specific methods
STDMETHOD(OnFocusChangeIS)(THIS_ IUnknown* punkObj, BOOL fSetFocus);
};
//IUnknown methods
STDMETHODIMP CIESimulator::QueryInterface( REFIID riid, void **ppv )
{
if ( riid == IID_IInputObjectSite ) //榪欎釜鎺ュ彛闇瑕佽嚜宸卞鐞?/font>
{
*ppv = static_cast<IInputObjectSite*>(this);
}
else if ( m_pwb ) //鍏跺畠鐨勪氦緇橶ebBrowser Control鍘誨鐞?/font>
{
m_pwb->QueryInterface( riid, ppv );
}
return S_OK;
}
//IInputObjectSite specific methods
STDMETHODIMP CIESimulator::OnFocusChangeIS(IUnknown* punkObj, BOOL fSetFocus)
{
return S_OK; //姝ゅ鎴戜滑綆鍗曞湴榪斿洖
}
void CIESimulator::SetIWebBrowser2(IWebBrowser2* pwb)
{
m_pwb = pwb;
}
銆銆娉ㄦ剰榪欓噷鎴戜滑騫舵病鏈夊疄鐜癐OleWindow鎺ュ彛鏉ュ悜Band瀵硅薄浼犻掔埗紿楀彛瀵硅薄錛堢獥鍙g殑瀹夸富鍙互鏇存敼錛屾墍浠and瀵硅薄鍒涘緩鐨勭獥鍙g殑鐖剁獥鍙f垜浠茍涓嶅叧蹇冿紝Band瀵硅薄鏌ヨIOleWindow鎺ュ彛鐨勫姩浣滃疄闄呬笂鏄悜WebBrowser Control鏌ヨ錛夛紝鑰屾槸鍦ㄧ◢鍚庣殑CIEBandPlugInManager綾諱腑閫氳繃璋冪敤IDeskBand鐨凣etWindow鏂規硶鑾峰緱Band瀵硅薄鐨勭獥鍙e彞鏌勶紝鍐嶆墜鍔ㄥ皢鍏跺祵鍏ユ垜浠寚瀹氱殑紿楀彛涓?/font>
銆銆棣栧厛鎴戜滑瀹氫箟涓涓粨鏋勭敤浠ヤ繚瀛楤and鐨勪俊鎭細
enum eBANDTYPE
{
btVertical = 0,
btHorizontal = 1
};
enum eBANDSTATE
{
bsUnInitialized = -1,
bsVisible = 0,
bsInVisible = 1,
bsUnLoaded = 2
};
typedef struct tagIEBANDINFO
{
char
szCLSID[39];
char
szName[MAX_PATH];
IUnknown
*puk;
HWND
hBand;
UINT
uMinHeight;
UINT
uBandID;
eBANDTYPE
eBandType;
eBANDSTATE
eBandState;
} IEBANDINFO, *LPIEBANDINFO;
銆銆鍐嶇敤涓涓嚱鏁版潵鑾峰彇鎵鏈塀and鐨勪俊鎭紙浠ヤ笅浠g爜涓虹ず渚嬶紝鍏蜂綋瀹炵幇鏄彲浠庢敞鍐岃〃鎶婃墍鏈塀and鐨勪俊鎭竴涓璇誨嚭錛?/font>
void CIEBandPlugInManager::GetAllBandCLSID(void)
{
LPIEBANDINFO pIEBandInfo;
pIEBandInfo = new IEBANDINFO();
strcpy( pIEBandInfo->szCLSID, "{2318C2B1-4965-11d4-9B18-009027A5CD4F}\0"); //Google Toolbar鐨凜LSID
strcpy( pIEBandInfo->szName, GetDisplayName(pIEBandInfo->szCLSID) );
pIEBandInfo->uMinHeight = 22;
pIEBandInfo->uBandID = m_BandCtrlID++;
pIEBandInfo->eBandType = btHorizontal;
pIEBandInfo->eBandState = bsUnInitialized;
m_oaBand.Add( (CObject*)pIEBandInfo );//m_oaBand鏄竴涓狢ObArray
锝?/font>
//鏍規嵁CLSID浠庢敞鍐岃〃鑾峰彇Band鐨勫悕縐?/font>
CString CIEBandPlugInManager::GetDisplayName(CString strCLSID)
{
TCHAR
sz[MAX_PATH];
HKEY
hKey;
DWORD
dwSize;
strCLSID = "CLSID\\" + strCLSID;
if(RegOpenKey(HKEY_CLASSES_ROOT, strCLSID, &hKey) != ERROR_SUCCESS)
{
return _T("");
}
RegQueryValueEx(hKey, NULL, NULL, NULL, (LPBYTE)sz, &dwSize);
RegCloseKey(hKey);
return sz;
}
//閫氳繃Band鐨凜LSID嬋媧籅and
bool CIEBandPlugInManager::ActivateBand( CString strCLSID )
{
LPIEBANDINFO pIEBandInfo = GetBandInfo( strCLSID ); //浠巑_oaBand涓壘鍒扮鍚堟潯浠剁殑Band鐨勪俊鎭?/font>
if ( !pIEBandInfo )
{
return false;
}
WCHAR wsz[MAX_PATH];
::MultiByteToWideChar(CP_ACP, 0, strCLSID, -1, wsz, MAX_PATH);
CLSID
clsid;
HRESULT hr2 = CLSIDFromString( wsz, &clsid);
if ( hr2 != NOERROR )
return false;
HRESULT hr = ::CoCreateInstance(clsid, NULL, LSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pIEBandInfo->puk); //鍒涘緩Band瀵硅薄鐨勫疄渚?/font>
IUnknown* puk = pIEBandInfo->puk;
if (FAILED(hr))
return false;
DoQueryBandInfo( pIEBandInfo ); //鏌ヨBand瀵硅薄瀹炰緥鐨勪俊鎭?/font>
switch( pIEBandInfo->eBandType )
{
case btVertical:
break;
//鎴戜滑涓嶅鐞哣ertical鐨勯潰鏉?/font>
case btHorizontal:
{
g_pMainFrame->m_wndReBar.AddBar2( pIEBandInfo->hBand, pIEBandInfo->uBandID, pIEBandInfo->uMinHeight, 0, 0); //灝咮and宓屽叆涓葷獥鍙g殑ReBar涓?/font>
REBARBANDINFO rbbi;
rbbi.cbSize = sizeof(rbbi);
rbbi.fMask = RBBIM_CHILDSIZE | RBBIM_IDEALSIZE | RBBIM_SIZE;
rbbi.cxMinChild = 0;
rbbi.cyMinChild = pIEBandInfo->uMinHeight;
rbbi.cx = rbbi.cxIdeal = 250;
UINT nCount = g_pMainFrame->m_wndReBar.GetReBarCtrl().GetBandCount();
g_pMainFrame->m_wndReBar.GetReBarCtrl().SetBandInfo(nCount-1, &rbbi);
break;
}
default:
break;
}
pIEBandInfo->eBandState = bsVisible;
return true;
}
//鏌ヨBand瀵硅薄瀹炰緥鐨勪俊鎭?/font>
void CIEBandPlugInManager::DoQueryBandInfo(LPIEBANDINFO pIEBandInfo)
{
IObjectWithSite *pOWS;
//鏌ヨIObjectWithSite鎺ュ彛
HRESULT hr = pIEBandInfo->puk->QueryInterface(IID_IObjectWithSite, (void**)&pOWS);
if (SUCCEEDED(hr))
{ //璁劇疆Site
pOWS->SetSite( (IUnknown *)&m_IESimulator ); //m_IESimulator鏄疌IESimulator鐨勪竴涓疄渚嬪璞★紝瀵笲and瀵硅薄鑰岃█錛屽畠灝卞儚IE
}
IDeskBand *pdb;
hr = pIEBandInfo->puk->QueryInterface(IID_IDeskBand, (void**)&pdb);
if (SUCCEEDED(hr))
{ //鏌ヨ寰楀埌Band瀵硅薄紿楀彛鐨勫彞鏌勶紝紼嶅欓氳繃璇ュ彞鏌勫皢Band瀵硅薄鐨勭獥鍙e祵鍏ユ垜浠寚瀹氱殑紿楀彛
pdb->GetWindow(&pIEBandInfo->hBand);
}
ShowBand(pIEBandInfo, TRUE);//鏄劇ずBand
}
bool CIEBandPlugInManager::ShowBand(LPIEBANDINFO pIEBandInfo, bool bShow)
{
IDockingWindow *pdw;
HRESULT hr = pIEBandInfo->puk->QueryInterface(IID_IDockingWindow, (void**)&pdw);
if (SUCCEEDED(hr))
{
pdw->ShowDW(bShow);
}
else
{
return false;
}
return true;
}
銆銆涓嬮潰鏄垜嫻嬭瘯鐨勪竴涓埅鍥撅紝Google鐨勬悳绱€佸箍鍛婄獥鍙f嫤鎴潎鍙甯稿伐浣溿?/font>

5銆佹葷粨
銆銆涓婅堪鐨勫師鐞嗙湅鏉ュ緢綆鍗曪紝浣嗗叿浣撳疄鐜扮殑鏃跺欎粛鐒墮渶瑕佷綔杈冨鐨勬祴璇曞拰鑰冭檻錛孊and瀵硅薄鐨勭鐞嗗拰緙撳瓨銆佹帴鍙g殑AddRef鍜孯elease絳夈傛椂闂存湁闄愶紝浠g爜涔熷緢涔憋紝涓嶈繃鍙鍘熺悊浜ゅ緟娓呮錛岀浉淇′細瀵規湁鍏磋叮鐨勬湅鍙嬫湁鎵甯姪銆?/font>
6銆佸弬鑰冭祫鏂?/font>
MSDN:銆?font face="Courier New">Creating Custom Explorer Bars, Tool Bands, and Desk Bands銆?/font>
寮曠敤鍦板潃錛氥?a >Internet Explorer緙栫▼綆榪幫紙涔濓級鍦ㄨ嚜宸辯殑嫻忚鍣ㄤ腑宓屽叆Google宸ュ叿鏉?/a>銆?/p>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=550698
1銆佹榪?/p>
Internet Explorer鐨勬祻瑙堝巻鍙茶彍鍗曞湪4.0鐗堟湰寮濮嬪嚭鐜幫紝浣嗙洿鍒?.5涔嬪墠錛屽井杞兘鏈叕甯冪敤浜庤闂祻瑙堝巻鍙茬殑COM鎺ュ彛錛屽浠婂凡鏄疘E6.0澶ц鍏墮亾鐨勫勾浠o紝鐢ㄤ簬璁塊棶嫻忚鍘嗗彶鐨勬帴鍙d篃鏃╁凡鍏竷澶氭椂錛屾湰鏂囩殑鐩殑鍒欐槸璇曞浘鎶涚爾寮曠帀錛岀畝鍗曚粙緇嶇敤浜庤闂祻瑙堝巻鍙茬殑Travel Log鎺ュ彛錛屽茍鐢ㄤ竴涓皬灝忕殑綾籆IETravelLog鏉ュ疄鐜板Travel Log鐨勫皝瑁呫?/p>
2銆両OmHistory鎺ュ彛
鍦ㄦ棭浜涙椂鍊欑殑MSDN涓紝鎴戜滑鑳藉鏌ラ槄鍒板叧浜庢祻瑙堝巻鍙茬殑鎺ュ彛浠呮湁IOmHistory錛岃岃鎺ュ彛瀹為檯涓婂搴旂殑鏄祻瑙堝櫒涓彲浠ラ氳繃鑴氭湰璁塊棶鐨?#8220;history”瀵硅薄銆傚浜?#8220;history”瀵硅薄錛孧SDN涓槸榪欐牱璇寸殑錛?/p>
For security reasons, the history object does not expose the actual URLs in the browser history. It does allow navigation through the browser history by exposing the back, forward, and go methods. A particular document in the browser history can be identified as an index relative to the current page. For example, specifying -1 as a parameter for the go method is the equivalent of clicking the Back button.
This object is available in script as of Microsoft Internet Explorer 3.0.
鍗充負浜嗗畨鍏ㄧ殑鍘熷洜錛孖OmHistory鎺ュ彛浠呮彁渚涗簡鏈夐檺鐨勫嚑涓柟娉曟潵瀹屾垚鍦ㄦ祻瑙堝櫒涓墠榪涖佸悗閫絳夋搷浣滐紝騫舵病鏈夋彁渚涜闂巻鍙插垪琛║rl鐨勮兘鍔涖傝繖涔熼毦鎬紝璇ユ帴鍙e湪IE 3.0鏃朵唬宸茬粡瀛樺湪錛岃屽綋鏃禝E騫朵笉鎴愮啛錛屽彲緙栫▼鑳藉姏涔熶笉鐢氬己澶с備竴鐩村埌IE 4.0閫氳繃涓嶹indows 98鎹嗙粦閿鍞竴緇熷ぉ涓嬩箣鍚庯紝鐩稿叧鐨勬枃妗f墠閫愭笎涓板瘜錛屽紿楀彛嫻忚鍣ㄧ瓑鍩轟簬Internet Explorer/WebBrowser Control鐨勫簲鐢ㄨ蔣浠朵篃鎵嶉摵澶╃洊鍦板紑鏉ャ備絾鍦↖E 5.5鎺ュ彛鍏竷涔嬪墠錛岃瀹屽叏妯℃嫙IE鐨凾ravel Log琛屼負錛屽茍涓嶆槸涓浠跺鏄撶殑浜嬨傛渶瀹規槗鎯沖埌鐨勬柟娉曞氨鏄湪BeforeNavigate銆丏ocumentComplete絳変簨浠跺彂鐢熶箣鏃惰褰?淇敼Url騫跺姞浠ヤ繚瀛橈紙鎴戝湪鏃╀簺鏃跺欎篃榪欐牱鍋氳繃錛夛紝浣嗘槸鏁堟灉涓嶇敋鐞嗘兂錛屽挨鍏舵槸嫻忚鍖呭惈Frame鐨勭綉欏墊椂錛屽鐞嗘洿鏄夯鐑︺傚綋鐒訛紝瑕佸畬鍏ㄦā鎷熶害闈為毦浜嬶紝鍙笉榪囧紑鍙戜漢鍛橀兘鐭ラ亾寰蔣鍏竷鎺ュ彛鏄棭鏅氱殑浜嬶紝鎵浠ヤ篃娌℃湁浜鴻姳澶у姏姘斿湪妯℃嫙IE鐨凾ravel Log琛屼負涓娿?/p>
3銆乀ravel Log綆浠?/p>
Internet Explorer 5.5鎺ㄥ嚭浠ュ悗錛孴ravel Log鎺ュ彛涔熷氨寮濮嬪嚭鐜板湪MSDN涓紝瀹冩槸涓撻棬涓篛LE宓屽叆WebBrowser Control鐨勫簲鐢ㄧ▼搴忚璁$殑錛屽叾鐩殑鏄?#8220;鎻愰珮鍜屽姞寮虹敤鎴風殑璁塊棶鏃ュ織浣撻獙”錛坕mprove and enhance the user's travel log experience錛夈備簨瀹炰笂錛岀◢鍚庢垜浼氭彁鍒幫紝Travel Log鎺ュ彛姝f棩鐩婃垚涓哄簲鐢ㄧ▼搴忎腑鐨勯噸瑕佹帴鍙d箣涓銆?/p>
寰蔣鍏竷鐨凾ravel Log鍏卞寘鍚笁涓帴鍙o細ITravelLogStg, IEnumTravelLogEntry鍜孖TravelLogEntry銆?/p>
鏂規硶鍚?nbsp; 鐢ㄩ?/p>
EnumEntries 涓鴻闂棩蹇楅」鍒涘緩鏋氫婦鍣紙IEnumTravelLogEntry鎺ュ彛鎸囬拡錛?/p>
GetRelativeEntry 榪斿洖涓涓棩蹇楅」
TravelTo 璁塊棶涓涓棩蹇楅」
鏂規硶鍚?nbsp; 鐢ㄩ?/p>
Next 鏋氫婦涓嬩竴涓棩蹇楅」錛堣繑鍥濱TravelLogEntry鎺ュ彛鎸囬拡錛?/p>
鏂規硶鍚?nbsp; 鐢ㄩ?/p>
GetTitle 榪斿洖鏃ュ織欏圭殑Title
GetURL 榪斿洖鏃ュ織欏圭殑Url
鎺ュ彛鍑嗗濂戒簡錛屾垜浠篃灝卞緢瀹規槗寰楃煡瀹冧滑涔嬮棿鐨勫叧緋伙細
涔熻涓嶆槸澶伆褰擄紝鎴戝UML涔熶笉鐔熸倝錛屽熺敤涓涓吉UML搴忓垪鍥捐〃紺哄叾鍏崇郴濡備笅錛?/p>

4銆佸皝瑁匱ravel Log
鎺ヤ笅鏉ワ紝鎴戜滑灝辯敤涓涓畝鍗曠殑綾繪潵瀹屾垚瀵筎ravel Log鐨勫皝瑁呫傚涓嬫墍紺猴紝tlogstg.h鍖呭惈浜員ravel Log鐨勭浉鍏蟲帴鍙e0鏄庯紝璇ュご鏂囦歡鍙互鍦≒latform SDK涓壘鍒般?/p>
#include "tlogstg.h"
class CIETravelLog
{
private:
ITravelLogStg *m_pTravelLogStg;
IEnumTravelLogEntry *m_pEnumLogEntry;
ITravelLogEntry *m_pTravalLogEntry;
IWebBrowser2* m_pWebBrowser;
public:
CIETravelLog(void);
~CIETravelLog(void);
void SetWebBrowser(IWebBrowser2* pWebBrowser);
void BuildHistoryMenu(CMenu * pMenu, unsigned char nCount, bool bForward);
void TravelTo(int nPosition);
};
CIETravelLog::CIETravelLog(void)
: m_pTravelLogStg(NULL), m_pEnumLogEntry(NULL), m_pTravalLogEntry(NULL), m_pWebBrowser(NULL)
{
}
CIETravelLog::~CIETravelLog(void)
{
if ( m_pTravelLogStg != NULL )
{
m_pTravelLogStg->Release();
}
if ( m_pEnumLogEntry != NULL )
{
m_pEnumLogEntry->Release();
}
if ( m_pTravalLogEntry != NULL )
{
m_pTravalLogEntry->Release();
}
if ( m_pWebBrowser != NULL )
{
m_pWebBrowser->Release();
}
}
//灝嗘祻瑙堝櫒鐨処WebBrowser2鎺ュ彛鎸囬拡璧嬩簣CIETravelLog鐨勫疄渚?/font>
void CIETravelLog::SetWebBrowser(IWebBrowser2* pWebBrowser)
{
if ( (m_pWebBrowser == pWebBrowser) || (m_pWebBrowser == NULL) )
{
return;
}
if ( m_pWebBrowser != NULL )
{
m_pWebBrowser->Release();
}
m_pWebBrowser = pWebBrowser;
IServiceProvider *pSP;
HRESULT hr = m_pWebBrowser->QueryInterface(IID_IServiceProvider, (LPVOID*)&pSP);
m_pWebBrowser->Release();
if (SUCCEEDED(hr))
{
hr = pSP->QueryService(SID_STravelLogCursor, IID_ITravelLogStg, (LPVOID*)&m_pTravelLogStg);
pSP->Release();
}
}
//鍒涘緩嫻忚鍘嗗彶鑿滃崟錛宐Forward鎸囨槑鏄墠榪涜繕鏄悗閫鑿滃崟
void CIETravelLog::BuildHistoryMenu(CMenu * pMenu, unsigned char nCount, bool bForward)
{
if ( m_pTravelLogStg == NULL )
{
return;
}
TLENUMF eFlag = bForward ? TLEF_RELATIVE_FORE : TLEF_RELATIVE_BACK;
if ( FAILED(m_pTravelLogStg->EnumEntries( eFlag, &m_pEnumLogEntry ) ) )
{
return;
}
ULONG uFetched;
int i=0;
if ( m_pEnumLogEntry !=NULL )
{
while ( SUCCEEDED( m_pEnumLogEntry->Next( 1, &m_pTravalLogEntry, &uFetched ) ) &&
m_pTravalLogEntry && i<10 )//鎴戜滑鏈澶氬彧闇瑕?0鏉″巻鍙茶彍鍗曪紝鍙牴鎹疄闄呮儏鍐典慨鏀?/font>
{
LPOLESTR pszTitle;
m_pTravalLogEntry->GetTitle( &pszTitle );
CString strTitle = pszTitle;
if ( bForward )
{
//ID_IEHISTORY_MIDDLE鏄瀹氫箟鐨勬煇涓彍鍗曢」ID錛屼粠璇D寮濮嬪墠鍚庡彲浠ュ垱寤?0涓彍鍗曢」錛屽弬瑙佷笅涓鑺?/font>
pMenu->InsertMenu( 0, MF_STRING, ID_IEHISTORY_MIDDLE + ++i, strTitle );
}
else
{
pMenu->InsertMenu( 0, MF_STRING, ID_IEHISTORY_MIDDLE - ++i, strTitle );
}
CoTaskMemFree( pszTitle );
m_pTravalLogEntry->Release();
}
}
}
//鏍規嵁涓庡綋鍓嶉〉闈㈢殑鐩稿璺濈鏉ヨ闂巻鍙茬綉欏?/font>
void CIETravelLog::TravelTo(int nPosition)
{
if ( m_pTravelLogStg == NULL )
{
return;
}
if SUCCEEDED(m_pTravelLogStg->GetRelativeEntry( nPosition, &m_pTravalLogEntry ))
{
m_pTravelLogStg->TravelTo( m_pTravalLogEntry );
}
}
5銆佷嬌鐢–IETravelLog
鍋囪鏄湪鎴戜滑鑷繁緙栧啓鐨勫紿楀彛嫻忚鍣ㄤ腑浣跨敤Travel Log銆備負綆鍗曡搗瑙侊紝鎴戜滑澹版槑涓涓狢IETravelLog鐨勫叏灞瀵硅薄g_IETravelLog錛屼互渚垮湪浠諱綍鍦版柟璋冪敤銆傜劧鍚庡湪閫傚綋鐨勫湴鏂癸紝濡侰MainFrame鐨凾BN_DROPDOWN娑堟伅錛堝伐鍏鋒潯鑿滃崟涓嬫媺娑堟伅錛夊鐞嗗嚱鏁癘nDropDown涓紝娣誨姞涓嬮潰鐨勪唬鐮侊紝鐢ㄤ互鍒涘緩嫻忚鍘嗗彶鑿滃崟錛?/p>
//GetActiveWebBrowserPtr榪斿洖媧誨姩鐨勬祻瑙堝櫒IWebBrowser2鎺ュ彛鎸囬拡
IETravelLog.SetWebBrowser( GetActiveWebBrowserPtr );
//bForward涓簍rue鍒欏垱寤?#8220;鍓嶈繘”鑿滃崟錛屽惁鍒欏垱寤?#8220;鍚庨”鑿滃崟
IETravelLog.BuildHistoryMenu( &Menu, 10, bForward);
浠ヤ笅瀹氫箟涓鴻彍鍗曢」ID鐨勮寖鍥達紝鍓嶅悗鍏卞彲浠ュ綰?0涓彍鍗曢」錛屽彲鏍規嵁瀹為檯鎯呭喌淇敼銆?/p>
#define ID_IEHISTORY_FIRST 60200
#define ID_IEHISTORY_MIDDLE 60210
#define ID_IEHISTORY_LAST 60220
娣誨姞鍛戒護澶勭悊鍑芥暟OnTravelHistoryUrl鐢ㄤ互鍝嶅簲浠嶪D_IEHISTORY_FIRST鍒癐D_IEHISTORY_LAST鐨勮彍鍗曞懡浠ゃ?/p>
ON_COMMAND_RANGE(ID_IEHISTORY_FIRST, ID_IEHISTORY_LAST, OnTravelHistoryUrl)
void CMainFrame::OnTravelHistoryUrl(UINT nID /* Command ID */)
{
//nID - ID_IEHISTORY_MIDDLE鍗充負瑕佽闂殑嫻忚鍘嗗彶鍒板綋鍓嶉〉闈㈢殑璺濈
g_IETravelLog.TravelTo( nID - ID_IEHISTORY_MIDDLE );
}
6銆佸啀璋圱ravel Log
鍓嶉潰鎴戞彁鍒?#8220;Travel Log鎺ュ彛姝f棩鐩婃垚涓哄簲鐢ㄧ▼搴忎腑鐨勯噸瑕佹帴鍙d箣涓”錛屾澶勫姞浠ヨ鏄庛備粠寰蔣騫沖彴鐨勫紑鍙戞ā寮忓強瀵煎悜鏉ョ湅錛屽熀浜嶪nternet Explorer/WebBrowser Control鐨勫簲鐢ㄥ娍蹇呬細鎴愪負涓繪祦銆傚湪涓嬩竴浠g殑鎿嶄綔緋葷粺Longhorn涓紝搴旂敤紼嬪簭鐣岄潰鐨勬弿榪板皢瀹屽叏鐢盭ML鐨勪竴涓壒鍖栤斺擷AML鏉ュ畬鎴愶紝鑰孹AML鐨勮В鏋愬皢鐢辨祻瑙堝櫒瀹屾垚銆傚井杞鏈潵搴旂敤紼嬪簭鐨勯儴緗插皢浼氬崄鍒嗗鏄擄紝鏈湴搴旂敤鍜屽熀浜庢祻瑙堝櫒鐨勫簲鐢ㄤ箣闂寸殑宸紓灝嗕細琚愭笎娣″寲錛岃屽疄鐜拌繖涓鐩爣鐨勪竴涓噸瑕佽〃鐜板氨鏄紝鍦ㄥ皢鏉ョ殑鎿嶄綔緋葷粺騫沖彴涓婏紝搴旂敤紼嬪簭瀹為檯涓婃椂鍒婚兘灝嗚繍琛屽湪Internet Explorer涓紝Internet Explorer鍦ㄦ煇縐嶇▼搴︿笂鏉ヨ鍙樻垚浜嗕竴涓鍣ㄣ?/p>
浜庢槸錛屾墡鏍逛簬Internet Explorer鐨凾ravel Log鑷劧鑰岀劧鍦板氨琚暣鍚堝埌浜嗘垜浠殑搴旂敤紼嬪簭涓傚悰涓嶈錛屾垜浠瘡澶╁湪璧勬簮綆$悊鍣ㄥ拰嫻忚鍣ㄤ笂瀹屾垚鐨勫伐浣滐紝涓嶅氨鏄湪Travel Log涓潵鏉ュ洖鍥炲湴璺戝悧錛熷鏋滄墍鏈夌殑搴旂敤紼嬪簭閮藉祵鍏ュ埌Internet Explorer涓繍琛岋紝閭d箞鎴戜滑鍦ㄥ簲鐢ㄧ▼搴忎腑鎵浣滅殑鎿嶄綔渚胯嚜鐒跺緱鍒頒簡璁板綍錛?#8220;鍓嶈繘”鍜?#8220;鍚庨”涔熷氨寰圗asy浜嗐?/p>
寰堝杞歡閮藉凡緇忔垨澶氭垨灝戝湴寮濮嬮噰鐢ㄥ熀浜嶪nternet Explorer鐨勬ā寮忥紝濡侻icrosoft Money銆丮icrosoft Encarta銆乂isual Studio.net鐨勫畨瑁呯▼搴忕瓑絳夛紝閮芥槸寰堝ソ鐨勮寖渚嬨傛墍浠ワ紝灝辯洰鍓嶆潵璇達紝灝嗘垜浠殑搴旂敤紼嬪簭鎸夎繖縐嶆ā寮忕紪鍐欙紙鍙弬鑰冦?a >鍒╃敤嫻忚鍣ㄥ疄鐜扮▼搴忕晫闈笌瀹炵幇鐨勫垎紱?/a>銆嬶級錛屼笉鏄彲浠ユ棭涓鐐硅幏寰?#8220;璁塊棶鏃ュ織鐨勪綋楠?#8221;鍚楋紵
浣曚箰鑰屼笉涓恒?/p>
寮曠敤鍦板潃錛氥?a >Internet Explorer 緙栫▼綆榪幫紙鍏級瀹炵幇嫻忚鍘嗗彶鑿滃崟銆?/font>
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=308620
Internet Explorer鏈夊疄鍦ㄥお澶氭病鏈夊叕甯冪殑涓滆タ銆備笂涓綃囨枃绔犮奍nternet Explorer 緙栫▼綆榪幫紙鍏級鑷畾涔夋祻瑙堝櫒涓婁笅鏂囪彍鍗曘嬫彁鍒扮殑鑾峰彇“緙栫爜”鑿滃崟鐨勬柟娉曞氨鏄埄鐢ㄤ簡嫻忚鍣ㄧ殑涓婂眰紿楀彛“Shell DocObject View”鐨勬湭鍏竷鐨勫懡浠D銆傛湰鏂囧皢瑕佷粙緇嶇殑鏄浣曠敤榪欎釜ID鎶?#8220;緙栫爜”鑿滃崟鏀懼埌鎴戜滑鑷繁鐨勮彍鍗曚腑鏉ワ紙濡傚伐鍏鋒潯涓婄殑“緙栫爜”鎸夐挳鐨勪笅鎷夎彍鍗曪級銆?/p>
#define SHDVID_GETMIMECSETMENU 27
......
CComPtr
hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
......
// Get the language submenu
hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);
2銆佸師鐞?/strong>
涓婇潰鎸囧悜IOleCommandTarget鎺ュ彛鐨勬櫤鑳芥寚閽坰pCT鏄粠IDocHostUIHandler::ShowContextMenu鐨勫弬鏁皃cmdTarget寰楀埌鐨勶紝瀹冨叾瀹炰篃鍙互浠嶩TML鏂囨。鎺ュ彛寰楀埌錛岃繖灝辨槸瀹炵幇鐨勫叧閿?/p>
3銆佸疄鐜?/strong>
涓嬮潰鐨勪唬鐮佹紨紺轟簡濡備綍灝?#8220;緙栫爜”鑿滃崟鏀劇疆鍒版垜浠嚜宸辯殑緙栫爜鑿滃崟涓婂幓銆?/p>
void CMainFrame::OnDropDown( NMHDR* pNotifyStruct, LRESULT* pResult )
{
銆const UINT CmdID_GetMimeSubMenu = 27;
銆// Command ID for getting the Encoding submenu
銆NMTOOLBAR* pNMToolBar = ( NMTOOLBAR* )pNotifyStruct;
銆CMenu menu;
銆CMenu* pPopup = 0;
銆CMyHtmlView *pView = NULL;
銆m_bIsEncodMenuPopup = false;//鏍囧織鍙橀噺錛岀敤浠ュ湪WM_INITMENUPOPUP娑堟伅澶勭悊鍑芥暟涓鏌?#8220;緙栫爜”鑿滃崟
銆switch ( pNMToolBar->iItem )
銆{
銆......
銆case ID_VIEW_ENCODE://鎸変笅“緙栫爜”鎸夐挳
銆{
銆銆m_bIsEncodMenuPopup = true;
銆銆VERIFY( menu.LoadMenu( IDR_ENCODE ) );//IDR_ENCODE鏄緗殑“緙栫爜”鑿滃崟璧勬簮錛屽唴鍚換鎰忎竴欏瑰崰浣嶇敤鐨勮彍鍗?/font>
銆銆CMyHtmlView = GetActiveMyHtmlView();//媯鏌ュ綋鍓嶆槸鍚﹀瓨鍦ㄦ椿鍔ㄧ殑嫻忚鍣ㄨ鍥劇獥鍙?/font>
銆銆if ( pView != NULL )
銆銆{
銆銆銆LPDISPATCH lpDispatch =pView->GetHtmlDocument();//鑾峰緱鏂囨。鎸囬拡
銆銆銆if ( lpDispatch != NULL )
銆銆銆{
銆銆銆銆// Get an IDispatch pointer for the IOleCommandTarget interface.
銆銆銆銆IOleCommandTarget * pCmdTarget = NULL;
銆銆銆銆HRESULT hr = lpDispatch->QueryInterface(IID_IOleCommandTarget, (void**)&pCmdTarget);
銆銆銆銆if ( SUCCEEDED( hr ) )
銆銆銆銆{
銆銆銆銆銆VARIANT varEncSubMenu;
銆銆銆銆銆::VariantInit( &varEncSubMenu );
銆銆銆銆銆hr = pCmdTarget->Exec( &::CGID_ShellDocView, CmdID_GetMimeSubMenu, OLECMDEXECOPT_DODEFAULT, NULL, &varEncSubMenu );
銆銆銆銆銆if ( SUCCEEDED( hr ) )
銆銆銆銆銆{
銆銆銆銆銆銆// 娣誨姞“緙栫爜”鑿滃崟
銆銆銆銆銆銆MENUITEMINFO miiEncoding;
銆銆銆銆銆銆::memset( &miiEncoding, 0, sizeof(MENUITEMINFO) );
銆銆銆銆銆銆miiEncoding.cbSize = sizeof(MENUITEMINFO);
銆銆銆銆銆銆miiEncoding.fMask = MIIM_SUBMENU;
銆銆銆銆銆銆miiEncoding.hSubMenu = reinterpret_cast< HMENU > (varEncSubMenu.byref);
銆銆銆銆銆銆menu.SetMenuItemInfo(0, &miiEncoding, TRUE);//涓㈡帀璁捐鏃跺崰浣嶇敤鐨勮彍鍗曪紝鏇挎崲涓?#8220;緙栫爜”鑿滃崟
銆銆銆銆銆 }
銆銆銆銆}
銆銆銆}
銆銆}
銆銆pPopup = menu.GetSubMenu( 0 );
銆銆break;
銆}
銆......
銆}
銆
銆if ( pPopup != 0 )
銆{
銆銆CRect rc;
銆銆::SendMessage( pNMToolBar->hdr.hwndFrom, TB_GETRECT, pNMToolBar->iItem, ( LPARAM )&rc );
銆銆rc.top = rc.bottom;
銆銆::ClientToScreen( pNMToolBar->hdr.hwndFrom, &rc.TopLeft() );
銆銆long lResult = pPopup->TrackPopupMenu( TPM_LEFTALIGN | TPM_LEFTBUTTON | TPM_RETURNCMD, rc.left, rc.top, this );
銆銆m_bIsEncodMenuPopup = false;
銆銆if ( pNMToolBar->iItem == ID_VIEW_ENCODE )
銆銆{
銆銆銆//鍏朵綑鐨勪簨鏁欑粰嫻忚鍣ㄥ幓鍋氾紝鍙傝冦?a id="CategoryEntryList.ascx_EntryStoryList_Entries__ctl1_TitleUrl" >Internet Explorer 緙栫▼綆榪幫紙浜旓級璋冪敤IE闅愯棌鐨勫懡浠わ紙涓枃鐗堬級銆?/font>
銆銆銆 CFindIEWnd FindIEWnd( pView->m_wndBrowser.m_hWnd, "Internet Explorer_Server");
銆銆銆::SendMessage( FindIEWnd.m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(lResult), 0x0), 0 );
銆銆}
銆銆else
銆銆{
銆銆銆SendMessage( WM_COMMAND, MAKEWPARAM(LOWORD(lResult), 0x0), 0 );
銆銆}
銆}
銆*pResult = TBDDRET_DEFAULT;
}
void CMainFrame::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
銆CMDIFrameWndEx::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
銆if ( m_bIsEncodMenuPopup )
銆{
銆銆//榛樿鎯呭喌涓?#8220;緙栫爜”鐨勬墍鏈夎彍鍗曢」閮芥槸Disabled鐨勶紝鍦ㄦ淇敼鍏剁姸鎬佷負Enabled
銆銆for ( UINT i=0; i
銆銆{
銆銆銆pPopupMenu->EnableMenuItem( pPopupMenu->GetMenuItemID( i ), MF_ENABLED | MF_BYCOMMAND );
銆銆}
銆}
}
榪欐牱涓鏉ワ紝鍘熸湰鍙湪嫻忚鍣ㄤ笂涓嬫枃鑿滃崟涓嚭鐜扮殑“緙栫爜”鑿滃崟灝卞嚭鐜板湪浜嗘垜浠嚜宸辯殑宸ュ叿鏉℃寜閽笅鎷夎彍鍗曚笂錛屾棤闇鏇村鐨勫鐞嗭紝鑿滃崟鐘舵佺殑鏀瑰彉錛岀紪鐮佺殑璁劇疆絳夛紝涓鍒囬兘鏁欑粰嫻忚鍣ㄨ嚜宸卞幓瀹屾垚浜嗐?/p>
1銆佹榪?br> Internet Explorer鎻愪緵浜嗛潪甯稿紑鍙戠殑鎺ュ彛錛屼嬌寮鍙戜漢鍛樹笉浠呭彲浠ユ妸鍏舵祻瑙堝櫒鏍稿績宓屽叆搴旂敤紼嬪簭錛岃繕鍙互閫氳繃鍚勭鎺ュ彛浠ュ疄鐜版洿娣卞眰鐨勬帶鍒躲傛湰鏂囧氨灝嗕粙緇嶅嫻忚鍣ㄨ繘琛岄珮綰ф帶鍒剁殑璇濋涔嬩竴鈥斺旇嚜瀹氫箟涓婁笅鏂囪彍鍗曘?/p>
2銆佹渶綆鍗曠殑鎯呭喌
鑷畾涔夌殑IE鍙奧ebBrowser鐨勪笂涓嬫枃鑿滃崟錛屾渶綆鍗曠殑鏂瑰紡灝辨槸鍦ㄦ敞鍐岃〃鐨凥KEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt涓嬫坊鍔犺嚜瀹氫箟鐨勯敭鍊鹼紝姝ラ濡備笅錛?br> 1) 娣誨姞涓涓柊鐨勯敭錛屽叾鍚嶇О鍗充負灝嗘潵鏄劇ず鍦ㄤ笂涓嬫枃鑿滃崟涓殑鑿滃崟欏瑰悕縐幫紝濡傦細
銆HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\MenuExt\&Google Search
2) 灝嗘柊澧炵殑閿殑榛樿鍊艱緗負涓涓寘鍚剼鏈殑緗戦〉鐨刄RL錛堟垨鏂囦歡璺緞鍏ㄥ悕錛夛紝璇ョ綉欏典腑鐨勮剼鏈皢鍦ㄧ敤鎴風偣鍑諱笂涓嬫枃鑿滃崟涓殑“Google Search”鍚庤嫻忚鍣ㄦ墽琛屻?/p>

3)鍦ㄦ柊澧炵殑閿笅榪樺彲浠ユ柊寤轟竴涓簩榪涘埗鍊糃ontexts錛岀敤浠ユ寚瀹氭垜浠柊澧炵殑鑿滃崟欏歸拡瀵圭壒瀹氱殑緗戦〉瀵硅薄鏄惁鍑虹幇錛屽叾鍙栧煎彲浠ユ槸濡備笅鍊肩殑緇勫悎錛堥昏緫鎴栵級
Context銆銆銆銆 Value
Default銆銆銆銆 0x1
Images銆銆銆銆銆0x2
Controls銆銆銆銆0x4
Tables銆銆銆銆銆0x8
Text selection銆0x10
Anchor銆銆銆銆銆0x20
4) 榪樺彲浠ュ緩绔嬩竴涓狣WORD綾誨瀷鐨凢lags欏瑰茍灝嗗叾鍊艱緗負0x01錛岃繖灝嗕嬌寰楀墠榪拌剼鏈湪涓涓ā鎬佺獥鍙d腑鎵ц錛屽氨濂藉儚鏄氳繃window.showModalDialog璋冪敤鐨勶紝浣嗕笉鍚岀殑鏄湪鑴氭湰涓粛鐒跺彲浠ヨ闂畐indow瀵硅薄銆?br> 5) 瀹炰緥鑴氭湰濡備笅錛?/p>
閫氳繃淇敼娉ㄥ唽琛ㄨ嚜瀹氫箟鑿滃崟鐨勬柟娉曢傜敤浜嶪nternet Explorer鍜學ebBrowser錛屼篃鍏鋒湁鑹ソ鐨勬墿灞曟с備絾鎴戜滑濡傛灉甯屾湜鎵ц鐨勬槸涓嶄粎浠呮槸鑴氭湰錛屼簩鏄嚜宸辯殑紼嬪簭涓唬鐮侊紝榪欑鏂規硶灝變笉閫傜敤浜嗐?/p>
3銆佷嬌鐢ㄥ畬鍏ㄨ嚜瀹氫箟鐨勮彍鍗?br>1) IDocHostUIhandler鎺ュ彛鎻愪緵浜嗕竴涓猄howContextMenu鏂規硶錛屽湪闇瑕佹樉紺轟笂涓嬫枃鑿滃崟涔嬪墠錛孧SHTML寮曟搸灝變細璋冪敤瀹炵幇浜咺DocHostUIHandler鎺ュ彛鐨?br>瀹夸富紼嬪簭鐨凷howContextMenu鏂規硶銆?/p>
HRESULTIDocHostUIHandler::ShowContextMenu(
銆銆DWORD dwID,
銆銆POINT *ppt,
銆銆IUnknown *pcmdtReserved,
銆銆IDispatch *pdispReserved
);
dwID鍙傛暟鐨勬剰涔変笌Contexts鐨勭粍鍚堢被浼鹼紱ppt涓鴻彍鍗曠殑寮瑰嚭鐐瑰睆騫曞潗鏍囷紱pcmdtReserved鎺ュ彛鎸囧悜 IOleCommandTarget鎺ュ彛錛屽彲鐢ㄤ簬媯嫻嬬綉欏靛璞$殑鐘舵佸拰鎵ц鍛戒護絳夋搷浣溿俻dispReserved鍦↖E5浠ヤ笂鐗堟湰涓寚鍚戠殑鏄綉欏靛璞$殑 IDispatch鎺ュ彛錛岀敤浠ュ尯鍒嗕笉鍚屽璞★紝姣斿鎴戜滑鍙互榪欐牱鏉ヨ幏寰楃綉欏靛璞$殑鎸囬拡錛?/p>
IHTMLElement *pElem;
HRESULT hr;
hr = pdispReserved->QueryInterface(IID_IHTMLElement, (void**)pElem);
if(SUCCEEDED (hr)) {
銆銆BSTR bstr;
銆銆pElem->get_tagName(bstr);
銆銆USES_CONVERSION;
銆銆ATLTRACE("TagName:%s\n", OLE2T(bstr));
銆銆SysFreeString(bstr);
銆銆pElem->Release();
}
濡傛灉鎴戜滑鍦ㄨ鏂規硶涓繑鍥濻_OK錛屽垯鍛婅瘔MSHTML鎴戜滑灝嗕嬌鐢ㄨ嚜宸辯殑鑿滃崟錛堢晫闈級錛屽鏋滄槸S_FALSE錛屽垯寮瑰嚭榛樿鐨勮彍鍗曘?/p>
2) 瀹炵幇
鍘熺悊娓呮涔嬪悗錛屽疄鐜拌搗鏉ラ潪甯哥畝鍗曪紝鍜屽脊鍑轟竴鑸殑鑿滃崟娌′粈涔堜袱鏍鳳紝涓句緥濡備笅錛屾樉紺轟富妗嗘灦鐨?#8220;鏂囦歡鑿滃崟”錛?/p>
HRESULT CMyHtmlView::OnShowContextMenu(DWORD dwID, LPPOINT ppt, IUnknown * pcmdtReserved, IDispatch *)
{
銆// 杞藉叆涓昏彍鍗?br>銆HMENU hMenuParent = ::LoadMenu( ::AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME) );
銆if (hMenuParent)
銆{
銆銆HMENU hMenu = ::GetSubMenu( hMenuParent, 0 ); // 鍙栧緱“鏂囦歡”瀛愯彍鍗?br>銆銆if (hMenu)
銆銆{
銆銆 // 鏄劇ず鑿滃崟
銆銆銆TrackPopupMenuEx( hMenu,
銆銆銆銆TPM_LEFTALIGN | TPM_TOPALIGN,
銆銆銆銆ppt->x,
銆銆銆銆ppt->y,
銆銆銆銆::AfxGetMainWnd()->m_hWnd,
銆銆銆銆NULL );
銆銆}
銆銆::DestroyMenu( hMenuParent );
銆}
銆return S_OK;
}
4銆佽嚜瀹氫箟鏍囧噯涓婁笅鏂囪彍鍗?br>1) 鍘熺悊
鏇村鐨勬椂鍊欐垜浠笇鏈涜兘鍦ㄦ祻瑙堝櫒鍘熸潵鑿滃崟鐨勫熀紜涓婁綔涓浜涗慨鏀癸紝濡傚垹鎺?#8220;鏌ョ湅婧愭枃浠?#8221;錛屾坊鍔犺嚜宸辯殑鑿滃崟欏癸紝絳夌瓑錛岃屼笉鏄畬鍏ㄤ笉瑕佸師濮嬬殑鑿滃崟錛屾庝箞鍔炲憿錛熷熷姪MSDN鎻愪緵鐨勪緥瀛愶紝鎴戜滑鏉ョ湅鐪嬶細
HRESULT CBrowserHost::ShowContextMenu(DWORD dwID, POINT *ppt,IUnknown *pcmdTarget,IDispatch *pdispObject)
{
銆#define IDR_BROWSE_CONTEXT_MENU 24641
銆#define IDR_FORM_CONTEXT_MENU 24640
銆#define SHDVID_GETMIMECSETMENU 27
銆#define SHDVID_ADDMENUEXTENSIONS 53
銆HRESULT hr;
銆HINSTANCE hinstSHDOCLC;
銆HWND hwnd;
銆HMENU hMenu;
銆CComPtr
銆CComPtr
銆MENUITEMINFO mii = {0};
銆CComVariant var, var1, var2;
銆hr = pcmdTarget->QueryInterface(IID_IOleCommandTarget, (void**)&spCT);
銆hr = pcmdTarget->QueryInterface(IID_IOleWindow, (void**)&spWnd);
銆hr = spWnd->GetWindow(&hwnd);//鍙栧緱嫻忚鍣ㄧ獥鍙e彞鏌?br>銆hinstSHDOCLC = LoadLibrary(TEXT("SHDOCLC.DLL"));
銆if (hinstSHDOCLC == NULL)
銆{
銆銆// Error loading module -- fail as securely as possible
銆銆return;
銆}
銆hMenu = LoadMenu(hinstSHDOCLC, MAKEINTRESOURCE(IDR_BROWSE_CONTEXT_MENU));
銆hMenu = GetSubMenu(hMenu, dwID);
銆// Get the language submenu
銆hr = spCT->Exec(&CGID_ShellDocView, SHDVID_GETMIMECSETMENU, 0, NULL, &var);
銆mii.cbSize = sizeof(mii);
銆mii.fMask = MIIM_SUBMENU;
銆mii.hSubMenu = (HMENU) var.byref;
銆// Add language submenu to Encoding context item
銆SetMenuItemInfo(hMenu, IDM_LANGUAGE, FALSE, &mii);
銆// Insert Shortcut Menu Extensions from registry
銆V_VT(&var1) = VT_INT_PTR;
銆V_BYREF(&var1) = hMenu;
銆V_VT(&var2) = VT_I4;
銆V_I4(&var2) = dwID;
銆hr = spCT->Exec(&CGID_ShellDocView, SHDVID_ADDMENUEXTENSIONS, 0, &var1, &var2);
銆// Remove View Source
銆DeleteMenu(hMenu, IDM_VIEWSOURCE, MF_BYCOMMAND);//鍒犻櫎“鏌ョ湅婧愭枃浠?#8221;鑿滃崟欏?br>銆// Show shortcut menu
銆int iSelection = ::TrackPopupMenu(hMenu,
銆銆TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD ,//榪斿洖鐢ㄦ埛閫夋嫨鐨勮彍鍗曞懡浠D
銆銆ppt->x,
銆銆ppt->y,
銆銆0,
銆銆hwnd,
銆銆(RECT*)NULL);
銆// Send selected shortcut menu item command to shell
銆LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);//鍙戦佸埌Internet Explorer_Server榪涜鍐呴儴澶勭悊銆?br>銆FreeLibrary(hinstSHDOCLC);
銆return S_OK;
}
浠? 涓婇潰鐨勪緥瀛愭垜浠湅鍑猴紝鍩烘湰鐨勬柟娉曞氨鏄牴鎹?#8220;shdoclc.dll”鏂囦歡涓殑鑿滃崟璧勬簮寤虹珛鑿滃崟錛屽啀閫氳繃鏉ヨ嚜pcmdTarget鐨? IOlcCommandTarget鎺ュ彛鑾峰緱“緙栫爜”鑿滃崟浠ュ強HKEY_CURRENT_USER\Software\Microsoft\ Internet Explorer\MenuExt涓嬬殑瀹氫箟鎵╁睍鑿滃崟錛岀劧鍚庝互TPM_RETURNCMD鏍囧織璋冪敤TrackPopupMenu鎴? TrackPopupMenuEx寮瑰嚭鑿滃崟錛屽茍灝嗚繑鍥炵殑鑿滃崟鍛戒護ID鏁欑粰嫻忚鍣ㄧ獥鍙h繘琛屽鐞嗐傝繖縐嶆柟娉曞彲浠ヨ皟鐢ㄨ澶氶氳繃嫻忚鍣ㄦ棤娉曠洿鎺ヨ皟鐢ㄧ殑鍛戒護鍜屽璇濇 錛堝弬闃咃細銆?a >Internet Explorer 緙栫▼綆榪幫紙浜旓級璋冪敤IE闅愯棌鐨勫懡浠?/font>銆嬶級銆?/font>
鎵浠ワ紝鎴戜滑鍙渶瑕佸湪寮瑰嚭鑿滃崟涔嬪墠鍋氫竴浜涜嚜瀹氫箟鎿嶄綔鍗沖彲杈懼埌淇敼榛樿鑿滃崟鐨勭洰鐨勶紝濡備笂闈唬鐮佷腑灝辯敤鍒犻櫎浜?#8220;鏌ョ湅婧愭枃浠?#8221;鑿滃崟欏廣?/font>
2) 闂
濡傛灉鎴戜滑涓嶄粎浠呮槸鍒犻櫎榛樿鐨勮彍鍗曢」鎴栨槸淇敼浜嗛粯璁ょ殑鑿滃崟欏癸紝榪樻坊鍔犱簡鑷繁鐨勮彍鍗曢」錛屼細鍑虹幇浠涔堟儏鍐靛憿錛熺敱浜庝嬌鐢ㄤ簡綾諱技浜嶮FC涓璘pdateUI鐨勬満鍒訛紝閬囧埌涓嶈璇嗙殑CommandID錛屾祻瑙堝櫒灝變細灝嗗叾鐘舵佽緗負Disabled錛屾墍浠ユ垜浠嚜宸辨坊鍔犵殑鑿滃崟鏄棤娉曡閫夋嫨鐨勩?br>鍙?
浠ユ兂鍒幫紝濡傛灉鎶婅彍鍗曠姸鎬佽緗負Enabled錛屽茍閫氳繃TPM_RETURNCMD鏍囧織璋冪敤TrackPopupMenu鎴?
TrackPopupMenuEx錛屽啀鎶婅繑鍥炵殑鍛戒護ID鏁欑粰鍚堥傜殑紿楀彛錛堝涓繪鏋剁獥鍙o級鍘誨鐞嗕笉灝辮浜嗐傚叧閿偣灝卞湪浜庡浣曟妸鑿滃崟鐘舵佽緗負
Enabled銆?/font>
3) 瀹炵幇
瑙e喅鐨勫姙娉曟槸鎴幏 WM_INITMENUPOPUP 娑堟伅錛屽湪鑿滃崟鍒涘緩浠ュ悗錛屽皻鏈樉紺轟箣鍓嶄慨鏀硅彍鍗曢」鐘舵侊紝閭f祻瑙堝櫒灝辨病鏈夊姙娉曚簡銆傛埅鑾稺M_INITMENUPOPUP娑堟伅鍒欏彲浣跨敤瀛愮被鍖栵紙subclass錛夌殑鎶鏈紝鍓嶉潰閫氳繃IOleWindow鎺ュ彛鎴戜滑寰楀埌浜嗘祻瑙堝櫒紿楀彛鐨勫彞鏌刪wnd錛屽垯鍙互榪欐牱鍋氾細
HMENU g_hPubMenu = NULL;
WNDPROC g_lpPrevWndProc = NULL;
LRESULT CALLBACK CustomMenuWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
銆if (uMsg == WM_INITMENUPOPUP)
銆{
銆銆if (wParam == (WPARAM) g_hPubMenu)
銆銆{
銆銆銆::EnableMenuItem( 鑷畾涔夌殑鑿滃崟鍛戒護ID, MF_ENABLED | MF_BYCOMMAND );
銆銆銆::CheckMenuItem( 鑷畾涔夌殑鑿滃崟鍛戒護ID, MF_BYCOMMAND);
銆銆銆return 0;
銆銆}
銆}
銆return CallWindowProc(g_lpPrevWndProc, hwnd, uMsg, wParam, lParam);
}
HRESULT CMyHtmlView::OnShowContextMenu(DWORD dwID, LPPOINT ppt,
LPUNKNOWN pcmdtReserved, LPDISPATCH pdispReserved)
{
//嫻忚鍣ㄨ彍鍗曞彞鏌勪繚瀛樺湪g_hPubMenu涓?br>......
// subclass嫻忚鍣ㄧ獥鍙?br>g_lpPrevWndProc = (WNDPROC)::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)CustomMenuWndProc);
//m_SubclassWnd.SubclassWindow( hwnd );//MFC涓敤姝ゆ柟娉曟洿綆渚?/font>
// Show shortcut menu
int iSelection = ::TrackPopupMenu(hSubMenu,
銆TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD,
銆ppt->x,
銆ppt->y,
銆0,
銆hwnd,
銆(RECT*)NULL);
// Unsubclass嫻忚鍣ㄧ獥鍙?br>::SetWindowLong(hwnd, GWL_WNDPROC, (LONG)g_lpPrevWndProc);
g_lpPrevWndProc = NULL;
//m_SubclassWnd.UnsubclassWindow();
if (iSelection == 鑷畾涔夌殑鑿滃崟鍛戒護ID )
{
銆::SendMessage( ::AfxGetMainWnd()->m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(lResult), 0x0), 0 );
}
else
{
銆LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL);
}
......
}
鍦∕FC 涓垯鏇翠負鏂逛究錛屼粠CWnd緇ф壙涓涓獥鍙g被錛屽亣璁句負CWebBrowserSubclassWnd錛屼負CMyHtmlView娣誨姞涓涓? CWebBrowserSubclassWnd綾誨瀷鐨勬垚鍛樺彉閲弇_SubclassWnd錛屽湪瀛愮被鍖栧拰鍘婚櫎瀛愮被鍖栨椂璋冪敤 m_SubclassWnd.SubclassWindow( hwnd )鍜宮_SubclassWnd.UnsubclassWindow()鍗沖彲銆傜浉搴旂殑WM_INITMENUPOPUP娑堟伅澶勭悊鍑芥暟濡備笅鎵紺猴細
void CWebBrowserSubclassWnd::OnInitMenuPopup(CMenu* pPopupMenu, UINT nIndex, BOOL bSysMenu)
{
銆CWnd::OnInitMenuPopup(pPopupMenu, nIndex, bSysMenu);
銆pPopupMenu->EnableMenuItem( 鑷畾涔夌殑鑿滃崟鍛戒護ID, MF_ENABLED | MF_BYCOMMAND );
銆pPopupMenu->CheckMenuItem( 鑷畾涔夌殑鑿滃崟鍛戒護ID, MF_BYCOMMAND);
}
涓嬮潰鐨勫浘鐗囨樉紺轟簡灝?#8220;鏂囧瓧澶у皬”鑿滃崟欏規坊鍔犲埌“緙栫爜”鑿滃崟欏圭殑涓嬮潰鐨勬晥鏋溿?/font>

5銆佹柊鐨勯棶棰?br> 鐪嬪畬涓婇潰鐨勪唬鐮侊紝鎴戜滑鍙堣嚜鐒跺湴鎯沖埌嫻忚鍣ㄧ紪紼嬩腑鐨勫彟涓涓棶棰橈紝閭e氨鏄?#8220;緙栫爜”鑿滃崟銆傛垜浠寚瀹氾紝鎵嬪姩寤虹珛涓涓?#8220;緙栫爜”鑿滃崟鏄瘮杈冮夯鐑︾殑浜嬶紝鑰屼笖寰堥毦鍋氬埌涓庢祻瑙堝櫒涓婁笅鏂囪彍鍗曚笂鐨?#8220;緙栫爜”鑿滃崟涓鏍風殑鏁堟灉銆備綍涓嶄嬌鐢ㄤ笂榪扮殑鏂規硶璁╂祻瑙堝櫒鑷繁寤虹珛“緙栫爜”鑿滃崟鍜屽鐞嗙浉搴旂殑鍛戒護鍛紵
鍏蜂綋瀹炵幇璇風湅涓嬩竴綃囨枃绔犮奍nternet Explorer 緙栫▼綆榪幫紙涓冿級瀹岀編鐨?#8220;緙栫爜”鑿滃崟銆?/font>
鍙傝冭祫鏂?/strong> 錛?br>MSDN:Adding Entries to the Standard Context Menu
MSDN:How To Adding to the Standard Context Menus of the WebBrowser Control
MSDN:IDocHostUIHandler::ShowContextMenu Method
BeginThread.com:Custom WebBrowser Context Menus

銆銆2銆佸鏈?br>
銆銆MSDN涓湁涓綃囧彨“WebBrowser Customization”鐨勬枃绔狅紝鍏朵腑浠嬬粛浜嗛氳繃IDocHostUIHandler.ShowContextMenu鏂規硶鑷畾涔塛ebBrowser涓婁笅鏂囪彍鍗曠殑鏂規硶銆?br>
鍏?
鍘熺悊鏄粠“shdoclc.dll”鐨勮祫婧愪腑鍒涘緩鑿滃崟錛屼綔涓浜涗慨鏀逛箣鍚庣敤TrackPopupMenu鍑芥暟錛堟敞鎰忓湪鏍囧織涓寘鍚?
TPM_RETURNCMD錛夊皢鑿滃崟寮瑰嚭錛岀劧鍚庢妸榪斿洖鐨凜ommand ID鍙戦佺粰“Internet Explorer_Server”紿楀彛榪涜澶勭悊銆?/p>
| 銆銆...... 銆銆// 鏄劇ず鑿滃崟 銆銆int iSelection = ::TrackPopupMenu(hMenu, 銆銆TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, 銆銆ppt->x, 銆銆ppt->y, 銆銆0, 銆銆hwnd, 銆銆(RECT*)NULL); 銆銆// 鍙戦丆ommand ID鍒板澹崇獥鍙?br>銆銆LRESULT lr = ::SendMessage(hwnd, WM_COMMAND, iSelection, NULL); 銆銆...... |
銆銆濂斤紝濡傛灉鎵懼埌鎵鏈変笂涓嬫枃鑿滃崟鐨凜ommand ID錛屼笉灝卞彲浠ラ殢鏃惰皟鐢ㄤ簡錛熺‘瀹炴槸榪欐牱鐨勩?br>
銆銆3銆佸疄鐜?br>銆銆鐢╡XeScope涔嬬被搴旂敤紼嬪簭璧勬簮鎺㈢儲鍣ㄦ墦寮“shdoclc.dll”渚垮彲浠ュ湪鑿滃崟璧勬簮涓嬫壘鍒頒笂涓嬫枃鑿滃崟鐨勮璁★紝濡備笅鍥撅細

銆銆鎴戜滑瑕佸仛鐨勶紝灝辨槸灝嗚繖浜汭D鍙戦佸埌“Internet Explorer_Server”紿楀彛榪涜澶勭悊銆傞棶棰樻槸WebBrowser鍏跺疄鏄竴涓狾LE瀹瑰櫒錛屾垜浠嬌鐢ㄧ殑CHtmlView鍙堟槸鏇村灞傜殑灝佽錛屼粬浠? 鐨刴_hWnd鎴愬憳鍙橀噺騫朵笉鏄疘E紿楀彛鐨勫彞鏌勶紝濡備綍鎵懼埌鎴戜滑闇瑕佺殑鍙ユ焺鍛紵璇風湅涓嬮潰鐨勫浘錛?/p>

銆銆鏍規嵁鍥句腑鏄劇ず鐨勪粠灞炲叧緋伙紝欏鴻棨鎽哥摐錛屾渶鍐呭眰鐨勭獥鍙?#8220;Internet Explorer_Server”鐨勫彞鏌勫氨鏄垜浠渶瑕佺殑涓滆タ銆備負浜嗙畝鍖栭棶棰橈紝鎴戣繖閲屼嬌鐢ㄤ簡鏉ヨ嚜MSDN Magazine璧勬繁涓撴爮鎾扮ǹ浜篜aul Dilascia鐨凜FindWnd綾伙紝闈炲父濂界敤銆?/p>
| 銆銆//////////////////////////////////////////////////////////////// 銆銆// MSDN Magazine -- August 2003 銆銆// If this code works, it was written by Paul DiLascia. 銆銆// If not, I don't know who wrote it. 銆銆// Compiles with Visual Studio .NET on Windows XP. Tab size=3. 銆銆// 銆銆// --- 銆銆// This class encapsulates the process of finding a window with a given class name 銆銆// as a descendant of a given window. To use it, instantiate like so: 銆銆// 銆銆// CFindWnd fw(hwndParent,classname); 銆銆// 銆銆// fw.m_hWnd will be the HWND of the desired window, if found. 銆銆// 銆銆class CFindWnd { 銆銆private: 銆銆////////////////// 銆銆// This private function is used with EnumChildWindows to find the child 銆銆// with a given class name. Returns FALSE if found (to stop enumerating). 銆銆// 銆銆static BOOL CALLBACK FindChildClassHwnd(HWND hwndParent, LPARAM lParam) { 銆銆CFindWnd *pfw = (CFindWnd*)lParam; 銆銆HWND hwnd = FindWindowEx(hwndParent, NULL, pfw->m_classname, NULL); 銆銆if (hwnd) { 銆銆pfw->m_hWnd = hwnd; // found: save it 銆銆return FALSE; // stop enumerating 銆銆} 銆銆EnumChildWindows(hwndParent, FindChildClassHwnd, lParam); // recurse 銆銆return TRUE; // keep looking 銆銆} 銆銆public: 銆銆LPCSTR m_classname; // class name to look for 銆銆HWND m_hWnd; // HWND if found 銆銆// ctor does the work--just instantiate and go 銆銆CFindWnd(HWND hwndParent, LPCSTR classname) 銆銆: m_hWnd(NULL), m_classname(classname) 銆銆{ 銆銆FindChildClassHwnd(hwndParent, (LPARAM)this); 銆銆} 銆銆}; |
銆銆鍐嶅啓涓涓嚱鏁癐nvokeIEServerCommand錛岃皟鐢ㄥ氨寰堟柟渚夸簡錛屻奍nternet Explorer 緙栫▼綆榪幫紙鍥涳級“娣誨姞鍒版敹钘忓す”瀵硅瘽妗嗐嬩腑鏈鍚庣粰鍑虹殑鏂規硶灝辨槸浠庤繖閲屾潵鐨勩?/p>
| 銆銆void CMyHtmlView::InvokeIEServerCommand(int nID) 銆銆{ 銆銆CFindWnd FindIEWnd( m_wndBrowser.m_hWnd, "Internet Explorer_Server"); 銆銆::SendMessage( FindIEWnd.m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(nID), 0x0), 0 ); 銆銆} |
銆銆4銆丆ommand IDs
銆銆瀵規墍鏈夌殑Command ID閫愪竴灝濊瘯鍚庢垜浠彂鐜幫細
銆銆1)涓嶆槸鎵鏈夌殑Command ID閮藉彲浠ョ敤涓婇潰鐨勬柟娉曡皟鐢紱
銆銆2)涓嶆槸鎵鏈夌殑Command ID閮芥槸鐢?#8220;Internet Explorer_Server”紿楀彛澶勭悊錛?br>銆銆3)鏈変竴浜汣ommand ID鏄敱涓婁竴綰х獥鍙?#8220;Shell DocObject View”澶勭悊銆?br>銆銆鎵浠ユ垜浠繕闇瑕佸啓涓涓嚱鏁般?/p>
| 銆銆void CMyHtmlView::InvokeShellDocObjCommand(int nID) 銆銆{ 銆銆CFindWnd FindIEWnd( m_wndBrowser.m_hWnd, "Shell DocObject View"); 銆銆::SendMessage( FindIEWnd.m_hWnd, WM_COMMAND, MAKEWPARAM(LOWORD(nID), 0x0), 0 ); 銆銆} |
銆銆璋冪敤鏂囩珷寮澶存彁鍒扮殑“瀵煎叆/瀵煎嚭”瀵硅瘽妗嗗彲浠ヨ繖鏍鋒潵鍋氾細
|
銆銆void CDemoView::OnImportExport() 銆銆鐢?Internet Explorer_Server"紿楀彛澶勭悊鐨凜ommand ID: 銆銆鐢?Shell DocObject View"紿楀彛澶勭悊鐨凜ommand ID: |
銆銆5銆丷efresh
銆銆鐔熸倝TEmbeddedWB鐨勮鑰呭彲鑳芥敞鎰忓埌浜咺D_IE_CONTEXTMENU_REFRESH(6042)榪欎釜ID錛屽湪TEmbeddedWB涓粰鍑轟簡涓涓綋緗戦〉鍒鋒柊鏃惰Е鍙戠殑OnRefresh浜嬩歡錛屽叾涓殑鍏抽敭浠g爜濡備笅錛?/p>
| 銆銆...... 銆銆if Assigned(FOnRefresh) and ((nCmdID = 6041 { F5}) or (nCmdID = 6042 { ContextMenu}) or (nCmdID = 2300)) then 銆銆begin 銆銆FCancel := False; 銆銆FOnRefresh(self, nCmdID, FCancel); 銆銆if FCancel then Result := S_OK; 銆銆end; 銆銆...... |

銆銆6銆侀渶瑕佹敞鎰忕殑闂
銆銆1)鐢↖nvokeIEServerCommand
(ID_IE_CONTEXTMENU_ADDFAV)璋冪敤“娣誨姞鍒版敹钘忓す”瀵硅瘽妗嗘椂闇瑕佹敞鎰忕殑鏄紝IE鎺ユ敹鍒?
ID_IE_CONTEXTMENU_ADDFAV鍛戒護鏃舵槸瀵圭綉欏典腑褰撳墠琚変腑鐨勯摼鎺ユ潵鎵ц“娣誨姞鍒版敹钘忓す”鎿嶄綔鐨勶紝濡傛灉娌℃湁閫変腑鐨勯摼鎺ワ紝鎵嶆槸灝嗗綋鍓嶇綉欏?
娣誨姞鍒版敹钘忓す銆?br>
銆銆2)鏂板緩IE紿楀彛銆傝繖鏄祻瑙堝櫒緙栫▼涓殑闅鵑涔嬩竴錛屽嵆浠庡綋鍓嶇獥鍙f柊寤轟竴涓狪nternet
Explorer紿楀彛錛屽畬鍏ㄥ鍒跺綋鍓嶉〉鐨勫唴瀹癸紙鍖呮嫭“鍓嶈繘”銆?#8220;鍚庨”鐨勭姸鎬侊級錛岃繖鍙互閫氳繃InvokeShellDocObjCommand
(ID_IE_FILE_NEWWINDOW)鏉ュ疄鐜般?br>
銆銆3)鏄劇ずIE鐨勭増鏈俊鎭傝皟鐢↖nvokeShellDocObjCommand(ID_IE_HELP_ABOUTIE)錛屽涓嬶細

銆銆4)InvokeShellDocObjCommand(ID_IE_FILE_PRINT)璋冨嚭鐨?#8220;鎵撳嵃”瀵硅瘽妗嗘槸闈炴ā鎬佺殑錛堟垜浠笉澶竻妤?
Microsoft鐨勮璁℃剰鍥撅紝鎴戣涓?#8220;鎵撳嵃”瀵硅瘽妗嗗簲璇ユ槸妯℃佺殑錛夛紝鏄劇ず妯℃佺獥鍙g殑鏂規硶璇峰弬鑰冩垜鐨勫彟涓綃囨枃绔犮婂埄鐢╓H_CBT
Hook灝嗛潪妯℃佸璇濇鏄劇ず涓烘ā鎬佸璇濇銆?/p>


銆銆2銆両ShellUIHelper鎺ュ彛
銆銆寰蔣涓撻棬鎻愪緵浜嗕竴涓帴鍙ShellUIHelper鏉ュ疄鐜板Windows Shell API涓浜涘姛鑳界殑璁塊棶錛屽皢閾炬帴娣誨姞鍒版敹钘忓す涔熸槸鍏朵腑涔嬩竴錛屽氨鏄笅闈㈢殑AddFavorite鍑芥暟銆?/p>
|
銆銆HRESULT IShellUIHelper::AddFavorite(BSTR URL, VARIANT *Title); |
銆銆瀹炰緥浠g爜濡備笅錛?/p>
|
銆銆void CMyHtmlView::OnAddToFavorites() 銆銆if (SUCCEEDED(hr)) 銆銆pShellUIHelper->AddFavorite(strURL.AllocSysString(), &vtTitle); |
銆銆鎴戜滑娉ㄦ剰鍒拌繖閲岀殑“AddFavorite”鍑芥暟騫舵病鏈夊儚“DoOrganizeFavDlg”閭f牱闇瑕佷竴涓埗紿楀彛鍙ユ焺銆傝繖涔熷鑷翠笌鍦↖E涓墦
寮涓嶅悓錛岄氳繃IShellUIHelper鎺ュ彛鏄劇ず鍑烘潵鐨?#8220;娣誨姞鍒版敹钘忓す”瀵硅瘽妗嗘槸“闈炴ā鎬?#8221;鐨勶紝鏈変竴涓嫭绔嬩簬鎴戜滑搴旂敤紼嬪簭鐨勪換鍔℃爮鎸夐挳錛岃繖浣挎垜浠殑嫻忚
鍣ㄦ樉寰楅潪甯鎬笉涓撲笟錛堟垜鏄釜榪芥眰瀹岀編鐨勪漢錛岃繖涔熸槸鎴戠殑嫻忚鍣ㄨ繜榪熶笉鑳藉彂甯冪殑鍘熷洜涔嬩竴錛夈?br>
銆銆浜庢槸鎴戜滑寰堣嚜鐒跺湴鎯沖埌“shdocvw.dll”涓櫎浜?#8220;DoOrganizeFavDlg”澶栵紝搴旇榪樻湁涓涓被浼肩殑鍑芥暟錛屽彲浠ヤ紶鍏ヤ竴涓埗紿楀彛鍙ユ焺鐢ㄤ互鏄劇ず妯℃佺獥鍙o紝涔熻灝卞儚榪欐牱錛?/p>
|
銆銆typedef UINT (CALLBACK* LPFNADDFAV)(HWND, LPTSTR, LPTSTR); |
銆銆浜嬪疄涓婏紝榪欐牱鐨勫嚱鏁扮‘瀹炲瓨鍦ㄤ簬“shdocvw.dll”涓紝閭e氨鏄?#8220;DoAddToFavDlg”銆?/p>
銆銆3銆丏oAddToFavDlg鍑芥暟
銆銆“DoAddToFavDlg”鍑芥暟涔熸槸“shdocvw.dll”鏆撮湶鍑烘潵鐨勫嚱鏁頒箣涓錛屽叾鍘熷瀷濡備笅錛?/p>
|
銆銆typedef BOOL (CALLBACK* LPFNADDFAV)(HWND, TCHAR*, UINT, TCHAR*, UINT,LPITEMIDLIST); |
銆銆絎竴涓弬鏁版鏄垜浠兂瑕佺殑鐖剁獥鍙e彞鏌勶紝絎簩鍜岀鍥涗釜鍙傛暟鍒嗗埆鏄垵濮嬬洰褰曪紙涓鑸潵璇村氨鏄敹钘忓す鐩綍錛夊拰瑕佹坊鍔犵殑閾炬帴鐨勫悕瀛楋紙姣斿緗戦〉鐨?
Title錛夛紝絎笁鍜岀浜斾釜鍙傛暟鍒嗗埆鏄浜屽拰絎洓涓や釜緙撳啿鍖虹殑闀垮害錛岃屾渶鍚庝竴涓弬鏁板垯鏄寚鍚戜笌絎簩涓弬鏁扮洰褰曠浉鍏崇殑item identifier
list鐨勬寚閽?PIDL)銆備絾鏈濂囨殑鏄繖閲屽茍娌℃湁鍍?#8220;AddFavorite”鍑芥暟涓鏍風殑閾炬帴URL錛岄偅閾炬帴鏄庢牱娣誨姞鐨勫憿錛熺瓟妗堟槸“鎵嬪姩鍒涘緩”銆?br>
絎簩涓弬鏁板湪鍑芥暟璋冪敤榪斿洖鍚庝細鍖呭惈鐢ㄦ埛鍦?#8220;娣誨姞鍒版敹钘忓す”瀵硅瘽妗嗕腑閫夋嫨鎴栧垱寤虹殑瀹屾暣閾炬帴璺緞鍚嶏紙濡?#8220;X:\XXX\mylink.url”錛夛紝鎴戜滑灝辨牴
鎹繖涓礬寰勫拰緗戦〉鐨刄RL鏉ュ垱寤洪摼鎺ワ紝浠g爜濡備笅錛堜負綆鍖栵紝姝ゅ鐪佸幓媯鏌?shdocvw.dll"鏄惁宸插湪鍐呭瓨涓殑浠g爜錛屽弬瑙併奍nternet
Explorer 緙栫▼綆榪幫紙涓夛級“鏁寸悊鏀惰棌澶?#8221;瀵硅瘽妗嗐嬶級錛?/p>
|
銆銆void CMyHtmlView::OnFavAddtofav() 銆銆HMODULE hMod = (HMODULE)LoadLibrary("shdocvw.dll"); 銆銆if (SHGetSpecialFolderPath(NULL, szPath, CSIDL_FAVORITES, TRUE) && 銆銆TCHAR szURL[MAX_PATH]; 銆銆BOOL bOK = lpfnDoAddToFavDlg(m_hWnd, szPath, 銆銆if (bOK) |
銆銆瀹炵幇CreateInternetShortcut鍑芥暟鍒涘緩Internet蹇嵎鏂瑰紡錛屽彲浠ョ敤璇誨啓INI鏂囦歡鐨勬柟娉曪紝浣嗘洿濂界殑鍒欐槸鍒╃敤IUniformResourceLocator鎺ュ彛銆?/p>
|
銆銆HRESULT CMyHtmlView::CreateInternetShortcut(LPCSTR pszURL, LPCSTR pszURLfilename, 銆銆CoInitialize(NULL); 銆銆IUniformResourceLocator *pHook; 銆銆hres = CoCreateInstance (CLSID_InternetShortcut, NULL, CLSCTX_INPROC_SERVER, 銆銆if (SUCCEEDED (hres)) 銆銆// Query IShellLink for the IPersistFile interface for 銆銆if (SUCCEEDED (hres)) 銆銆// Set the path to the shortcut target. 銆銆hres = psl->SetIconLocation(szIconFile,nIndex); 銆銆if (SUCCEEDED (hres)) 銆銆if (SUCCEEDED (hres)) 銆銆// Save the shortcut via the IPersistFile::Save member function. 銆銆// Release the pointer to IPersistFile. 銆銆// Release the pointer to IShellLink. 銆銆} |
銆銆濂斤紝涓婇潰鐨勬柟娉曡櫧鐒墮夯鐑︿竴鐐癸紝浣嗘葷畻瑙e喅浜?#8220;妯℃佺獥鍙?#8221;鐨勯棶棰橈紝浣垮緱鎴戜滑鐨勭▼搴忎笉鑷充簬璁╃敤鎴烽剻瑙嗐備絾鏄棶棰樺張鏉ヤ簡錛屾垜浠彂鐜?#8220;鍏佽鑴辨満浣跨敤”鏄疍isabled鐨勶紝閭?#8220;鑷畾涔?#8221;涔熷氨鏃犱粠璋堣搗浜嗭紝灝界90%鐨勪漢閮芥病鏈変嬌鐢ㄨ繃IE鎻愪緵鐨勮劚鏈烘祻瑙堛?br>

銆銆闅鵑亾鎴戜滑鐨勫笇鏈涜鐮寸伃鍚楋紵鎴戜滑涓鏂歸潰鎯沖儚璋冪敤“AddFavorite”鍑芥暟涓鏍風殑涓嶅繀鎵嬪姩鍒涘緩閾炬帴錛屼竴鏂歸潰鍙堣妯℃佹樉紺虹獥鍙o紝灝卞儚IE閭f牱錛岃繕鑳借嚜瀹氫箟鑴辨満嫻忚銆?/p>
銆銆3銆佽剼鏈柟寮?/p>
銆銆璁稿緗戦〉涓婇兘浼氭湁涓涓寜閽垨閾炬帴“娣誨姞鏈〉鍒版敹钘忓す”錛屽疄闄呬笂閫氳繃涓嬮潰鐨勮剼鏈樉紺烘ā鎬佺殑“娣誨姞鍒版敹钘忓す”瀵硅瘽妗嗗皢緗戦〉鍔犲叆鍒版敹钘忓す銆?/p>
|
銆銆window.external.AddFavorite(location.href, document.title); |
銆銆榪欓噷鐨別xternal瀵硅薄鏄疻ebBrowser鍐呯疆鐨凜OM鑷姩鍖栧璞★紝浠ュ疄鐜板鏂囨。瀵硅薄妯″瀷錛圖OM錛夌殑鎵╁睍錛堟垜浠篃鍙互閫氳繃 IDocHostUIHandler瀹炵幇鑷繁鐨勬墿灞曪級.鏌ラ槄MSDN鍙互寰楃煡external瀵硅薄鐨勭殑鏂規硶涓嶪ShellUIHelper鎺ュ彛鎻愪緵鐨勬柟娉? 鏄竴鏍風殑銆傛垜浠湁鐞嗙敱鐩鎬俊錛孖ShellUIHelper鎻愪緵浜嗗WebBrowser鍐呯疆鐨別xternal瀵硅薄鐨勮闂紝濡傛灉鍦ㄩ傚綋鐨勫湴鏂瑰垱寤? IShellUIHelper鎺ュ彛鐨勫疄渚嬶紝涔熻璋冪敤“AddFavorite”鍑芥暟鏄劇ず鍑烘潵鐨勫氨鏄ā鎬佸璇濇浜嗐傞棶棰樻槸鎴戜滑榪樻病鏈夋壘鍒拌繖鏍風殑鍦版柟銆?/p>
銆銆浠庝笂闈㈢殑鑴氭湰錛屾垜浠緢鑷劧鍦板張鎯沖埌鍙︿竴涓柟娉曘傚鏋滆兘澶熻緗戦〉鏉ユ墽琛屼笂闈㈢殑鑴氭湰錛屽矀涓嶆槸闂灝辮В鍐充簡錛熻鍋氬氨鍋氾紝濡備笅錛?/p>
|
銆銆void CMyHtmlView::OnFavAddtofav() 銆銆void CMIEView::ExecScript(CString strjs) 銆銆if ( pHTMLWnd != NULL ) |
銆銆鍏堜粠CHtmlView鑾峰緱鏂囨。鐨勭埗紿楀彛window瀵硅薄鐨勬寚閽堬紝鍐嶈皟鐢ㄥ叾鏂規硶execScript鏉ユ墽琛岃剼鏈紙浜嬪疄涓婂彲浠ユ墽琛屼換鎰忕殑鑴氭湰錛夈? 璇曢獙鍙戠幇錛岃繖涓柟娉曢潪甯告湁鏁堬紝涓嶄粎紿楀彛鏄ā鎬佺殑錛岃屼笖涓嶉渶瑕佹墜鍔ㄥ垱寤洪摼鎺ワ紝鏇撮噸瑕佺殑鏄?#8220;鍏佽鑴辨満浣跨敤”鍜?#8220;鑷畾涔?#8221;鎸夐挳涔熷彲浠ョ敤浜嗐?/p>
銆銆4銆侀棶棰樹粛鏃ф病鏈夎В鍐?/p>
銆銆鎵ц鑴氭湰鐨勬柟寮忕湅璧鋒潵鏈夋晥錛屽彲涓鏃︽垜浠殑紼嬪簭瀹炵幇浜咺DocHostUIHandler鎺ュ彛瀵筗ebBrowser榪涜楂樼駭鎺у埗錛屽氨浼氬彂鐜頒竴鏃? 鎵ц鐨勮剼鏈寘鍚湁瀵?#8220;external”瀵硅薄鐨勮皟鐢紝灝變細鍑虹幇“鎵句笉鍒板璞?#8221;鐨勮剼鏈敊璇傚師鍥犳槸褰揗SHTML瑙f瀽寮曟搸錛堝茍闈濿ebBrowser錛夋鏌? 鍒板涓誨疄鐜頒簡IDocHostUIHandler鎺ュ彛錛屽氨浼氳皟鐢ㄥ叾GetExternal鏂規硶浠ヨ幏寰椾竴涓敤浠ユ墿灞旸OM鐨勮嚜鍔ㄥ寲鎺ュ彛鐨勫紩鐢ㄣ?/p>
|
銆銆HRESULT IDocHostUIHandler::GetExternal(IDispatch **ppDispatch錛?/p> |
銆銆浣嗘湁鏃跺欐垜浠茍娌℃湁鎯寵鎵╁睍DOM錛屽悓鏃舵垜浠繕甯屾湜WebBrowser浣跨敤瀹冭嚜宸辯殑DOM鎵╁睍銆傜碂緋曠殑鏄疓etExternal鏂規硶鐨勬枃妗d腑 璇磋繖縐嶆儏鍐典笅蹇呴』鎶妏pDispatch璁劇疆涓篘ULL錛屾崲鍙ヨ瘽璇達紝WebBrowser榪炲畠鍐呯疆鐨別xternal瀵硅薄涔熶笉鐢ㄤ簡錛岄偅鎴戜滑鐨? window.external.AddFavorite灝卞彉寰楁棤澶勪負瀹朵簡銆?/p>
銆銆鎴戞浘澶氭柟灝濊瘯灝哤ebBrowser鍐呯疆鐨別xternal瀵硅薄鎵懼嚭鏉ワ紝铏界劧閮芥病鏈夋垚鍔燂紝浣嗘槸瑙e喅闂鐨勬柟娉曞嵈琚垜鎵懼埌浜嗐?/p>
銆銆5銆佸畬緹庣殑鏂規
銆銆WebBrowser鍐呯疆鐨別xternal瀵硅薄鎴戜滑铏界劧鎵句笉鍒幫紝浣嗗畠鑲畾瀛樺湪錛屾垜浠彧瑕佹兂鍔炴硶璁¦ebBrowser鑷繁瀹屾垚瀵瑰叾璋冪敤鍗沖彲銆? 瀹炵幇闈炲父綆鍗曪紝鎵懼埌WebBrowser涓寘鍚殑“Internet Explorer_Server”紿楀彛鐨勫彞鏌勶紝鍙戜竴涓秷鎭氨瀹屾垚浜嗐備笅闈㈢殑浠g爜涓亣璁緈_hWndIE灝辨槸“Internet Explorer_Server”紿楀彛鐨勫彞鏌勩?/p>
|
銆銆#define ID_IE_ID_ADDFAV 2261 |
銆銆璇曚竴璇曟垚鏋滐紝鏄笉鏄拰鍦↖nternet Explorer涓夋嫨“娣誨姞鍒版敹钘忓す”鐨勬晥鏋滀竴妯′竴鏍楓?/p>
銆銆鑷充簬涓轟粈涔堣繖鏍峰仛錛屽悗緇枃绔犲啀璇淬?/p>
銆銆 1銆佹暣鐞嗘敹钘忓す
銆銆璋冪敤“鏁寸悊鏀惰棌澶?#8221;瀵硅瘽妗嗭紙濡備笅錛夛紝鍩烘湰涓婃潵璇撮兘鐢ㄧ殑鏄悓涓涓柟娉曪紝鍗寵皟鐢?#8220;shdocvw.dll”涓殑“DoOrganizeFavDlg”鍑芥暟錛屾妸鐖剁獥鍙e彞鏌勫拰鏀惰棌澶硅礬寰勪綔涓哄弬鏁頒紶鍏ュ嵆鍙?/p>

銆銆 2銆佷唬鐮?/strong>
銆銆浠g爜瀹炰緥濡備笅鎵紺猴紝鍊煎緱娉ㄦ剰鐨勬槸瀵?#8220;shdocvw.dll”鐨勫鐞嗭紝涓洪伩鍏嶉噸澶嶈皟鐢紝搴旇鍏堟鏌ュ叾鏄惁宸茬粡鍦ㄥ唴瀛樹腑銆?/p>
|
銆銆void CMyHtmlView::OnFavOrganizefav() 銆銆bool bResult = false; 銆銆HMODULE hMod = ::GetModuleHandle( _T("shdocvw.dll") ); 銆銆if (hMod == NULL)//濡傛灉"shdocvw.dll"灝氭湭杞藉叆鍒欒澆鍏ヤ箣 銆銆if (hMod == NULL) |
|
銆銆MessageBox( _T("The dynamic link library ShDocVw.DLL cannot be found."), 銆銆if (lpfnDoOrganizeFavDlg == NULL) 銆銆TCHAR szPath [ MAX_PATH ]; 銆銆hr = ::SHGetSpecialFolderPath( m_hWnd, szPath, CSIDL_FAVORITES, TRUE ); 銆銆bResult = (*lpfnDoOrganizeFavDlg) ( m_hWnd, szPath ) ? true : false; 銆銆::FreeLibrary( hMod ); 銆銆if (lpfnDoOrganizeFavDlg == NULL) 銆銆TCHAR szPath [ MAX_PATH ]; 銆銆hr = ::SHGetSpecialFolderPath( m_hWnd, szPath, CSIDL_FAVORITES, TRUE ); |
|
銆銆bResult = (*lpfnDoOrganizeFavDlg) ( m_hWnd, szPath ) ? true : false; 銆銆return;
|
銆銆 3銆佽璁?/strong>
銆銆瀹為檯涓婏紝浠?#8220;DoOrganizeFavDlg”鍑芥暟鐨勫師鍨嬪0鏄庢垜浠彲浠ョ湅鍒幫紝鐢變簬闇瑕佷竴涓礬寰勶紝鎵浠?#8220;鏁寸悊鏀惰棌澶?#8221;瀵硅瘽妗嗗叾瀹炰笉浠呭彲浠ョ敤鏉ユ暣 鐞嗘敹钘忓す錛岃繕鍙互鏁寸悊紓佺洏涓婄殑鐩綍銆傝屼笖鎵璋撶殑鏁寸悊涔熶笉榪囨槸鎻愪緵浜嗕竴涓璇濇浣跨敤鎴風敤璧鋒潵姣旇緝鏂逛究鑰屽凡錛屽拰鐩存帴鍦ㄨ祫婧愮鐞嗗櫒涓暣鐞嗘病鏈夊疄璐ㄦх殑宸埆銆傚洜姝? 璋冪敤“鏁寸悊鏀惰棌澶?#8221;瀵硅瘽妗嗙殑鏂規硶浠嶪E4.0寮濮嬪氨娌℃湁鍙樿繃錛岄櫎浜嗗璇濇鐨勫竷灞鏈夋墍鏀瑰彉銆?/p>
| 銆銆typedef UINT (CALLBACK* LPFNORGFAV)(HWND, LPTSTR); |

銆銆IE 4.0鐨?#8220;鏁寸悊鏀惰棌澶?#8221;瀵硅瘽妗?br>

銆銆IE 4.0鐨?#8220;鏁寸悊鏀惰棌澶?#8221;瀵硅瘽妗嗭紙鍘熸湰鐨勮璁★級
銆銆“娣誨姞鍒版敹钘忓す”灝變笉鍚屼簡錛?#8220;DoAddToFavDlg”鍑芥暟涓嶅啀鍍?#8220;DoOrganizeFavDlg”鍑芥暟涓鏍峰鎵鏈塈E鐨勭増鏈兘閫傜敤銆?/p>
銆銆 鍙傝冭祫鏂欙細
銆銆MSDN: Adding Internet Explorer Favorites to Your Application
銆銆鍦ˋdobe Reader/Acrobat鐨勫睘鎬ц緗獥鍙d腑錛屾垜浠彲浠ユ壘鍒?#8220;Display PDF in browser”鐨勯夐」錛屽鏋滃嬀涓婏紝鍒橬avigate("xxx.pdf")灝嗕細浠ュ祵鍏ョ殑鏂瑰紡鍦↖E涓祻瑙圥DF鏂囦歡錛屽惁鍒欏湪鐙珛鐨凙dobe Reader/Acrobat紿楀彛涓祻瑙堛備絾鍦∣ffice鐨?#8220;閫夐」”瀵硅瘽妗嗕腑鎴戜滑鎵句笉鍒拌繖鏍風殑璁劇疆銆?/p>

銆銆闂錛氬浣曞湪鑷繁鐨勬祻瑙堝櫒涓帶鍒禣ffice榪欑被Ole Servers鐨勬墦寮鏂瑰紡錛?br>
銆銆絳旀錛氫慨鏀規枃浠跺す閫夐」錛屾垨淇敼娉ㄥ唽琛ㄣ?br>
銆銆鏂規硶1銆佸涓嬫墍紺猴紝浠庢帶鍒墮潰鏉夸腑鎵撳紑“鏂囦歡澶?#8221;閫夐」錛屽湪“鏂囦歡綾誨瀷”灞炴ч〉涓婃壘鍒扮浉搴旂殑鏂囦歡鍚庣紑鍚嶏紝濡?#8220;DOC”錛岀偣鍑?#8220;楂樼駭”鎸夐挳錛屽湪寮瑰嚭鐨?#8220;緙栬緫鏂囦歡綾誨瀷”瀵硅瘽妗嗕腑鏈?#8220;鍦ㄥ悓涓紿楀彛涓祻瑙?#8221;鐨勯夐」錛屽鏋滃嬀涓婏紝鍒欎互宓屽叆IE鐨勬柟寮忔墦寮鏂囨。錛屽惁鍒欏湪鐙珛紿楀彛涓墦寮銆?br>




銆銆鏂規硶2銆佺洿鎺ヤ慨鏀規敞鍐岃〃銆?br>
銆銆鍦?#8220;HKEY_LOCAL_MACHINE\SOFTWARE\Classes”閿間笅錛屼繚瀛樹簡鍚勭鏂囦歡綾誨瀷鐨勬敞鍐屼俊鎭紝浠ffice鏂囨。涓轟緥錛屼笌鏂囨。鐩稿叧閿煎涓嬨?br>
銆銆鏂囨。綾誨瀷 閿?br>
銆銆Microsoft Excel 7.0 worksheet Excel.Sheet.5
銆銆Microsoft Excel 97 worksheet Excel.Sheet.8
銆銆Microsoft Excel 2000 worksheet Excel.Sheet.8
銆銆Microsoft Word 7.0 document Word.Document.6
銆銆Microsoft Word 97 document Word.Document.8
銆銆Microsoft Word 2000 document Word.Document.8
銆銆Microsoft Project 98 project MSProject.Project.8
銆銆Microsoft PowerPoint 2000 document PowerPoint.Show.8
濡傛灉鎴戜滑瑕佷慨鏀筗ord鏂囨。鐨勬墦寮鏂瑰紡錛岋紝鍒欏湪“HKEY_LOCAL_MACHINE\SOFTWARE\Classes\
Word.Document.8”涓嬫柊寤轟竴涓悕涓?#8220;BrowserFlags”錛岀被鍨嬩負“REG_DWORD”鐨勫瓙閿鹼紝濡傛灉璁劇疆鍏跺間負“8”錛屽垯鍦ㄧ嫭绔?
鐨勭獥鍙d腑鎵撳紑Word鏂囨。錛屽惁鍒欏湪宓屽叆IE鐨刉ord紿楀彛涓墦寮鏂囨。銆?br>
銆銆娉細Microsoft Excel 7.0 worksheet紼嶆湁涓嶅悓錛屽簲璁劇疆BrowserFlags鐨勫間負“9”鏂瑰彲鍦ㄧ嫭绔嬬殑紿楀彛涓墦寮鏂囨。銆?br>

銆銆鍏墮棿姝f槸澶氱獥鍙f祻瑙堝櫒鍏ㄩ潰寮鑺辯殑鏃ュ瓙錛屾棤濂堟墜澶翠簨鎯呭お澶氾紝鎴戠殑浣滃搧Multiple iExplorer涔熶竴鐩存湭鑳介棶涓栵紝鑷充粖閬楁喚銆傚悗鏉ュ父涓嶨oSurf鐨勪綔鑰呬氦嫻佸涔狅紝鏇夸粬瑙e喅浜嗕笉灝戦棶棰橈紝涔熶粠浠栭偅閲屽鍒拌澶氥傚浠奊oSurf鏈変簡姣旇緝 鍥哄畾鐨勭敤鎴風兢錛屾湁鎴戜竴浠藉姛鍔籌紝綆楁槸涓縐嶅畨鎱板惂錛屼粬涔熶竴搴﹀湪GoSurf瀹樻柟涓婚〉涓婂皢鎴戝垪涓烘牳蹇冩妧鏈敮鎸侊紝浣嗘垜鍚庢潵鍥犱負宸ヤ綔鍜屽涔犵殑鍏崇郴寰堝皯鍐嶅拰浠栬仈緋伙紝瀹? 鍦ㄦ儹鎰с?/p>
銆銆鍥炲ご鍐嶇湅褰撴椂鐨勬枃绔狅紝閿欒瀹炲湪涓嶅皯錛岃璇嗕篃姣旇緝嫻呰杽錛屾湁浜涢棶棰樻洿鏄竴鐩存病鏈夊緱鍒拌В鍐籌紝鎵浠ユ垜瑙夊緱鏈夊繀瑕佸湪鍓嶆枃鐨勫熀紜涓婏紝鑺辯偣鏃墮棿灝嗘垜縐瘡鐨勫叧浜嶪nternet Explorer緙栫▼鐨勯棶棰樻瘮杈冨畬鏁村湴鍐欏嚭鏉ワ紝甯屾湜瀵硅嚜宸辨湁涓氦浠o紝瀵瑰ぇ瀹舵湁涓浜涘府鍔┿?/p>
銆銆鏄負搴忋?/p>
銆銆 Internet Explorer緙栫▼綆榪幫紙涓錛塛ebBrowser榪樻槸WebBrowser_V1
銆銆浣犵殑鏈哄櫒涓婃繪槸瀛樺湪鐫“涓?#8221;涓猈ebBrowser錛屼竴涓彨WebBrowser錛屽彟涓涓彨WebBrowser_V1錛屽叾CLASSID濡備笅錛?/p>
| 銆銆CLASS_WebBrowser: TGUID = '{8856F961-340A-11D0-A96B-00C04FD705A2}'; 銆銆CLASS_WebBrowser_V1: TGUID = '{EAB22AC3-30C1-11CF-A7EB-0000C05BAE0B}'; |
銆銆瀹冧滑鍒嗗埆瀵瑰簲鐨勬帴鍙f槸IWebBrowser2鍜孖WebBrowser銆傞棶棰樻槸鎴戜滑璇ョ敤鍝竴涓憿錛?br>銆銆鎸夌収寰蔣鐨勬帹鑽愶紝搴旇灝介噺浣跨敤 鍓嶈咃紝鍥犱負鍚庤呮槸涓哄吋瀹笽nternet Explorer 3.x鑰屼繚鐣欑殑錛堝敖綆″畠鑳藉鍝嶅簲鏉ヨ嚜Internet Explorer 3.x銆?.x銆?.x銆?.x鐨勪簨浠訛級錛岀浉搴旂殑IWebBrowser鍜孖WebBrowserApp鎺ュ彛涔熷簲鎶涘純銆?/p>
銆銆鐢變簬Internet Explorer 3.x騫翠唬涔呰繙錛屽鑷碬ebBrowser_V1鎻愪緵鐨勪簨浠跺皯寰楀彲鎬滐紝浣嗗煎緱涓鎻愮殑鏄畠鎻愪緵鐨勪袱涓簨浠禣nNewWindow鍜? OnFrameBeforeNavigate鏈夌潃涓嶰nBeforeNavigate鍑犱箮鐩稿悓鐨勫弬鏁幫細
| 銆銆OnBeforeNavigate( 銆銆BSTR URL, 銆銆long Flags, 銆銆BSTR TargetFrameName, 銆銆VARIANT* PostData, 銆銆BSTR Headers, 銆銆BOOL FAR* Cancel) |
|
銆銆OnNewWindow( 銆銆OnFrameBeforeNavigate( |
銆銆鎵浠ヤ嬌鐢╓ebBrowser_V1浣垮緱鎴戜滑鐨勬祻瑙堝櫒鍦ㄦ湁鏂扮獥鍙f墦寮鏃惰兘澶熻交鏄撴崟鎹夊埌鍏禪RL鍙婄浉鍏崇殑鏁版嵁錛屽鏋滃皢Processed璁劇疆涓篢RUE錛屽垯鍙彇娑堟柊紿楀彛鐨勫脊鍑恒傚悓鏍鳳紝澶勭悊Frame涔熸瘮鍦╓ebBrowser涓潵寰楀鏄撱?/p>
銆銆浣哤ebBrowser_V1鐨勮嚧鍛藉急鐐規槸瀹冧笉鏀寔楂樼駭鎺ュ彛錛屽IDocHostUIHandler錛屽嵆渚挎垜浠疄鐜頒簡 IDocHostUIHandler鎺ュ彛錛屼篃涓嶄細琚玏ebBrowser_V1璋冪敤銆傛墍浠ュ笇鏈涘湪鑷繁鐨勬祻瑙堝櫒涓疄鐜癤P鐨勭晫闈富棰樸佹墿灞旾E鐨凞OM 錛圖ocument Object Model錛夌瓑楂樼駭鎺у埗鐨勮瘽錛屽氨鑲畾涓嶈兘閫夋嫨WebBrowser_V1浜嗐?/p>
銆銆澶勭悊鏂扮獥鍙e疄鍦ㄦ槸寰堥夯鐑︾殑涓浠朵簨錛屼笉鐭ラ亾寰蔣涓轟粈涔堝湪鏂扮増鏈殑OnNewWindow2浜嬩歡涓幓鎺変簡URL榪欐牱鐨勫弬鏁幫紝鑰屼笖OnNewWindow2浜嬩歡涓嶈兘瀹屽叏鎹曟崏鍒版墍鏈夌殑鏂扮獥鍙f墦寮銆備絾濡傛灉瀹夎浜哤indows XP SP2鐨勮瘽錛屽ソ澶勫張鍥炴潵浜嗐?/p>
銆銆Windows XP SP2瀵笽nternet Explorer
6浣滀簡鍗囩駭錛屽茍涓旀彁渚涗簡涓涓柊鐨勪簨浠禣nNewWindow3錛屽畠鍦∣nNewWindow2浜嬩歡涔嬪墠鍙戠敓錛屼篃鍖呭惈浜嗚鎴戜滑鑳藉鍔犱互榪囨護澶勭悊鐨勬柊紿楀彛鐨?
URL絳夊弬鏁幫紝鍐嶅姞涓奍NewWindowManager鎺ュ彛錛屽氨鏄疄鐜癢indows XP SP2涓繃婊ゅ箍鍛婄獥鍙e姛鑳界殑鍩虹銆?/p>
