推动屏幕保护程序作为壁纸

时间:2009-08-05 14:27:26

标签: delphi explorer screensaver

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);

此代码将删除桌面图标。
如何获取桌面图标后面的窗口句柄?

2 个答案:

答案 0 :(得分:2)

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

除非您创建自己的屏幕保护程序直接在桌面窗口上绘制,否则我认为您无法做到。

答案 1 :(得分:0)

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

SendMessage(Handle, WM_SYSCOMMAND, SC_SCREENSAVE, 0); 

根据我的经验,我再次同意mghie;我认为你不能做你想做的事。当屏幕保护程序处于活动状态时,Windows似乎在不同的环境中运行,例如, Windows消息似乎没有按预期传播等等。

虽然为了进入桌面,我之前使用过桌面设备上下文的句柄。

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);