原文:Inno Setup 网页显示插件 webctrl

; -- Example.iss --
; restools
; http://restools.hanzify.org
; 插件名:webctrl.dll
; 插件功能:网络连接检测,创建网页页面。
; 插件大小:9 KB

; V2 增强操作函数,可以同时创建多达 256 个 Web 窗口。
; V2 例子中演示了建立一个小型浏览器以体现该版本中的函数如何使用。比起 V1 重点在于能同时创建多个 Web 窗口。

[Setup]
AppName=我的程序
AppVerName=我的程序 版本 1.5
DefaultDirName={pf}/我的程序

[Files]
Source: "webctrl.dll"; Flags: dontcopy
Source: "file.htm"; Flags: dontcopy
Source: "wizard.htm"; Flags: dontcopy
Source: "1.gif"; Flags: dontcopy
Source: "2.gif"; Flags: dontcopy
Source: "3.gif"; Flags: dontcopy

[code]
function GetSystemMetrics(nIndex: Integer): Integer; external 'GetSystemMetrics@user32.dll stdcall';
function GetWindowLong(Wnd: HWnd; Index: Integer): Longint; external 'GetWindowLongA@user32.dll stdcall';
function SetWindowLong(Wnd: HWnd; Index: Integer; NewLong: Longint): Longint; external 'SetWindowLongA@user32.dll stdcall';
////////////////////////////////////////////////////////////////////////////////////
// 检查网络连接是否正常
// lpszURL: 网址,如果这里设置为空网址,检测将会简单的检查网络状态,返回状态标志
// lpdwState: 状态标志,以下是标志值的解释
// 注意:当不用网址来检测网络连接时,只是检查当前是否符合网络连接的条件,但是并不等于
// 能正常连接 Internet,但是这种检测方式相当迅速,如果使用网址连接测试,如果网
// 络处于正常连接,检查速度也相当快,但是如果非正常,那么将会有一点时间延迟,因
// 为实际的连接测试有一个超时的限制来判断是否能够连接。但是这种检测方式是最直接
// 的,并能确实知道是否能够连接网络,所以你按照实际要求来选择检测方式。
//
//得到的 lpdwState 返回值可能是以下值的一个或几个值之和:
// INTERNET_STATE_CONNECTED :$00000001 连接状态;
// INTERNET_STATE_DISCONNECTED :$00000002 非连接状态(和 INTERNET_STATE_CONNECTED 对应);
// INTERNET_STATE_DISCONNECTED_BY_USER:$00000010 用户请求的非连接状态
// INTERNET_STATE_IDLE :$00000100 连接状态,并且空闲
// INTERNET_STATE_BUSY :$00000200 连接状态,正在响应连接请求
function CheckConnectState(lpsURL: PChar; var lpdwState: dword): boolean; external 'checkconnectstate@files:webctrl.dll stdcall';

// 初始化 WebCtrl 插件
function InitWebCtrl(): Boolean; external 'initwebctrl@files:webctrl.dll stdcall';

// 释放 WebCtrl 插件
function UninitWebCtrl(): Boolean; external 'uninitwebctrl@files:webctrl.dll stdcall';

// 创建 WEB 窗口
function NewWebWnd(hWndParent: HWND; X, Y, nWidth, nHeight: Integer): HWND; external 'newwebwnd@files:webctrl.dll stdcall';

// 释放 WEB 窗口
function FreeWebWnd(hWndWeb: HWND): Boolean; external 'freewebwnd@files:webctrl.dll stdcall';

// 设置 WEB 窗口的父窗口
function WebWndSetParent(hWndWeb: HWND; hWndParent: HWND): Boolean; external 'webwndsetparent@files:webctrl.dll stdcall';

// 设置 WEB 窗口的位置大小
function WebWndSetBounds(hWndWeb: HWND; X, Y, nWidth, nHeight: Integer): Boolean; external 'webwndsetbounds@files:webctrl.dll stdcall';

// 显示 HTML 网页
function DisplayHTMLPage(hWndWeb: HWND; lpsURL: PChar): Boolean; external 'displayhtmlpage@files:webctrl.dll stdcall'; // ;

// 显示 HTML 字符串
function DisplayHTMLStr(hWndWeb: HWND; lpsHtmlText: PChar): Boolean; external 'displayhtmlstr@files:webctrl.dll stdcall';

// Web 页面 动作
function WebPageAction(hWndWeb: HWND; action: DWord): Boolean; external 'webpageaction@files:webctrl.dll stdcall';

const
SM_CXSCREEN = 0;
SM_CYSCREEN = 1;

WS_EX_CLIENTEDGE = $200;
GWL_EXSTYLE = -20;

