2009-08-05 4 views
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); 

Этот код стирает значки на рабочем столе.
Как получить ручку окна за значками рабочего стола?нажатие экранной заставки как обои

ответ

2

Это не вопрос Delphi, но в любом случае ... Запуск экранной заставки с помощью командной строки /P создает окно экранной заставки в качестве дочернего объекта данного окна с одинаковым размером и положением - это предназначено только для предварительного просмотра экранной заставки в диалоговом окне «Свойства экрана». Он будет не поместите окно экранной заставки где-нибудь в Z-порядке под другим окном. Следовательно, он будет рисовать все, стирая иконы рабочего стола.

Если вы не создали свою собственную заставку, которая рисует прямо на рабочем столе, я не думаю, что вы можете сделать то, что вы хотите.

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