Delphi 将屏幕保护程序推为壁纸

Delphi 将屏幕保护程序推为壁纸,delphi,explorer,screensaver,Delphi,Explorer,Screensaver,此代码将删除桌面图标 如何获得桌面图标后面的窗口句柄?这不是Delphi的问题,但无论如何。。。使用/P命令行开关启动屏幕保护程序会将屏幕保护程序窗口创建为给定窗口的子窗口,具有相同的大小和位置-它仅用于在“显示属性”对话框中提供屏幕保护程序预览。它不会将屏幕保护程序窗口按Z顺序放置在其他窗口下面的某个位置。因此,它将覆盖所有内容,同时删除桌面图标 除非你创建了自己的屏幕保护程序,直接在桌面窗口上绘图,否则我认为你想要的东西是做不到的。正如mghie所指出的,如果你想启动屏幕保护程序,那不是正确

此代码将删除桌面图标

如何获得桌面图标后面的窗口句柄?

这不是Delphi的问题,但无论如何。。。使用
/P
命令行开关启动屏幕保护程序会将屏幕保护程序窗口创建为给定窗口的子窗口,具有相同的大小和位置-它仅用于在“显示属性”对话框中提供屏幕保护程序预览。它不会将屏幕保护程序窗口按Z顺序放置在其他窗口下面的某个位置。因此,它将覆盖所有内容,同时删除桌面图标


除非你创建了自己的屏幕保护程序,直接在桌面窗口上绘图,否则我认为你想要的东西是做不到的。

正如mghie所指出的,如果你想启动屏幕保护程序,那不是正确的方法。最简单的方法是:

var ScreenSaver:String;
var handle:HWND;
begin
Handle := FindWindow('Progman', 'Program Manager');
Handle := FindWindowEx(Handle, 0, 'SHELLDLL_DefView', 0);
Handle := FindWindowEx(Handle, 0,'SysListView32', 'FolderView');

ScreenSaver := 'C:\windows\system32\Mystify.scr /P' + InttoStr( Handle );
WinExec(pAnsichar(screensaver), SW_SHOWNormal);
根据我的经验,我再次同意mghie;我认为你不能做你想做的事。当屏幕保护程序处于活动状态时,Windows似乎在不同的环境中运行,例如Windows消息似乎没有按预期传播,等等

不过,为了进入桌面,我以前使用过桌面设备上下文的句柄

SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0); 
var
  ScreenDC: HDC;
begin
  ScreenDC := GetWindowDC(0);
  ...
  // You can then use the Device Context with Windows API methods such as BitBlt
  // and StretchBlt to go graphical work on the desktop.}
  ...
  ReleaseDC(0, ScreenDC);