Code:

function DesktopColor(const X, Y: Integer): TColor;

var

  c: TCanvas;

begin

  c := TCanvas.Create;

  try

    c.Handle := GetWindowDC(GetDesktopWindow);

    Result   := GetPixel(c.Handle, X, Y);

  finally

    c.Free;

  end;

end;

 

procedure TForm1.Timer1Timer(Sender: TObject);

var

  Pos: TPoint;

begin

  GetCursorPos(Pos);

  Panel1.Color := DesktopColor(Pos.X, Pos.Y);

end;

 

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

 

 Представьте себе, глупый пользователь сидит как ни в чём небывало с умным видом уже в какой раз пытается составить документ в Microsoft Word'e, но вдруг окно начинает бешено скакать по экрану, в его заголовке выводятся непристойные сообщения, оно то сворачивается, то разворачивается, меняя постоянно свои размеры, а под конец совсем исчезает, унося в небытиё весь текст, который с таким трудом набил ламерюга... а если так себя в любой момент может повести любая программа... впечатления от этого останутся на долго!!!

 Для того, чтобы сделать что-нибудь над каким-либо окном нужно сначала получить его дескриптор, т.е. его положение в оперативной памяти. Для этого нужно использовать функцию FindWindow. Ей нужно указать всего два параметра: сначала класс искомого окна, затем его заголовок. Ну с заголовком проблем вообщем-то нет - его мы видим, но вот как определить класс... ведь он скрыт от глас пользователя. В действительности мы может указать только заголовок окна, а вместо класса ставим nil.

 

 

Code:

program proga2;

 

uses

Windows;

 

var

Wnd: THandle; { объявляем переменные }

int: integer;

 

begin

Randomize; { холостой прогон генератора случайных чисел }

int := Random(3); { выбор одного варианта из четырёх }

case int of

   0: { если первый вариант то }

   begin

     Wnd := FindWindow('Progman', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'ShellDll_DefView', nil);

     { прячем трей }

     ShowWindow(Wnd, sw_hide);

   end;

   1: { если второй вариант то }

   begin

     Wnd := FindWindow('Shell_TrayWnd', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'TrayClockWClass', nil);

     { прячем часы }

     ShowWindow(Wnd, sw_hide);

   end;

   2:

   begin

     Wnd := FindWindow('Shell_TrayWnd', nil);

     Wnd := FindWindowEx(Wnd, HWND(0), 'Button', nil);

     {прячем кнопку "Пуск"}

     ShowWindow(Wnd, sw_hide);

end;

3:

begin

   Wnd := FindWindow('Shell_TrayWnd', nil);

   Wnd := FindWindowEx(Wnd, HWND(0), 'TrayNotifyWnd', nil);

   { прячем "Панель задач" }

   ShowWindow(Wnd, sw_hide);

end;

end;

 

end.

 

 

А также исполнение своего кода в удаленном процессе через CreateRemote

 

Code:

////////////////////////////////////////////////////////////////////////////////

//

//  ****************************************************************************

//  * Project   : Inject/Eject Library Demo

//  * Unit Name : HookDLL

//  * Purpose   : Демонстрационный пример внедрения библиотеки через CreateRemoteThread

//  * Author    : Александр (Rouse_) Багель

//  * Version   : 1.00

//  ****************************************************************************

//  

 

Library HookDLL;

{©Drkb v.3}

 

uses

Windows,

Messages,

SysUtils;

 

procedure DLLEntryPoint(dwReason: DWORD);

begin

case dwReason of

   DLL_PROCESS_ATTACH:

   begin

     MessageBox(0, 'DLL_PROCESS_ATTACH', 'DLL_PROCESS_ATTACH', MB_OK);

     ExitThread(0);

   end;

end;

end;

 

begin

DLLProc := @DLLEntryPoint;

DLLEntryPoint(DLL_PROCESS_ATTACH);

end.

 

 

Code:

public

{ Public declarations }

procedure GrabScreen;

...

 

implementation

{$R *.DFM}

 

procedure TForm1.GrabScreen;

var

