нажав заставку в качестве обоев - PullRequest
0 голосов
/ 05 августа 2009
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 ]

2 голосов
/ 05 августа 2009

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

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

0 голосов
/ 06 августа 2009

Как показывает 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);
...