WEBPAGE_GOBACK = 0;
WEBPAGE_GOFORWARD = 1;
WEBPAGE_GOHOME = 2;
WEBPAGE_SEARCH = 3;
WEBPAGE_REFRESH = 4;
WEBPAGE_STOP = 5;
var
UrlPage, HtmlPage, HtmlTextPage: TWizardPage;
WebHWND1, WebHWND2, WebHWND3, WebHWND4: HWND;
WebHWND_Browser: HWND;
Form_Browser: TForm;
AddrEdit: TNewEdit;
GoBtn: TNewButton;

function InitializeSetup(): Boolean;
begin
InitWebCtrl();
WebHWND1 := 0;
WebHWND2 := 0;
WebHWND3 := 0;
WebHWND4 := 0;
Result := True;
end;

procedure DeinitializeSetup();
begin
UninitWebCtrl();
end;

procedure GoBackBtnOnClick(Sender: TObject);
begin
WebPageAction(WebHWND_Browser, WEBPAGE_GOBACK);
end;

procedure GoForwardBtnOnClick(Sender: TObject);
begin
WebPageAction(WebHWND_Browser, WEBPAGE_GOFORWARD);
end;

procedure StopBtnOnClick(Sender: TObject);
begin
WebPageAction(WebHWND_Browser, WEBPAGE_STOP);
end;

procedure RefreshBtnOnClick(Sender: TObject);
begin
WebPageAction(WebHWND_Browser, WEBPAGE_REFRESH);
end;

procedure HomeBtnOnClick(Sender: TObject);
begin
WebPageAction(WebHWND_Browser, WEBPAGE_GOHOME);
end;

procedure GoBtnOnClick(Sender: TObject);
begin
DisplayHTMLPage(WebHWND_Browser, AddrEdit.Text);
end;

procedure BrowserFormResize(Sender: TObject);
var
W: Integer;
begin
WebWndSetBounds(WebHWND_Browser, 0, ScaleY(35), Form_Browser.ClientWidth,
Form_Browser.ClientHeight - ScaleY(35));
W := Form_Browser.Width - ScaleX(285);
if W <= 0 then W := 1;
AddrEdit.Width := W;
GoBtn.SetBounds(AddrEdit.Left + AddrEdit.Width + ScaleX(2), ScaleY(5), ScaleX(30),
WizardForm.CancelButton.Height);
end;

procedure EditKeyPress(Sender: TObject; var Key: Char);
begin
if Key = #13 then
DisplayHTMLPage(WebHWND_Browser, AddrEdit.Text);
end;

procedure WizardBtnOnClick(Sender: TObject);
var
ScreenWidth, ScreenHeight: Integer;
Btn: TNewButton;
begin
Form_Browser := TForm.Create(WizardForm);
try
Form_Browser.Caption := 'ThinBrowser';
Form_Browser.BorderIcons := [biSystemMenu, biMaximize];
ScreenWidth := GetSystemMetrics(SM_CXSCREEN);
ScreenHeight := GetSystemMetrics(SM_CYSCREEN);
Form_Browser.SetBounds((ScreenWidth - ScaleX(600)) div 2, (ScreenHeight - ScaleY(400)) div 2,
ScaleX(600), ScaleY(400));
WebHWND_Browser := NewWebWnd(Form_Browser.Handle, 0, 0, Form_Browser.ClientWidth,
Form_Browser.ClientHeight);
SetWindowLong(Form_Browser.Handle, GWL_EXSTYLE, GetWindowLong(
WebHWND_Browser, GWL_EXSTYLE) or WS_EX_CLIENTEDGE);

Btn := TNewButton.Create(Form_Browser);
Btn.SetBounds(ScaleX(5), ScaleY(5), ScaleX(40), WizardForm.CancelButton.Height);
Btn.Caption := '&Back';
Btn.OnClick := @GoBackBtnOnClick;
Btn.Parent := Form_Browser;

Btn := TNewButton.Create(Form_Browser);
Btn.SetBounds(ScaleX(47), ScaleY(5), ScaleX(55), WizardForm.CancelButton.Height);
Btn.Caption := '&Forward';
Btn.OnClick := @GoForwardBtnOnClick;
Btn.Parent := Form_Browser;

Btn := TNewButton.Create(Form_Browser);
Btn.SetBounds(ScaleX(104), ScaleY(5), ScaleX(40), WizardForm.CancelButton.Height);
Btn.Caption := '&Stop';
Btn.OnClick := @StopBtnOnClick;
Btn.Parent := Form_Browser;

Btn := TNewButton.Create(Form_Browser);
Btn.SetBounds(ScaleX(146), ScaleY(5), ScaleX(50), WizardForm.CancelButton.Height);
Btn.Caption := '&Refresh';
Btn.OnClick := @RefreshBtnOnClick;
Btn.Parent := Form_Browser;

