如何在Delphi中的自己的窗口(表单,画布)中启动屏幕保护程序?

问题描述 投票:0回答:1

我使用将我的电脑镜像到电视的软件。效果很好,但是传输屏保时会崩溃。

其中一个屏幕保护程序提供了在自己的窗口中启动它的选项 - 因此镜像效果完美。因此,我正在寻找一种方法来在自己的窗口(例如表单)中启动屏幕保护程序,然后将其传输到电视上。

不幸的是,第一次尝试没有成功;我可能没有获得屏幕保护程序的正确句柄。从

"/P"
参数开始也不起作用。

有人可以帮助我吗?操作系统是“Windows 11”。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
var
   hMyApp: hwnd; //Handle auf das Window welches man im Form braucht
   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); //Parent mit 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; //Handle auf das Window welches man im Form braucht
   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 ); //Parent mit 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;

感谢 Remy Lebeau,感谢他,这里是有效的代码。

procedure TForm1.FormKeyDown(Sender: TObject; var Key: Word;
   Shift: TShiftState);
var
   vWinHnd: hwnd;
   VExePfad: string;
   vParam: string;
   SI: TStartupInfo;
   PI: TProcessInformation;
begin
   if Key = ord(32) then
   begin
      try
         vWinHnd := self.Handle;
         vParam := '/p ' + inttostr(vWinHnd);
         vExePfad := 'C:\Windows\System32\Bubbles.scr';
         ZeroMemory(@SI, SizeOf(SI));
         SI.cb := SizeOf(SI);
         SI.dwFlags := STARTF_USESHOWWINDOW;
         SI.wShowWindow := SW_SHOWMAXIMIZED;
         if CreateProcess(nil, PChar(vExePfad + ' ' + vParam),
            nil,
            nil,
            False,
            0,
            nil,
            nil,
            SI,
            PI) then
         begin
            CloseHandle(PI.hThread);
            CloseHandle(PI.hProcess);
         end;
      finally
         Form1.FormStyle := fsNormal;
      end;
   end;

   if Key = ord(27) then
   begin
      Application.Terminate;
   end;
end;
end.
windows delphi winapi screensaver mirroring
1个回答
0
投票

非常感谢 Remy Lebeau,它有效,我粘贴了上面的代码。

© www.soinside.com 2019 - 2024. All rights reserved.