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

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

4

2 回答 2

2

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

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

于 2009-08-05T15:49:22.113 回答
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);
于 2009-08-05T21:11:30.107 回答