在Inno设置中播放视频/幻灯片时隐藏鼠标指针/光标



我创建了一个Inno Setup脚本,根据我选择播放的内容在程序安装期间播放幻灯片或视频。

当我在播放幻灯片/视频时将鼠标放到正在播放的区域时,一个光标(crArrow)出现在视频/幻灯片上。

我想防止鼠标光标在播放视频/幻灯片时显示在视频/幻灯片上。

当使用crNone属性处理窗体窗口(BackgroundForm)时,光标只从它隐藏,而不是从幻灯片/视频隐藏。有没有办法让我把光标从幻灯片/视频中隐藏起来?我怎样才能申请crNone呢?我指的是SlideShow.crNoneVideo.crNone

我附上了两张显示光标如何出现的图片。

  • 播放幻灯片时光标出现
  • 播放视频时光标出现

如何使用Inno Media Player处理BackgroundForm上的视频:

procedure PlayMPEGVideo();
begin
  if VBRadio2.Checked then begin
    if FileExists(ExpandConstant('{tmp}Video.mp4')) then
    begin
      if DSInitializeVideoFile(ExpandConstant('{tmp}Video.mp4'), BackgroundForm.Handle, Width, Height, @BackgroundVideoPlay) then
      begin
        BackgroundForm.Width := GetSystemMetrics(0);
        BackgroundForm.Height := GetSystemMetrics(1);
        BASS_Pause;
        SoundCtrlButton.Enabled := False;
        DSSetVolume(-0);
        DSPlayMediaFile;
        WizardForm.BringToFront;
        PauseBT.Show;
        PlayBT1.hide;
        PlayBT.hide;
        with WizardForm do begin
          WizardForm.NextButton.Caption := 'Install';
        end;
      end;
    end;
  end else begin
    with WizardForm do begin
      if CurPageID = wpInstalling then begin
        PauseBT.hide;
        CompactCheckBox.Visible := False;
        WizardForm.WizardSmallBitmapImage.Show;
        WizardForm.Bevel1.Show;
        with WizardForm do begin
          WizardForm.ProgressGauge.show;
        end;
      end;
    end;
  end;
end;

如何使用isSlideShow:

处理BackgroundForm上的幻灯片
procedure MakeSlideShow();
var
  i :integer;
begin
  if NoBackgroundCheckBox.Checked = True then begin
    with WizardForm do begin
      if CurPageID=wpInstalling then begin
        PauseBT.hide;
        CompactCheckBox.Visible := False;
        WizardForm.WizardSmallBitmapImage.Show;
        WizardForm.Bevel1.Show;
        with WizardForm do begin
          WizardForm.ProgressGauge.show;
        end;
      end;
    end;
  end else begin
    BackgroundForm:= TForm.Create(nil);
    BackgroundForm.BorderStyle:= bsNone;
    BackgroundForm.Color:=clBlack;
    BackgroundForm.SetBounds(0, 0, GetSystemMetrics(0), GetSystemMetrics(1))
    BackgroundForm.Visible:=True;
    BackgroundForm.enabled:= False;
    PicList:=tstringlist.Create;
#ifexist "Slides1.jpg"
#sub ExtractFile
    ExtractTemporaryFile('{#i}.jpg');
#endsub
#for {i = 1; FileExists(StringChange("SlidesFileName.jpg", "FileName", Str(i))) != 0; i++} ExtractFile
#endif
    i:=1;
    repeat
      piclist.add(ExpandConstant('{tmp}'+IntToStr(i)+'.jpg'));
      i:=i+1;
    until FileExists(ExpandConstant('{tmp}'+IntToStr(i)+'.jpg')) = False;
    BackgroundForm.Show;
    InitializeSlideShow(BackgroundForm.Handle, 0, 0, GetSystemMetrics(0), GetSystemMetrics(1), true, 1);
    ShowImage(ExpandConstant('{tmp}') + '1.jpg', 1);
    PlayBT1 := PlayBT;
  end;
end;

一般来说,要隐藏鼠标光标,需要将控件的.Cursor属性设置为crNone


对于Inno Media Player:它的API没有暴露"视频"控制。您必须修改其源代码并重新编译。特别是,您需要在TDirectShowPlayer.InitializeVideoWindow中的FVideoWindow上调用IVideoWindow::HideCursor方法。

const
  OATRUE = -1;
procedure TDirectShowPlayer.InitializeVideoWindow(WindowHandle: HWND; var Width,
  Height: Integer);
begin
  ErrorCheck(FGraphBuilder.QueryInterface(IVideoWindow, FVideoWindow));
  ErrorCheck(FVideoWindow.HideCursor(OATRUE));
  ...
end;

注意,当父窗口(BackgroundForm)被禁用时,它不起作用。所以不能设置BackgroundForm.Enabled := False。为了防止背景/视频窗口被激活,通过将焦点返回到向导表单来处理TForm.OnActive:

procedure BackgroundFormActivated(Sender: TObject);
begin
  WizardForm.BringToFront;
end;
...
begin
  ...
  BackgroundForm:= TForm.Create(nil);
  ...
  BackgroundForm.OnActivate := @BackgroundFormActivated;
end;

这是一个完整的代码,为我工作-隐藏光标在背景视频-当使用重新编译的MediaPlayer.dllHideCursor调用时,由您提供-在Windows 10上测试。

var
  BackgroundForm: TForm;
procedure OnMediaPlayerEvent(EventCode, Param1, Param2: Integer); 
begin
  { noop }
end;
procedure BackgroundFormActivated(Sender: TObject);
begin
  WizardForm.BringToFront;
end;
procedure PlayMPEGVideo();
var
  Width, Height: Integer;
begin
  BackgroundForm := TForm.Create(nil);
  BackgroundForm.BorderStyle := bsNone;
  BackgroundForm.Color := clBlack;
  BackgroundForm.Visible := True;
  BackgroundForm.Cursor := crNone;
  BackgroundForm.OnActivate := @BackgroundFormActivated;
  Width := GetSystemMetrics(0);
  Height := GetSystemMetrics(1);
  BackgroundForm.SetBounds(0, 0, Width, Height)
  if DSInitializeVideoFile(
       '...video.avi', BackgroundForm.Handle, Width, Height, @OnMediaPlayerEvent) then
  begin
    DSPlayMediaFile;
    WizardForm.BringToFront;
  end;
end;

For isSlideShow:我没有找到这个的任何文档或源代码

最新更新