我使用将我的电脑镜像到电视的软件。效果很好,但是传输屏保时会崩溃。
其中一个屏幕保护程序提供了在自己的窗口中启动它的选项 - 因此镜像效果完美。因此,我正在寻找一种方法来在自己的窗口(例如表单)中启动屏幕保护程序,然后将其传输到电视上。
不幸的是,第一次尝试没有成功;我可能没有获得屏幕保护程序的正确句柄。从
"/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.
非常感谢 Remy Lebeau,它有效,我粘贴了上面的代码。