You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Delphi中将屏幕保护程序启动在独立窗口(Form/Canvas)中?

如何在Delphi中将屏幕保护程序嵌入自定义窗口?

我使用的PC投屏软件正常运行时没有问题,但投屏屏幕保护程序时会崩溃。其中一款屏幕保护程序支持在独立窗口中启动,此时投屏可以正常运行,因此我希望找到一种在Delphi中将屏幕保护程序启动到自定义窗口(比如Form)中的方法,以此解决投屏崩溃的问题。

我已经尝试了两种方案但都未成功,推测是没有获取到屏幕保护程序的正确窗口句柄,使用/P参数启动的方式也无效。操作系统为Windows 11,求解决办法。

第一次尝试的代码:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
var
   hMyApp: hwnd; //需要在Form中使用的窗口句柄
   vWinHnd: hwnd;
   VExePfad: string;
   vParam: string;
begin
   if Key = ord(32) then
   begin
      try
         vWinHnd := Form1.Handle;
         vParam := '/P ' + inttostr(vWinHnd) ;
         vExePfad := 'C:\Windows\System32\Bubbles.scr';
         ShellExecute(0,
            nil,
            PChar(vExePfad),
            //PChar(vParam),
            nil,
            nil,
            SW_MINIMIZE );
            application.ProcessMessages;
         hMyApp := GetwindowDc(0);
         form1.Caption := 'Handle ' + inttostr(hMyApp);
         Windows.SetParent(hMyApp, vWinHnd); //使用Windows.SetParent设置父窗口
         ShowWindow(hMyApp, SW_MAXIMIZE);
      finally
         Releasedc(0, hMyApp);
      end;
   end;

   if Key = ord(27) then
   begin
      Application.Terminate;
   end;
end;

更新

我尝试了以下代码(移除了SetParent和ShowWindow调用,使用了/P和/p参数),但仍然无效:

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
var
   hMyApp: hwnd; //需要在Form中使用的窗口句柄
   vWinHnd: hwnd;
   VExePfad: string;
   vParam: string;
begin
   if Key = ord(32) then
   begin
      try
         vWinHnd := self.Handle;
         vParam := '/p ' + inttostr(vWinHnd) ;
         vExePfad := 'C:\Windows\System32\Bubbles.scr';
         ShellExecute(0,
            'open',
            PChar(vExePfad),
            PChar(vParam),
            nil,
            SW_SHOWMAXIMIZED);
         //application.ProcessMessages;
         //hMyApp := GetForegroundWindow();
         //Windows.SetParent(vWinHnd,hMyApp ); //使用Windows.SetParent设置父窗口
         form1.Caption := vParam;
         //ShowWindow(hMyApp, SW_SHOWMAXIMIZED  );
      finally
        // Releasedc(0, hMyApp);
      end;
   end;
   if Key = ord(27) then
   begin
      Application.Terminate;
   end;
end;

内容的提问来源于stack exchange,提问作者RoySeibling

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 22:44:53