【发布时间】:2016-01-03 20:46:38
【问题描述】:
我需要在 Inno 设置向导中嵌入一个 WinForms 表单(带有BorderStyle = None)并遇到问题。
这是一个 Inno 设置脚本:
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));
}
}
它可以工作,但不如预期。安装程序加载后,它会自动从configurator.dll 调用EmbedConfiguratorForm,并且表单会显示但不会进入安装向导页面。它显示在后面(见截图)。
那我做错了什么?
【问题讨论】:
-
您的解决方案与重复问题中的相同,只是它们将父句柄传递给 DLL,而您从 DLL 传递子句柄。
-
当然。备注是 winforms 表单没有
Parent作为句柄 (pointer),而只有Form或Control。所以最简单的方法就是使用SetParentwinapi函数。我认为这将与您从 InnoSetup 或 DLL 调用SetParent的位置相同 -
可以使用
NativeWindow来包裹句柄,见stackoverflow.com/a/213751/850848 -
您是否尝试过自己使用这个(
NativeWindow)?对不起,但它不适用于我的问题
标签: c# winforms inno-setup