如何在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
相关产品推荐
相关产品推荐

