Inno 设置带有 Google 地图的自定义页面
Inno Setup Custom Page with Google Map
我目前正在使用 Inno Setup 创建安装程序,这需要 google 地图。对于地图,我使用的是 TLama 的 inno-web-browser。
所以我有一个显示 google 地图的自定义 InputQueryPage。连同 2 个纬度和经度输入框,当用户单击地图时,它会在信息 window 中显示坐标。
是否可以解析坐标,以便可以使用 lat 和 long 从地图中填充上面的 2 个输入框?
然后可以将上面的内容以浮点格式写入注册表。
但这是另一个问题..
感谢您对此的任何回复..
您的要求需要特定的 JavaScript 互操作,这不容易实现。因此,我建议您在 JavaScript 中制作这些编辑框,您将在其中与 Google 地图 API 互操作,并在您使用浏览器离开页面后读取这些值。我已经通过插件的新 WebBrowserGetOleObject
函数添加了对 OleObject
的访问。
这里是一个带有 2 个输入框的示例 JavaScript(您将从脚本中的 Google 地图 API 同步)。这个脚本在下面的例子中是用固定文件名引用的(实际上是改成从安装包中提取出来的临时文件):
<!DOCTYPE html>
<html>
<body>
<input id="latinput" type="text">
<input id="loninput" type="text">
</body>
</html>
在 Inno Setup 中,您可以通过以下方式从这些输入框中读取值:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Files]
Source:"WebBrowser.dll"; Flags: dontcopy
[Code]
const
EVENT_BEFORE_NAVIGATE = 1;
EVENT_FRAME_COMPLETE = 2;
EVENT_DOCUMENT_COMPLETE = 3;
type
TWebBrowserEventProc = procedure(EventCode: Integer; URL: WideString);
procedure WebBrowserCreate(ParentWnd: HWND; Left, Top, Width, Height: Integer;
CallbackProc: TWebBrowserEventProc);
external 'WebBrowserCreate@files:webbrowser.dll stdcall';
procedure WebBrowserDestroy;
external 'WebBrowserDestroy@files:webbrowser.dll stdcall';
procedure WebBrowserShow(Visible: Boolean);
external 'WebBrowserShow@files:webbrowser.dll stdcall';
procedure WebBrowserNavigate(URL: WideString);
external 'WebBrowserNavigate@files:webbrowser.dll stdcall';
function WebBrowserGetOleObject: Variant;
external 'WebBrowserGetOleObject@files:webbrowser.dll stdcall';
var
CustomPage: TWizardPage;
procedure InitializeWizard;
begin
CustomPage := CreateCustomPage(wpWelcome, 'Web Browser Page',
'This page contains web browser');
WebBrowserCreate(WizardForm.InnerPage.Handle, 0, WizardForm.Bevel1.Top,
WizardForm.InnerPage.ClientWidth, WizardForm.InnerPage.ClientHeight - WizardForm.Bevel1.Top, nil);
WebBrowserNavigate('C:\AboveScript.html');
end;
procedure DeinitializeSetup;
begin
WebBrowserDestroy;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
WebBrowserShow(CurPageID = CustomPage.ID);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
Latitude: Variant;
Longitude: Variant;
OleObject: Variant;
begin
Result := True;
if CurPageID = CustomPage.ID then
begin
OleObject := WebBrowserGetOleObject;
if not VarIsNull(OleObject) then
begin
Latitude := OleObject.Document.GetElementByID('latinput').value;
Longitude := OleObject.Document.GetElementByID('loninput').value;
MsgBox(Format('Lat: %s, Lon: %s', [Latitude, Longitude]), mbInformation, MB_OK);
end;
end;
end;
我目前正在使用 Inno Setup 创建安装程序,这需要 google 地图。对于地图,我使用的是 TLama 的 inno-web-browser。
所以我有一个显示 google 地图的自定义 InputQueryPage。连同 2 个纬度和经度输入框,当用户单击地图时,它会在信息 window 中显示坐标。 是否可以解析坐标,以便可以使用 lat 和 long 从地图中填充上面的 2 个输入框? 然后可以将上面的内容以浮点格式写入注册表。 但这是另一个问题..
感谢您对此的任何回复..
您的要求需要特定的 JavaScript 互操作,这不容易实现。因此,我建议您在 JavaScript 中制作这些编辑框,您将在其中与 Google 地图 API 互操作,并在您使用浏览器离开页面后读取这些值。我已经通过插件的新 WebBrowserGetOleObject
函数添加了对 OleObject
的访问。
这里是一个带有 2 个输入框的示例 JavaScript(您将从脚本中的 Google 地图 API 同步)。这个脚本在下面的例子中是用固定文件名引用的(实际上是改成从安装包中提取出来的临时文件):
<!DOCTYPE html>
<html>
<body>
<input id="latinput" type="text">
<input id="loninput" type="text">
</body>
</html>
在 Inno Setup 中,您可以通过以下方式从这些输入框中读取值:
[Setup]
AppName=My Program
AppVersion=1.5
DefaultDirName={pf}\My Program
[Files]
Source:"WebBrowser.dll"; Flags: dontcopy
[Code]
const
EVENT_BEFORE_NAVIGATE = 1;
EVENT_FRAME_COMPLETE = 2;
EVENT_DOCUMENT_COMPLETE = 3;
type
TWebBrowserEventProc = procedure(EventCode: Integer; URL: WideString);
procedure WebBrowserCreate(ParentWnd: HWND; Left, Top, Width, Height: Integer;
CallbackProc: TWebBrowserEventProc);
external 'WebBrowserCreate@files:webbrowser.dll stdcall';
procedure WebBrowserDestroy;
external 'WebBrowserDestroy@files:webbrowser.dll stdcall';
procedure WebBrowserShow(Visible: Boolean);
external 'WebBrowserShow@files:webbrowser.dll stdcall';
procedure WebBrowserNavigate(URL: WideString);
external 'WebBrowserNavigate@files:webbrowser.dll stdcall';
function WebBrowserGetOleObject: Variant;
external 'WebBrowserGetOleObject@files:webbrowser.dll stdcall';
var
CustomPage: TWizardPage;
procedure InitializeWizard;
begin
CustomPage := CreateCustomPage(wpWelcome, 'Web Browser Page',
'This page contains web browser');
WebBrowserCreate(WizardForm.InnerPage.Handle, 0, WizardForm.Bevel1.Top,
WizardForm.InnerPage.ClientWidth, WizardForm.InnerPage.ClientHeight - WizardForm.Bevel1.Top, nil);
WebBrowserNavigate('C:\AboveScript.html');
end;
procedure DeinitializeSetup;
begin
WebBrowserDestroy;
end;
procedure CurPageChanged(CurPageID: Integer);
begin
WebBrowserShow(CurPageID = CustomPage.ID);
end;
function NextButtonClick(CurPageID: Integer): Boolean;
var
Latitude: Variant;
Longitude: Variant;
OleObject: Variant;
begin
Result := True;
if CurPageID = CustomPage.ID then
begin
OleObject := WebBrowserGetOleObject;
if not VarIsNull(OleObject) then
begin
Latitude := OleObject.Document.GetElementByID('latinput').value;
Longitude := OleObject.Document.GetElementByID('loninput').value;
MsgBox(Format('Lat: %s, Lon: %s', [Latitude, Longitude]), mbInformation, MB_OK);
end;
end;
end;