Btn := TNewButton.Create(Form_Browser);
Btn.SetBounds(ScaleX(198), ScaleY(5), ScaleX(40), WizardForm.CancelButton.Height);
Btn.Caption := '&Home';
Btn.OnClick := @HomeBtnOnClick;
Btn.Parent := Form_Browser;

AddrEdit := TNewEdit.Create(Form_Browser);
AddrEdit.Left := ScaleX(240);
AddrEdit.Top := ScaleY(6);
AddrEdit.Parent := Form_Browser;
AddrEdit.Text := 'about:blank';
AddrEdit.OnKeyPress := @EditKeyPress;

GoBtn := TNewButton.Create(Form_Browser);
GoBtn.Caption := '&Go';
GoBtn.OnClick := @GoBtnOnClick;
GoBtn.Parent := Form_Browser;

BrowserFormResize(Form_Browser);
Form_Browser.OnResize := @BrowserFormResize;
Form_Browser.ActiveControl := AddrEdit;
Form_Browser.ShowModal();
FreeWebWnd(WebHWND_Browser);
finally
Form_Browser.Free();
end;
end;

procedure InitializeWizard();
var
State: DWord;
s: string;
BrowserBtn: TNewButton;
begin
State := 0;
s := '';
// 如果需要进行网址连接测试,取消下面代码的注释
// s := 'http://www.google.cn';

if CheckConnectState(s, State) then
MsgBox('网络已经连接。', mbInformation, MB_OK)
else
MsgBox('网络未连接。', mbCriticalError, MB_OK);
MsgBox(inttostr(State), mbInformation, MB_OK);

ExtractTemporaryFile('wizard.htm');
ExtractTemporaryFile('file.htm');
ExtractTemporaryFile('1.gif');
ExtractTemporaryFile('2.gif');
ExtractTemporaryFile('3.gif');

WebHWND1 := NewWebWnd(WizardForm.WelcomePage.Handle, 0, 0, WizardForm.WizardBitmapImage.Width, WizardForm.WelcomePage.Height);
DisplayHTMLPage(WebHWND1, ExpandConstant('{tmp}/wizard.htm'));

UrlPage := CreateCustomPage(wpWelcome, '测试 Web 页面', '网址: http://www.google.cn');

HtmlPage := CreateCustomPage(UrlPage.ID, '测试 HTML文件 页面', '文件: file.htm');

HtmlTextPage := CreateCustomPage(HtmlPage.ID, '测试 HTML文本 页面', '临时自定义 HTML 字符串');

BrowserBtn := TNewButton.Create(WizardForm);
BrowserBtn.Left := WizardForm.ClientWidth - WizardForm.CancelButton.Left - WizardForm.CancelButton.Width;
BrowserBtn.Top := WizardForm.CancelButton.Top;
BrowserBtn.Width := WizardForm.CancelButton.Width;
BrowserBtn.Height := WizardForm.CancelButton.Height;
BrowserBtn.Caption := '&Browser...';
BrowserBtn.OnClick := @WizardBtnOnClick;
BrowserBtn.Parent := WizardForm;
end;

procedure CurPageChanged(CurPageID: Integer);
begin
if CurPageID = wpWelcome then
WebWndSetParent(WebHWND1, WizardForm.WelcomePage.Handle)
else
if CurPageID = wpFinished then
WebWndSetParent(WebHWND1, WizardForm.FinishedPage.Handle)
else
if (CurPageID = UrlPage.ID) and (WebHWND2 = 0) then
begin
WebHWND2 := NewWebWnd(UrlPage.Surface.Handle, 0, 0, UrlPage.Surface.Width, UrlPage.Surface.Height);
DisplayHTMLPage(WebHWND2, 'http://www.google.cn')
end else
if (CurPageID = HtmlPage.ID) and (WebHWND3 = 0) then
begin
WebHWND3 := NewWebWnd(HtmlPage.Surface.Handle, 0, 0, HtmlPage.Surface.Width, HtmlPage.Surface.Height);
DisplayHTMLPage(WebHWND3, ExpandConstant('{tmp}/file.htm'));
end
else
if (CurPageID = HtmlTextPage.ID) and (WebHWND4 = 0) then
begin
WebHWND4 := NewWebWnd(HtmlTextPage.Surface.Handle, 0, 0, HtmlTextPage.Surface.Width, HtmlTextPage.Surface.Height);
DisplayHTMLStr(WebHWND4, '<b>I''m a <u>HTML text</u></b>');
end;
end;

附图:


下载webctrl

