c++控制ie浏览器

来源:互联网 发布:redis和mysql的区别 编辑:程序博客网 时间:2024/05/21 12:44

      事先说一下,这不是用com,因此许多com的功能无法实现,我这里只是模拟下ie control,简单的实现几个功能。下面是自己封装的类:

class ieitem{
public:
 ieitem(HWND handle);
 ~ieitem();
 char* getname();
 char* geturl();
 void navigate(char *u);
 HWND h;
 void show();
 void hide();
 int visible;
private:
 char *name;
 char *url;
 HWND h_edit;
 
};
class ie{
public:
 ie();
 ~ie();
 int getcount();
 ieitem *getitem(int i);
 void getobject();
 HWND *item;
 int count;
HWND *_item;
};
int CALLBACK  cwin(          HWND hwnd,
       LPARAM lParam){
HWND *l=(HWND*)lParam;
char c[5]={0};
 ::GetClassName(hwnd,c,5);
  if(::strcmp(c,"Edit")==0){
*l=hwnd;
return 0;
  }
  return 1;
}
int CALLBACK  win(          HWND hwnd,
       LPARAM lParam){
 char c[8]={0};
 ie* i=(ie*)lParam;
 ::GetClassName(hwnd,c,8);
 if(::strcmp(c,"IEFrame")==0){
  
  i->count++;
i->_item=i->item;
i->item=new HWND[i->count];
if(i->count>1){
for(int a=0;a<i->count-1;a++){
i->item[a]=i->_item[a];
}
}
i->item[i->count-1]=hwnd;
}
return 1;
}
ieitem::ieitem(HWND handle){
name=0;
url=0;
h=handle;

 ::EnumChildWindows(h,cwin,(LPARAM)&h_edit);

}
void ieitem::show(){
 ::ShowWindow(h,1);
 visible=1;
}
void ieitem::hide(){
 ::ShowWindow(h,0);
 visible=0;
}
ieitem::~ieitem(){
if(name!=0){
  delete []name;
 }
if(url!=0){
  delete []url;
 }
delete this;
}
char *ieitem::getname(){
 if(name!=0){
  delete []name;
 }
 int l=::SendMessage(h,WM_GETTEXTLENGTH,0,0);
 name=new char[l+1];
 ::SendMessage(h,WM_GETTEXT,l+1,(long)name);
 return name;
}
char *ieitem::geturl(){
  
 if(url!=0){
  delete []url;
 }
 

 int l=::SendMessage(h_edit,WM_GETTEXTLENGTH,0,0);
 url=new char[l+1];
 ::SendMessage(h_edit,WM_GETTEXT,l+1,(long)url);
 return url;
}
void ieitem::navigate(char *u){
 ::SendMessage(h_edit,WM_SETTEXT,0,(long)u);
 PostMessage(h_edit, WM_KEYDOWN, VK_RETURN, 0);
}
ie::ie(){
count=0;
item=0;
}
ie::~ie(){
if(item!=0){
  delete []item;
 }
}
void ie::getobject(){
if(item!=0){
  delete []item;
 }
count=0;
 ::EnumWindows(win,(LPARAM)this);
}
int ie::getcount(){
return count;
}
ieitem* ie::getitem(int i){
ieitem* o=new ieitem(item[i]);
return o;
}

 我封装了ie和ieitem类,调用时由ie引申出ieitem,下面给出简单示例:

main(){
  
ie a;
a.getobject();
 
for(int i=0;i<a.count;i++){
 if(::strstr(a.getitem(i)->geturl(),"qq.com")){
  a.getitem(i)->show();
 }
}
}

先getobject下,获得当前ie的状态,其他的接口都很简单,不多重复了。

我用api模拟的,但是毕竟不是引入shellwindows,没有办法操作文档对象,在vc下操作com比较麻烦,一般我都是vb直接上的。

      文章有不足之处,还望各位多多指点。

原创粉丝点击