September 22, 2012 分类:ASM/C/C++     作者:hoverlees

浏览器嵌入窗口程序一直以来就是WEB应用程序的首选方案,这种方案只需要实现一个主窗口,并提供一些接口供脚本调用,内部的界面和逻辑处理全部用html,css,javascript去实现。我最早看到的相关应用是四五年前的新浪聊天室。我本人在后来的一些项目中也多次用到这种基于IE内核的实现方式。

随着HTML5的强大,嵌入浏览器方式比嵌入Shockwave Flash的方式更应该作为首选方案。本文介绍嵌入IE,Chrome,Firefox三种方式。

本文链接:http://www.hoverlees.com/blog/?p=1339

1.嵌入IE浏览器

嵌入IE内核应该是早期最常用的方法,使用windows平台上的ActiveX方式,将IWebBrowser2对象嵌入到窗口中,IWebBrowser2接口涉及到很多的接口,可以让我们进行事件处理、操作DOM、与JS通信,使用一个连接点接口与浏览器内部连接,获取和处理事件。

使用IE内核有一个缺点就是用户的操作系统各种各样,内核也是多个版本而且不兼容(只有IE9+才支持HTML5)。导致程序非常不稳定,再有就是不能跨平台。以至于现在嵌入IE应该是最差的方式了。

2.嵌入Firefox

Mozilla的XULRunner是一个跨平台的浏览器应用框架,被Mozilla用于Firefox和ThunderBird等软件的核心,同样是开源和支持HTML5,项目使用XPCOM方式实现,除了XPCOM对象(windows系统的在xpcom.dll中)的获取外,其它属性,对象和函数的访问均与MDN上Javascript的文档相同,可谓文档齐全。同样也有已经实现的第三方C++项目将基于XULRunner的浏览器封装成控件,非常方便使用。

MDN地址:https://developer.mozilla.org/en-US/docs/XULRunner

3.嵌入Chrome

Embedding Chrome:经过本人的研究,个人认为嵌入Chrome是最好的解决方案,Chrome本身开源,高效的v8引擎。同时也有很多附属的开源项目,libcef就是其中一个,cef是chrome embed framework的缩写,意在实现chrome嵌入应用程序,本人对这个项目下载下来后进行过测试,效果非常好,支持HTML5,同时跨平台。

项目地址:http://code.google.com/p/chromiumembedded/

下面是libcef调用的示例程序,给大家做参考。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

/**

* libcef test application.

* @author Hoverlees me[at]hoverlees.com

*/

#include

#include

#include "HoverWindow.h"

#include

#include

#include

class MyChromeClient:public CefClient{

private:

int refCount;

public:

MyChromeClient(){

refCount=1;

}

virtual int AddRef(){

refCount++;

return refCount;

}

virtual int Release(){

refCount--;

return refCount;

}

virtual int GetRefCt(){

return refCount;

}

};

class MyChromeApplication:public CefApp{

private:

int refCount;

public:

MyChromeApplication(){

refCount=1;

}

virtual int AddRef(){

refCount++;

return refCount;

}

virtual int Release(){

refCount--;

return refCount;

}

virtual int GetRefCt(){

return refCount;

}

};

class ChromeWindow:public HoverWindow{

private:

CefWindowInfo windowInfo;

MyChromeClient client;

CefRefPtr browser;

public:

ChromeWindow(HINSTANCE hInstance,const char* className,const char* title,

int x,int y,int w,int h,DWORD exStyle=NULL,DWORD windowStyle=WS_OVERLAPPEDWINDOW);

virtual bool onWindowMessage(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);

};

ChromeWindow::ChromeWindow(HINSTANCE hInstance,const char* className,const char* title,

int x,int y,int w,int h,DWORD exStyle,DWORD windowStyle)

:HoverWindow(hInstance,className,title,x,y,w,h,exStyle,windowStyle){

}

bool ChromeWindow::onWindowMessage(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam){

RECT rt;

switch(uMsg){

case WM_CREATE:

GetClientRect(hWnd,&rt);

windowInfo.SetAsChild(hWnd,rt);

this->browser=CefBrowserHost::CreateBrowserSync(windowInfo,&client,CefString("http://www.hoverlees.com"),CefBrowserSettings());

CefRunMessageLoop();

break;

case WM_SIZE:

GetClientRect(hWnd,&rt);

SetWindowPos(this->browser->GetHost()->GetWindowHandle(),0,rt.left,rt.top,rt.right,rt.bottom,0);

break;

case WM_CLOSE:

CefQuitMessageLoop();

PostQuitMessage(0);

break;

default:

return false;

}

return true;

}

int WINAPI WinMain(HINSTANCE hInst,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow){

MyChromeApplication app;

CefMainArgs main_args(hInst);

CefSettings settings;

settings.multi_threaded_message_loop = false;

int exit_code = CefExecuteProcess(main_args,&app);

if (exit_code >= 0)

return exit_code;

CefInitialize(main_args,settings,&app);

ChromeWindow* window=new ChromeWindow(hInst,"hover","Chrome Embedding -http://www.hoverlees.com",0,0,400,400);

window->startMessageLoop();

CefShutdown();

return 0;

}

其中CefClient包含一些虚函数可以获取一些对象以获取浏览器事件和设置浏览器相关功能,一般用Client类同时实现,然后返回this即可。如下示例.具体可以参考自带的类文档。

1

2

3

4

5

6

7

8

9

10