Inno Setup 网页显示插件 webctrl的更多相关文章

  1. Inno Setup 网页显示插件 webctrl (V2.1 版本)

    原文 http://restools.hanzify.org/article.asp?id=90 Inno Setup网页显示插件 webctrl能够显示所有 IE 中能够显示的东西.  引用内容 ; ...

  2. Inno Setup 精灵显示插件 InnoFairy (V2.0 版本)

    原文 http://restools.hanzify.org/article.asp?id=111 一个如影随形的小精灵会令到你的安装程序更加人性化. 就是这样一个功能的Inno Setup插件, 希 ...

  3. Inno Setup GIF 显示插件 GIFCtrl (V2.1 版本)

    原文 http://restools.hanzify.org/article.asp?id=79  引用来自 test.iss ; -- test.iss --; restools; http://r ...

  4. Inno Setup 系统托盘图标插件 TrayIconCtrl V1.5

    原文 http://restools.hanzify.org/article.asp?id=93 V1.5 修正在某些 Windows 平台上(例如 Windows XP SP3)不能正常运行的问题. ...

  5. Inno setup定制安装界面

    Innosetup功能很强大,可以通过它提供的Wizard接口来定制界面,但我对PASCAL语言不熟悉,也不清楚通过那种接口可改动的范围有多大,最后做出来的效果是否好,所以选择了通过一个DLL来实现我 ...

  6. Inno Setup 插件大全

    Inno Setup 插件大全     这是我收集到的目前网上最全的插件之一,里面的每个插件,都有详细的脚本示例来讲解该插件的具体用法.另外,下载了我公开的脚本的朋友,也有可能会被提示缺少文件,如果缺 ...

  7. 解决Inno Setup制作中文安装包在非中文系统上显示乱码的问题

    尼玛,好几个月没更新了.囧... 目前我司新的客户端开发已经接近尾声,该改的bug已经改完,该重构的地方也都差不多了.视觉效果也已经根据美工的样式改完了.所以,就差制作安装包了.正所谓万事俱备,只欠东 ...

  8. Inno Setup 插件 CallbackCtrl V1.1 (回调函数插件)

    原文 http://restools.hanzify.org/article.asp?id=101 VC 重现 InnoCallback 的功能. Version 1.1修正在某些 Windows 平 ...

  9. Inno Setup入门(九)——修改安装过程中的文字显示

    前面说到过可以使用不用的语言文件实现不同的显示方式,方便与国际接轨,事实上即使没有语言文件也可以实现修改.[Messages]段用于定义安装程序和卸载程序中显示的消息.一般不需要创建 [Message ...

随机推荐

  1. Hadoop加zookeeper构建高可靠集群

    事前准备 1.更改Linux主机名,每个人都有配置 vim /etc/sysconfig/network NETWORKING=yes HOSTNAME=hadoop-server1 2.改动IP / ...

  2. 菜鸟nginx源码剖析 框架篇(一) 从main函数看nginx启动流程(转)

    俗话说的好,牵牛要牵牛鼻子 驾车顶牛,处理复杂的东西,只要抓住重点,才能理清脉络,不至于深陷其中,不能自拔.对复杂的nginx而言,main函数就是“牛之鼻”,只要能理清main函数,就一定能理解其中 ...

  3. (大数据工程师学习路径)第三步 Git Community Book----Git基本用法(上)

    一.git的初始化 1.Git 配置 使用Git的第一件事就是设置你的名字和email,这些就是你在提交commit时的签名. $ git config --global user.name &quo ...

  4. zoj 3659 并检查集合

    http://acm.zju.edu.cn/onlinejudge/showProblem.do? problemId=4882 现在在牡丹江,明天regional直播比赛,我会在一个月内退休.求祝福 ...

  5. osx launchpad删除图标

    安装了个parallels desktop之后,OSX中的launchpad中的图标多了不少,但是好多都不是我自己想要的,我们该怎么删除或者改动呢,以下介绍一些方法: ①直接操作Appications ...

  6. hdu 3068 最长回文(manachar模板)

    Problem Description 给出一个只由小写英文字符a,b,c...y,z组成的字符串S,求S中最长回文串的长度.回文就是正反读都是一样的字符串,如aba, abba等   Input 输 ...

  7. HDU Group

    Group 题目: 给出n个数,是1-n的排列.要求你每次给你一个区间求出这个区间能够被分成的小区间个数. 一个不连续的数能够被分成一个小区间.t-1,t或t,t+1表示连续. 算法: 高速做法应该是 ...

  8. 国外android开源站点

    http://android-arsenal.com/

  9. eclipse 组态xdebug

    1.打开浏览器打开phpinfo页面视图PHP版本号.TS(线程安全)版本NTS(非线程安全)版本.以及VC6版本号是VC9版本号 2.和上面版本号相应的xdebug:http://xdebug.or ...

  10. ocp11g培训内部教材_051课堂笔记(047)_SQL

    OCP 051课堂笔记 目录 OCP 051课堂笔记... 1 第一章.Oracle命令类别:... 4 第二章.SQL的基本函数... 4 2.1 单行函数与多行函数... 4 2.2 单行函数的几 ...