将WinForms表单嵌入到Inno Setup向导中

阿列克谢·库里科夫(Alexey Kulikov)

我需要将WinForms表单(带有BorderStyle = None)嵌入到Inno Setup Wizard中,并出现问题。

这是一个Inno Setup脚本:

procedure EmbedConfiguratorForm(parentWnd: HWND);
  external 'EmbedConfiguratorForm@files:configurator.dll stdcall';

procedure InitializeWizard();
var
  cfgPageHandle: HWND;
begin
  cfgPageHandle := CreateCustomPage(wpSelectDir, 
    'Configuration', 
    ExpandConstant(description)).Surface.Handle;
  EmbedConfiguratorForm(cfgPageHandle);
end;

这是一个C#代码:

class WizardWindow : IWin32Window
{
    public WizardWindow(IntPtr handle)
    {
        Handle = handle;
    }

    public WizardWindow(int handle) : this(new IntPtr(handle))
    {
    }

    public IntPtr Handle { get; private set; }
}

public static class MainClass
{
    [DllExport("EmbedConfiguratorForm", CallingConvention.StdCall)]
    public static void EmbedConfiguratorForm(int parentWnd)
    {
        // System.Diagnostics.Debugger.Launch();
        ConfiguratorForm form = new ConfiguratorForm();
        form.Show(new WizardWindow(parentWnd));
    }
}

它有效,但未达到预期效果。安装程序加载后,它会自动EmbedConfiguratorForm调用configurator.dll并显示表单,但不会进入安装向导页面。它显示在后面(请参见屏幕截图)。那我在做什么错?

在此处输入图片说明

阿列克谢·库里科夫(Alexey Kulikov)

解决了。

解决方案是从DLL返回新窗口(窗体)的句柄,并使用user32.SetParentWinAPI函数强制将窗体嵌入到向导中。这里是一段代码。

C#:

namespace configurator
{
    class WizardWindow : IWin32Window
    {
        public WizardWindow(IntPtr handle)
        {
            Handle = handle;
        }

        public WizardWindow(int handle) : this(new IntPtr(handle))
        {
        }

        public IntPtr Handle { get; private set; }
    }

    public static class MainClass
    {
        private static ConfiguratorForm _configuratorForm;

        [DllExport("EmbedConfiguratorForm", CallingConvention.StdCall)]
        public static IntPtr EmbedConfiguratorForm(int parentWnd)
        {
            _configuratorForm = new ConfiguratorForm();
            _configuratorForm.Show(new WizardWindow(parentWnd));
            return _configuratorForm.Handle;

        }

        [DllExport("CloseConfiguratorForm", CallingConvention.StdCall)]
        public static void CloseConfiguratorForm()
        {
            if (_configuratorForm != null)
            {
                _configuratorForm.Close();
                _configuratorForm.Dispose();
                _configuratorForm = null;
            }
        }
    }
}

Inno Setup脚本:

[Code]
const
  description = 'my page description';

var
  configFile: string;
  configuratorPage: TWizardPage;

function EmbedConfiguratorForm(parentWnd: HWND): HWND;
external 'EmbedConfiguratorForm@files:configurator.dll stdcall';

procedure CloseConfiguratorForm();
external 'CloseConfiguratorForm@files:configurator.dll stdcall';

function SetParent(hWndChild, hWndNewParent: HWND): HWND;
external '[email protected] stdcall';

procedure InitializeWizard();
begin
  configuratorPage := CreateCustomPage(wpSelectDir, 
    'Title', 'Description');
end;

procedure ShowConfigurationStep();
var
  cfgPageHandle: HWND;
  cfgWinHandle: HWND;
begin
  cfgPageHandle := configuratorPage.Surface.Handle;
  cfgWinHandle := EmbedConfiguratorForm(cfgPageHandle);
  SetParent(cfgWinHandle, cfgPageHandle);
end;

procedure CurPageChanged(CurPageId: Integer);
begin
  if (CurPageId = configuratorPage.ID) then
  begin
    ShowConfigurationStep();
  end else
  begin
    CloseConfiguratorForm(); // here we can make some optimization like checking previos page
  end;
end;

procedure DeinitializeSetup();
begin
  CloseConfiguratorForm();
end;

关于C#DLL的注意事项:
它使用UnmanagedExportsNuGet数据包(包含DLLExportAttribute)。

关于Inno Setup脚本的注意事项:
InitializeWizard函数中,我们只需要创建新页面,但是需要实现DLL调用CurPageChanged以确保立即打开我们的页面。


经过一些研究工作,我创建了一个小示例项目来说明.Net和InnoSetup的双向集成

https://github.com/sharpcoder7/innoGlue.net

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Inno Setup的自定义页面向导

