Uninstall Feedback in InnoSetup

If user is uninstalling your application, it is reasonable to ask him what he did not liked in the application. Usually developers open web browser for submission of feedback.

IMHO this is not a good practise — most users do not like applications opening web browser without their confirmation. I consider it is a lot better to implement sending of such kind of feedback using desktop's regular mail application, such as Outlook and Thunderbird.

For example, this is IndieVolume Uninstall Feedback window:

And, here is InnoSetup pascal code I have developed to implement above window:

function UninstallFeedback(): Boolean;
var
  Form: TSetupForm;
  FeedbackLabel0: TLabel;
  FeedbackLabel: TLabel;
  OKButton, CancelButton: TButton;
  FeedbackMemo: TMemo;
  Feedback: String;
  Url: String;
  ErrorCode: Integer;
begin   
  Result := false;
  Form := CreateCustomForm();
  try
    SetSystemFont(Form.Font); 
    Form.ClientWidth := ScaleX(350);
    Form.ClientHeight := ScaleY(10+23 +10+46 +10+23 +10+23+10 + 23);
    Form.Caption := 'IndieVolume Uninstall Feedback';
    Form.BorderIcons := [biSystemMenu];
    Form.BorderStyle := bsDialog;
    Form.Center;
    OKButton := TButton.Create(Form);
    OKButton.Parent := Form;
    OKButton.Width := ScaleX(75);
    OKButton.Height := ScaleY(23);
    OKButton.Left := Form.ClientWidth - ScaleX(75 + 6 + 75 + 20);
    OKButton.Top := Form.ClientHeight - ScaleY(23 + 10);
    OKButton.Caption := 'Send';
    OKButton.ModalResult := mrOk;
    OKButton.Default := true;
    CancelButton := TButton.Create(Form);
    CancelButton.Parent := Form;
    CancelButton.Width := ScaleX(75);
    CancelButton.Height := ScaleY(23);
    CancelButton.Left := Form.ClientWidth - ScaleX(75 + 20);
    CancelButton.Top := Form.ClientHeight - ScaleY(23 + 10);
    CancelButton.Caption := 'Cancel';
    CancelButton.ModalResult := mrCancel;
    CancelButton.Cancel := True;
    FeedbackMemo := TMemo.Create(Form);
    FeedbackMemo.Parent := Form;
    FeedbackMemo.Width := Form.ClientWidth - ScaleX(30 + 20);
    FeedbackMemo.Height := ScaleY(61);
    FeedbackMemo.Left := ScaleX(30);
    FeedbackMemo.Top := Form.ClientHeight - ScaleY(23 + 10 + 10) - FeedbackMemo.Height;
    FeedbackLabel0 := TLabel.Create(Form);
    FeedbackLabel0.Parent := Form;
    FeedbackLabel0.AutoSize := False;
    FeedbackLabel0.Left := ScaleX(30);
    FeedbackLabel0.Top := ScaleY(10);
    FeedbackLabel0.Width := Form.ClientWidth - ScaleX(30 + 20);
    FeedbackLabel0.Height := ScaleY(42);
    FeedbackLabel0.WordWrap := True;
    FeedbackLabel0.Caption := 'We regret you have uninstalled IndieVolume. ' +
        'To help us with future versions of IndieVolume, ' +
        'we want to know about any troubles or difficulties ' + 
        'you have experienced while using IndieVolume.'; 
    FeedbackLabel := TLabel.Create(Form);
    FeedbackLabel.Parent := Form;
    FeedbackLabel.Left := ScaleX(30);
    FeedbackLabel.Top := ScaleY(10+42+10);    
    FeedbackLabel.AutoSize := True;
    FeedbackLabel.Height := ScaleY(21);
    FeedbackLabel.Caption := 'Please let us know...';
    FeedbackLabel.FocusControl := FeedbackMemo;
    Form.ActiveControl := FeedbackMemo;
    if Form.ShowModal() = mrOk then
    begin
      Feedback := Trim(FeedbackMemo.Lines.Text);
      if Feedback <> '' then
      begin
        StringChange(Feedback, '&amp;', '%26');
        StringChange(Feedback, #13#10, '%0A');
        StringChange(Feedback, #13, '%0A');
        StringChange(Feedback, #10, '%0D');
        Url := 'mailto:support@gerixsoft.com?Subject=' +
            'IndieVolume%20Uninstall%20Feedback&amp;Body=' + Feedback;
        ShellExec('open', Url, '', '', SW_SHOW, ewNoWait, ErrorCode);
      end;
    end;
  finally
    Form.Free();
  end;
end;
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
var
  WindowNumber: HWND;
var
  RegDir: String;
begin
  if CurUninstallStep = usUninstall then
  begin
    UninstallFeedback();
  end;
end;