class MyChromeClient:public CefClient,public CefLoadHandler{

public:

virtual CefRefPtr< CefLoadHandler > GetLoadHandler(){

return this;

}

//CefLoadHandler的其中一个虚函数实现,当页面加载完成时执行此函数

virtual void OnLoadStart( CefRefPtr< CefBrowser > browser, CefRefPtr< CefFrame > frame ){

MessageBox(0,frame->GetURL().ToString().c_str(),0,0);

}

html 漂浮浏览器,HTML5浏览器嵌入窗口程序解决方案 | Hoverlees#39; Blog相关推荐

  1. 360浏览器怎么设置html5播放,360浏览器如何开启小窗口播放网页视频

    有时候使用浏览器的时候不会只做一件事,很多时候,网游和看视频是可以同时进行的,那么要如何将视频小窗口播放呢,今天小编就为大家分享一个方法,让用户在玩网游的同事还可以使用小窗口播放视频,在生活娱乐的时候 ...

  2. android用qq浏览器打开微信网页版,QQ浏览器怎么打开微信小程序?

    继微信.QQ 之后,QQ 浏览器上也可以使用小程序了. 现已实现与微信小程序打通.QQ 浏览器 Android 版现已上线小程序,在搜索的场景下,小程序嵌入 QQ 浏览器「搜索直达」,作为直接的内容承 ...

  3. Angular2项目中浏览器拦截弹出窗口的解决方法

    Angular2项目中浏览器拦截弹出窗口的解决方法 为什么把项目是Angular2的放到了前边? 因为正常也页面网上已经很多解决方案.请自行百度或Google. 现象:当window.open为用户触 ...

  4. 易语言易语言浏览器html5,易语言做浏览器的方法

    各位小朋友还在为电脑浏览记录被家长监视而发愁吗,有了它,再也不用担心啦. 1.新建一个Windows窗口程序 2.尽量把窗口拉大,越大越好.并放上一个超文本浏览框,按钮.如图 3.下面复制就可以了: ...

  5. 微信小程序开发——以简单易懂的浏览器页面栈理解小程序的页面路由

    前言: 对于小程序的页面路由,如果没有一定开发经验的话,理解起来还是会有些困难的.哪怕是有一定小程序开发经验的开发者,能够完全理解掌握的恐怕也不多. 这里就以另外一种方式来详细的介绍小程序的页面栈及路 ...

  6. 浏览器应用集成嵌入WPS指南

    因为该WPS插件使用NPAPI机制来和浏览器交互,故要求使用插件的浏览器必须支持NPAPI机制且必须开启NPAPI机制. 以下是支持的常见的浏览器及其版本: FireFox浏览器52及小于52的版本( ...

  7. 手机 html5评测,三款主流手机浏览器HTML5性能横向评测

    到目前为止带给大家更多的是一种神秘感,我们并未看到很多以HTML5为主的网站在我们生活中出现,正是因为这份神秘感让我们想对HTML5进行一次深入的探秘,去了解一下什么是HTML5,并且HTML5究竟应 ...

  8. 实现跨浏览器html5表单验证

    html5表单添加了很多类型的表单,而且还自带验证的功能.在移动端,手机等设备能够根据不同的input类型弹出不同的键盘,例如iphone弹的键盘 <input type="email ...

  9. Html5浏览器支持

    HTML5 浏览器支持 把 HTML5 元素定义为块级元素 语义块级displayblock实例 header, section, footer, aside, nav, main, article, ...

最新文章

  1. JVM(13)之 阶段回顾
  2. leetcode题目解答报告(1)
  3. Python脚本完美解决Linux环境解压.zip文件乱码问题
  4. Matalab类定义
  5. android存到手机内存,android保存文件到手机内存
  6. iPhone 7疯狂生产 苹果提升在印度存在感
  7. Java普通工程转换成标准的maven工程
  8. C Runtime Library来历, API, MFC, ATL关系
  9. 基于水平集方法和G0模型的SAR图像分割
  10. bzoj 3351 [ioi2009]Regions
  11. 结构等待队列[网络编程]select流程分析
  12. String s = new String(“abc“)创建了几个对象
  13. 如何向弱智程序员解释区块链
  14. teamview 局域网内使用
  15. go 连接服务器 并存放图片_[本站大事件] 又更换服务器了 – 小文's blog
  16. 腾讯鉴黄php源码,“箫剑”变成首席鉴黄师 朱宏嘉唐马儒个人资料
  17. Ubuntu 20.04修改ip地址
  18. 自动化爬虫selenium基础教程
  19. SQL-查询最后一条数据
  20. 抖音高贵气质的签名_这些抖音直播注意事项,不注意很可能被封号!

热门文章

  1. 什么显卡是个人计算机的基本配置和市场主流,现在()显卡已经成为了个人计算机的基本配置和市场主流。 - 问答库...
  2. 德语语法笔记——名词的变格
  3. Ubuntu+QT+SSL+MQTT
  4. 【元器件】电容选型指南
  5. 2022卡塔尔世界杯。CSDN世界杯勋章来啦
  6. ubuntu占用空间清理
  7. 无法访问yunlong.wj0920wjx.net指向的web服务器(或虚拟主机)的目录,请检查网络设置
  8. PNG 图片压缩原理解析
  9. java.io.IOException: 你的主机中的软件中止了一个已建立的连接。 (踩坑经历)
  10. 奇怪的报错(uncaught typeerror illegal invocation)