来自分类Dev

如何在没有提示的情况下正确关闭Inno Setup向导?

来自分类Dev

如何将DLL中的表单嵌入到Inno Setup向导页面中?

来自分类Dev

将WinForms项目集成到WPF中

来自分类Dev

Inno Setup“安装完成”向导页面

来自分类Dev

Inno Setup禁用安装向导页面

来自分类Dev

Inno Setup删除/隐藏(而不只是禁用)向导页面上的“后退”按钮

来自分类Dev

Inno Setup中的TTreeView

来自分类Dev

无法将文件表单嵌入到Symfony 2.8中的另一个表单

来自分类Dev

将控件嵌入WinForms中的工具提示中

来自分类Dev

将Inno Setup exec函数中的命令传递到pgsql数据库

来自分类Dev

将VBA嵌入到工作表中以根据单元格的值显示/隐藏表单控件

来自分类Dev

在Inno Setup中跳过准备安装向导页面

来自分类Dev

在Inno Setup中,如何在向导窗口的左下方添加图像横幅?

来自分类Dev

Inno Setup:如果程序文件夹中存在文件,则关闭安装程序向导

来自分类Dev

SendGrid:使用SendGrid时如何将嵌入表单放置到HTML模板邮件中

来自分类Dev

将两种表单中的数据插入(保存)到数据库WinForms SQL DB中

来自分类Dev

Inno Setup-如何在调整大小的向导中居中放置动画gif

来自分类Dev

有条件地跳到Inno Setup安装向导末尾的自定义页面而不安装吗?

来自分类Dev

Inno Setup的自定义页面向导

来自分类Dev

将错误绑定到symfony2控制器中的嵌入式表单字段

来自分类Dev

使用向导将实体保存到核心数据中

来自分类Dev

Inno Setup“安装完成”向导页面

来自分类Dev

Inno Setup禁用安装向导页面

来自分类Dev

在不使用全局变量的情况下从自定义Inno Setup向导页面读取值

来自分类Dev

将VBA嵌入到工作表中以根据单元格的值显示/隐藏表单控件

来自分类Dev

Inno Setup安装程序向导的“完成/完成”页面左侧的高图像控件的名称是什么?

来自分类Dev

用户输入后 Inno Setup 向导更改页面

来自分类Dev

在向导表单中访问前面的步骤,Django

Related 相关文章

  1. 1

    Inno Setup的自定义页面向导

  2. 2

    如何在没有提示的情况下正确关闭Inno Setup向导?

  3. 3

    如何将DLL中的表单嵌入到Inno Setup向导页面中?

  4. 4

    将WinForms项目集成到WPF中

  5. 5

    Inno Setup“安装完成”向导页面

  6. 6

    Inno Setup禁用安装向导页面

  7. 7

    Inno Setup删除/隐藏(而不只是禁用)向导页面上的“后退”按钮

  8. 8

    Inno Setup中的TTreeView

  9. 9

    无法将文件表单嵌入到Symfony 2.8中的另一个表单

  10. 10

    将控件嵌入WinForms中的工具提示中

  11. 11

    将Inno Setup exec函数中的命令传递到pgsql数据库

  12. 12

    将VBA嵌入到工作表中以根据单元格的值显示/隐藏表单控件

  13. 13

    在Inno Setup中跳过准备安装向导页面

  14. 14

    在Inno Setup中,如何在向导窗口的左下方添加图像横幅?

  15. 15

    Inno Setup:如果程序文件夹中存在文件,则关闭安装程序向导

  16. 16

    SendGrid:使用SendGrid时如何将嵌入表单放置到HTML模板邮件中

  17. 17

    将两种表单中的数据插入(保存)到数据库WinForms SQL DB中

  18. 18

    Inno Setup-如何在调整大小的向导中居中放置动画gif

  19. 19

    有条件地跳到Inno Setup安装向导末尾的自定义页面而不安装吗?

  20. 20

    Inno Setup的自定义页面向导

  21. 21

    将错误绑定到symfony2控制器中的嵌入式表单字段

  22. 22

    使用向导将实体保存到核心数据中

  23. 23

    Inno Setup“安装完成”向导页面

  24. 24

    Inno Setup禁用安装向导页面

  25. 25

    在不使用全局变量的情况下从自定义Inno Setup向导页面读取值

  26. 26

    将VBA嵌入到工作表中以根据单元格的值显示/隐藏表单控件

  27. 27

    Inno Setup安装程序向导的“完成/完成”页面左侧的高图像控件的名称是什么?

  28. 28

    用户输入后 Inno Setup 向导更改页面

  29. 29

    在向导表单中访问前面的步骤,Django

热门标签

归档