|
|
利用IE的命令直接操作WebBrowser控件
0 `3 w" T Z: G+ b6 R: H7 S1 H* M; i- B
通常,我们对CHtmlView/WebBrowser控件进行打印、查看源文件、查找等操作麻烦的不得了
" Q0 ]" S* E3 F# q' d1 T详见http://support.microsoft.com/support/kb/articles/Q156/7/32.ASP
$ l2 \7 b9 P8 X( j! |. V' T" ?9 @% C E: y# K$ u. p
其次就是打开“Internet选项”、“添加到收藏夹”等方面的麻烦:( ?- n3 c! E$ r! x$ P# M
详见http://www.csdn.net/Expert/TopicView1.asp?id=620932
8 p! n5 c9 U8 b1 y3 x! F
. Y* P* j; Y6 n1 F下面介绍的方法能够迅捷的通过短短几行代码完成上述操作,并且你还能完成一些特殊的操作(比如让IE控件进入像frontpage那样的编辑状态等等)
( T: I1 A" W" Y' l& P8 g( _6 @( D& j4 v
+ m V' v @* Y- F. [0 [- ^3 p) Q3 o- D3 K
首先,在你的工程里填加对MsHtmcid.h的支持:
: _( U; {+ ~$ W' {5 W0 l9 }- P( a$ A
#include <MsHtmcid.h> //你可以在VC的头文件的目录中找到它,& j- f& Y( m1 K) k* J6 P7 e& N5 Q3 ]
//推荐你到MS网站下载最新文件以获得对IE6命令的支持。
8 s% @8 B5 t. S7 b* }; ~ E' X3 a6 c7 w! m& i. k0 ?3 K/ v; T0 w
2 \) i6 G; T( j* K# W然后你所要做的仅仅是找到IE控件的Internet Explorer_server窗口句柄发送命令给它。2 b P+ A* J5 N6 L9 F+ {5 V
下面给出部分演示,看了演示你就知道该怎么做了。
5 g8 s" S$ \+ I- C# A
5 F# p5 S0 u7 t( x: F: y5 t m) c将WebBrowser切换至编辑状态:2 ]6 ?6 h( g9 f0 n0 Z& Y, }$ _, F2 v
3 K: T6 Z1 j9 v; bvoid CWebBrowser2::OnGotoEditMode()
# o' B% _4 Y8 u+ e{# Z8 q, J2 t2 @. Z+ n7 t
CWnd* pwndIEShell = NULL;
3 \& Z. ]! J6 z, c CWnd* pwndIEHTML = NULL;
' H/ T' Y: I3 L: B7 B ( D% {3 U" [2 d! n, a0 F8 I2 @6 G
pwndIEShell = this->GetWindow(GW_CHILD); //this是CWebBrowser2指针
; e% ^& v0 j: C6 B, m/ F7 y' w/ n if (pwndIEShell)
1 u/ N. W3 L4 M, F8 }6 a6 Z {5 k# Q3 q2 N/ ~! u
pwndIEHTML = pwndIEShell->GetWindow(GW_CHILD); //WebBrowser控件的窗口关系你可以通过spy++来观察,这里不累赘7 w( G1 ~" C. A
}( r" {& O' Y* k H2 r/ j7 `
, Y# J7 F/ Y2 K8 A' z$ L5 X9 K4 Q0 ~
if(pwndIEHTML != NULL)8 G* i+ E6 I3 Q% M* i% `7 y$ @7 f0 P
{
* d) K P0 g% l* B6 c% b WPARAM wParam = MAKELONG(IDM_EDITMODE, 1);//IDM_EDITMODE换为IDM_BROWSEMODE就返回浏览模式; `8 m6 J! G. M# F* J+ g# v
pwndIEHTML->SendMessage(WM_COMMAND, wParam, (LPARAM)pwndIEHTML->m_hWnd);
0 }6 w( S' A( o } 9 ^/ e5 H( N; m+ T1 y
}
& H- M1 v6 i# S; A/ T. v# O
$ r/ F/ u2 R% j9 Q7 Z d7 B之后你会发现WebBrowser控件变的跟frontpage一样(早知道这样不用DHtmlEdit控件了,哈)& O9 k; c2 e+ C" s) o# b9 w
7 z/ u, a! i D2 o0 B) O3 n
CHtmlView的实现跟上面稍有不同,因为多了个CFormView的缘故,具体代码如下:" H% t' U7 `; [; A, I) d- m
' M3 a( R' ~" V' M& a* H5 u
void CYourhtmlView::OnAddtoFavorites()
0 o1 C( u6 a( O( _( x{9 I$ e" t( P- z! u4 j
CWnd* pwndWebControl = NULL;
, Y# Y9 s0 e6 G8 q0 v" K- ~ CWnd* pwndIEShell = NULL;
9 J& c3 C: m: D: L- w2 Z CWnd* pwndIEHTML = NULL;+ ~" C- D. B2 P* h! k
% J$ g: y% x7 R# w+ V pwndWebControl = GetWindow(GW_CHILD);
- Z5 v+ k: m0 _" F+ v6 J) L if(pwndWebControl == NULL)
8 V* b, ?# k, h4 \ return;/ w# x& V6 e, |% E8 K- z$ C, J
pwndIEShell = pwndWebControl->GetWindow(GW_CHILD);
+ l/ u c# I) Y if (pwndIEShell)- I$ n/ m) J6 m6 \" ?) f. c2 `! t! r
{) |( S' E; J' k0 D: C1 ?1 c3 n
pwndIEHTML = pwndIEShell->GetWindow(GW_CHILD);
# \; G3 Z* h' n+ P6 y W }
# z1 j: X+ _2 C3 {
6 q+ n) b5 i8 O. V/ @- V2 u if(pwndIEHTML != NULL)
* M1 e a, y' t {3 j. P* [/ C# L4 \- w/ S$ n
WPARAM wParam = MAKELONG(IDM_ADDFAVORITES, 1);//添加到收藏夹,换成IDM_OPTIONS就是打开internet选项。
; I, z5 L' W$ r4 h1 ?; b pwndIEHTML->SendMessage(WM_COMMAND, wParam, (LPARAM)pwndIEHTML->m_hWnd);) l. ?0 F1 P. g+ n* v, z6 d1 a5 \
} 8 R/ ~$ c3 p- N
}
^5 c+ @$ ]$ i* N1 l
* s. K6 T0 L! g/ w, `8 J5 {通过改变wParam ,你可以实现几乎IE所有的已知的命令(另存为...、打印预览、创建桌面快捷方式等等)和一些未知的命令(比如进入编辑模式等等)。
A# t! g4 q. c3 x* a
( a& N, b2 M' M9 _2 u6 c- x好了,就介绍到这,具体的你可以通过观察MsHtmcid.h和实践来了解。
; M P; v' @& n# k% y4 r最后,希望通过直接发送命令消息的方法能使你的工作事半功倍! |
|