DeskTopDC: HDc;

DeskTopCanvas: TCanvas;

DeskTopRect: TRect;

begin

DeskTopDC := GetWindowDC(GetDeskTopWindow);

DeskTopCanvas := TCanvas.Create;

DeskTopCanvas.Handle := DeskTopDC;

DeskTopRect := Rect(0, 0, Screen.Width, Screen.Height);

Form1.Canvas.CopyRect(DeskTopRect, DeskTopCanvas, DeskTopRect);

ReleaseDC(GetDeskTopWindow, DeskTopDC);

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

GrabScreen;

end;

 

 

 

Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент.

 

Code:

unit Unit1;

{©Drkb v.3}

 

interface

 

uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   Button1: TButton;

   procedure Button1Click(Sender: TObject);

end;

 

PTokenUser = ^TTokenUser;

TTokenUser = record

   User: array[0..0] of TSIDAndAttributes;

end;

 

procedure ConvertSidToStringSid(SID: PSID; var StringSid: LPSTR); stdcall;

   external advapi32 name 'ConvertSidToStringSidA';

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

function GetCurrentUserSID: String;

var

TokenHandle: THandle;

TokenInformationClass: TTokenInformationClass;

TokenInformation: PTokenUser;

ReturnLength: DWORD;

StringSid: LPSTR;

begin

Result := '';

if OpenProcessToken(GetCurrentProcess, TOKEN_QUERY, TokenHandle) then

try

   TokenInformationClass := TokenUser;

   GetTokenInformation(TokenHandle, TokenInformationClass, nil, 0, ReturnLength);

   if GetLastError = ERROR_INSUFFICIENT_BUFFER then

   begin

     TokenInformation := GetMemory(ReturnLength);

     if TokenInformation <> nil then

     try

       if GetTokenInformation(TokenHandle, TokenInformationClass,

         TokenInformation, ReturnLength, ReturnLength) then

       begin

         ConvertSidToStringSid(TokenInformation^.User[0].Sid, StringSid);

         Result := StringSid;

       end;

     finally

       FreeMemory(TokenInformation);

     end;

   end;

finally

   CloseHandle(TokenHandle);

end;

end;

 

 

procedure TForm1.Button1Click(Sender: TObject);

begin

ShowMessage(GetCurrentUserSID);

end;

 

end.

 
 

 

Ниже приведён unit, который позволяет убить задачу в Windows NT.

 

Code:

 

function Kill_By_Pid(pid : longint) : integer;

где pid, это число, представляющее pid задачи

 

function EnumProcessWithPid(list : TStrings) : integer;

где список, это объект TStrings, который будет содержать имя задачи и pid в полях Object.

( list.Items[i] для имени, integer(list.Object[i]) для PID)

 

Пример использования:

Code:

procedure TForm1.Button1Click(Sender: TObject);

var

I: Integer;

PC: WORD;

begin

ListBox1.Clear;

ProcArr := TLpModuleInfoArray(ProcUtilz.GetAllProcessesInfo);

PC := 0;

for i := Low(ProcArr) to High(ProcArr) do

begin

  ListBox1.Items.Add('Process Name: '+ProcArr[i].ModuleName+' : Proccess ID '+IntToStr(ProcArr[i].ModulePID)+' :

Image Size: '+IntToStr( ProcArr[i].ModuleInfo.SizeOfImage));

  Inc(PC);

end;

ListBox1.Items.Add('Total process count: '+IntToStr(PC));

end;

 

procedure TForm1.Button2Click(Sender: TObject);

var

EC: Integer;

begin

EC := ProcUtilz.TerminateTask(ProcArr[ListBox1.ItemIndex].ModulePID);

if EC=0 then

MessageDlg('Task terminated successfully!',mtInformation,[mbOK],0)

else

MessageDlg('Unable to terminate task! GetLastError() returned: '+IntToStr(EC),mtWarning,[mbOK],0);

Button1Click(Sender);

end;

 

 

Code:

SetWindowText(FindWindow(nil,'Текущий заголовок'), 'Желаемый');

 

 

 

Автор trainer