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);
此代码将删除桌面图标。
如何获取桌面图标后面的窗口句柄?
答案 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);