を指しているTLamaでprogress bar messages
、問題を解決できました。
最初に、進行状況バーのハンドルを Inno から C# アプリに渡す必要がありました。このために、int ポインターを文字列として返す関数を作成しました。
function GetProgressHandle(Param: String): String;
begin
Result := Format('%d',[WizardForm.ProgressGauge.Handle]);
end;
アプリを呼び出すときに Run セクションで使用します。
[Run]
Filename: "{app}\myApp.exe"; Parameters: "{code:GetProgressHandle}"; ....
C# では、コンソール引数から int ポインターを読み取り、それを使用してIntPtr
:
IntPtr pointer = new IntPtr(Int32.Parse(args[0]));
メッセージをプログレス バーに送信するために、user32.dll をインポートし、通常は commctrl.h にある必要な定数を再定義しました。
[DllImport("user32.dll")]
public static extern IntPtr PostMessage(IntPtr hWnd, uint Msg, IntPtr wParam, IntPtr lParam);
public const uint PBM_SETRANGE = 0x401;
public const uint PBM_SETPOS = 0x402;
最後に、プログレス バーの範囲を 0 から最大まで設定し、特定の位置posを
PostMessage(pointer, PBM_SETRANGE, (IntPtr)0, (IntPtr)(max << 16));
PostMessage(pointer, PBM_SETPOS, (IntPtr)pos, (IntPtr)0);
注: プログレス バーの位置を変更しても、Inno セットアップ ウィンドウがすぐに更新されないようです。500ミリ秒ごとに位置を増やしてテストしましたが、顕著な違いがありました(一時停止は約0.2〜0.8ミリ秒の範囲でした)。私の場合、プログレス バーの変更が正確なタイミングで行われることは重要ではありませんが、これが必要な人のために、Inno Setup ウィンドウを同様の方法で (特定のハンドルと異なるメッセージ定数を使用して) 更新できると想定しています。