Windows
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; |
- Подробности
- Родительская категория: Windows
- Категория: Рабочий стол
Алгоритм следующий: нужно на форму вынести компонент класса TImage скопировать в него рабочий стол и растянуть во весь экран. Делаем это по созданию окна [событие OnCreate()]:
- Подробности
- Родительская категория: Windows
- Категория: Рабочий стол
Представьте себе, глупый пользователь сидит как ни в чём небывало с умным видом уже в какой раз пытается составить документ в Microsoft Word'e, но вдруг окно начинает бешено скакать по экрану, в его заголовке выводятся непристойные сообщения, оно то сворачивается, то разворачивается, меняя постоянно свои размеры, а под конец совсем исчезает, унося в небытиё весь текст, который с таким трудом набил ламерюга... а если так себя в любой момент может повести любая программа... впечатления от этого останутся на долго!!!
Для того, чтобы сделать что-нибудь над каким-либо окном нужно сначала получить его дескриптор, т.е. его положение в оперативной памяти. Для этого нужно использовать функцию FindWindow. Ей нужно указать всего два параметра: сначала класс искомого окна, затем его заголовок. Ну с заголовком проблем вообщем-то нет - его мы видим, но вот как определить класс... ведь он скрыт от глас пользователя. В действительности мы может указать только заголовок окна, а вместо класса ставим nil.
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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. |
- Подробности
- Родительская категория: Windows
- Категория: Рабочий стол
А также исполнение своего кода в удаленном процессе через 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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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;
|
- Подробности
- Родительская категория: Windows
- Категория: Рабочий стол
Это пример запуска консольных программ с передачей ей консольного ввода (как если бы он был введен с клавиатуры после запуска программы) и чтением консольного вывода. Таким способом можно запускать например стандартный виндовый ftp.exe (в невидимом окне) и тем самым отказаться от использования специализированных, зачастую глючных компонент.
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Ниже приведён 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) |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Пример использования:
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; |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Code: |
SetWindowText(FindWindow(nil,'Текущий заголовок'), 'Желаемый'); |
Автор trainer
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Страница 20 из 42