Code:

unit Unit1;

{©Drkb v.3(}

 

interface

 

uses

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

Dialogs, StdCtrls;

 

type

TForm1 = class(TForm)

   Button1: TButton;

end;

 

var

Form1: TForm1;

 

implementation

 

{$R *.dfm}

 

uses

TlHelp32;

 

function GetExeFilePath(ExeFileName: String): String;

var

hSnapshot, hSnapshot2: THandle;

Proc: TProcessEntry32;

m: TModuleEntry32;

begin

Result := '';

hSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);

try

   proc.dwSize := Sizeof(proc);

   if Process32First(hSnapshot, proc) then

   repeat

     if AnsiSameText(proc.szExeFile, ExeFileName) then

     begin

       hSnapshot2 := CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,

         proc.th32ProcessID);

       try

         m.dwSize := SizeOf(TModuleEntry32);

         if Module32First(hSnapshot2, m) then

         begin

           Result := m.szExePath;

           Exit;

         end;

       finally

         CloseHandle(hSnapshot2);

       end;

     end;

   until not Process32Next(hSnapshot, proc);

finally

   CloseHandle(hSnapshot);

end;

end;

 

 

 

Этот модуль включает две процедуры, которые эмулируют популярные Visual Basic процедуры : Sendkeys and AppActivate. SendKeys берет PChar

как первый параметр и boolean как второй. Выглядит это так:

SendKeys('KeyString', Wait);

 

 

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.

 

 

Code:

function ExeNameByHandle(aWinHandle:HWND):string;

{исправлено для ©Drkb v.3}

 

// Для начала определяешь какому процессу принадлежит окно:

var pProcID: ^DWORD;

begin

GetMem(pProcID, SizeOf(DWORD));

GetWindowThreadProcessId(aWinHandle, pProcID);

result:=GetExeNameByProcID(pProcID^);

FreeMem(pProcID);

end;

       // а после этого используешь TProcessEntry32 примерно так:

function GetExeNameByProcID(ProcID: DWord): string;

var

ContinueLoop: BOOL;

FSnapshotHandle: THandle;

FProcessEntry32: TProcessEntry32;

begin

FSnapshotHandle := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

FProcessEntry32.dwSize := Sizeof(FProcessEntry32);

ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);

Result := '';

while (Integer(ContinueLoop) <> 0) and (Result = '') do

       begin

       if FProcessEntry32.th32ProcessID = ProcID then

               Result := FProcessEntry32.szExeFile;

       ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);

       end;

CloseHandle(FSnapshotHandle);

end;

 

// Не забудь в uses добавить Tlhelp32

 

 

Code:

function GetModuleFileNameExW(hProcess:THandle; hModule:HMODULE; lpFilename:PWideChar; nSize:DWORD):DWORD; stdcall; external 'PSAPI.DLL';

 

function WindowGetEXE(wnd:HWND):string;

var

wt:array[0..MAX_PATH-1] of WChar;

r:integer;

prc:THandle;

prcID:cardinal;

begin

result:='';

if GetWindowThreadProcessID(wnd,prcID)<>0 then

begin

prc:=OpenProcess(PROCESS_ALL_ACCESS,false,prcID);

if prc<>0 then

try

  r:=GetModuleFileNameExW(prc,GetWindowLong(wnd,GWL_HINSTANCE),wt,MAX_PATH*2);

  if r=0 then r:=GetModuleFileNameExW(prc,0,wt,MAX_PATH*2);

  if r<>0 then result:=wt;

finally

  CloseHandle(prc)

end

end

end;

 

function SetProcessDebugPrivelege:boolean;

var

hToken:THandle;

tp:TTokenPrivileges;

rl:cardinal;

begin

result:=false;

if not OpenProcessToken(GetCurrentProcess,TOKEN_ADJUST_PRIVILEGES,hToken) then exit;

try

    if not LookupPrivilegeValue(nil,'SeDebugPrivilege', tp.Privileges[0].Luid) then exit;

     tp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLED;

     tp.PrivilegeCount:=1;

     result:=AdjustTokenPrivileges(hToken,false,tp,0,nil,rl) and (GetLastError=0)

finally

    CloseHandle(hToken);

end

end;

 

procedure TForm1.FormCreate(Sender: TObject);

begin

SetProcessDebugPrivelege;

end;

 

procedure TForm1.Button1Click(Sender: TObject);

begin

   ShowMessage(WindowGetExe(hWnd))

end;

 

 
PS только для NT4 и выше. Для Win9x юзать GetWindowModuleFileName.

 

Code:

procedure TForm1.Timer1Timer(Sender: TObject);

{©Drkb v.3}

 

var

pgui: TGUIThreadinfo;

begin

pgui.cbSize := SizeOf(TGUIThreadinfo);

GetGUIThreadInfo(GetWindowThreadProcessId(GetForegroundWindow), pgui);

SendMessage(pgui.hwndFocus, WM_SETTEXT, Length(Edit1.Text), Integer(@Edit1.Text[1]));

end

Она может брать текст, где этого не может делать GetWindowText(), вот собственно и все!

Должна работать на всех win, но небыло возможности проверить.... =)

Так что кому надо... Отдельное спасибо .alex'у

 

Code:

// Поиск значения типа DWORD в указанном процессе

// Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

//

program search;

 

{$APPTYPE CONSOLE}

 

uses Windows, SysUtils;

 

var

ProcessID: DWord;

ProcessHandle: THandle;

Mbi: TMemoryBasicInformation;

Addr: DWord;

Value: DWord;

I: Cardinal;

Buf: PChar;

BytesRead: DWord;

begin

if ParamCount < 2 then

begin

WriteLn('Usage: search.exe processid value');

Exit;

end;

 

ProcessID := StrToInt(ParamStr(1));

WriteLn('Process id: ' + IntToStr(ProcessID));

 

Value := StrToInt(ParamStr(2));

WriteLn('Value to search: ' + IntToStr(Value));

 

//

// Открываем процесс

//

ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or

PROCESS_VM_OPERATION, false, ProcessID);

 

if ProcessHandle <> 0 then

try

Addr := 0;

 

//

// Перечисляем все регионы виртуальной памяти процесса

//

while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do

begin

  // Uncomment чтобы увидеть список регионов, найденых в адресном пространстве

  // WriteLn('region: ' + IntToHex(Integer(Mbi.BaseAddress), 8) +

  //   ' size: ' + IntToStr(Mbi.RegionSize));

 

  //

  // Если региону выделена память, и регион не является "сторожевым" (как вершина стека),

  // то читаем этот регион

  //

  if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then

  begin

   //

   // Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.

   // Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии

   // памяти. Но здесь для простоты алгоритма вся оптимизация похерена.

   //

   GetMem(Buf, Mbi.RegionSize);

   try

    //

    // Читаем весь регион в выделенный буфер

    //

    if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,

      Mbi.RegionSize, BytesRead) then

    begin

     //

     // Ищем значение типа DWORD в буфере

     //

     for I := 0 to BytesRead - SizeOf(Value) do

     begin

      if PDWord(@Buf[I])^ = Value then

       // Найдено, выводим

       WriteLn('Value ' + IntToStr(Value) + ' found at ' +

        IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));

     end;

    end

    else

     WriteLn('Failed to read process memory ' + IntToStr(GetLastError));

 

   finally

    FreeMem(Buf);

   end;

  end;

 

  // Вычисляем адрес следуюшего региона

  Addr := Addr + Mbi.RegionSize;

end;

 

finally

CloseHandle(ProcessHandle);

end

else

WriteLn('Failed to open process');

end.

 

 

Как мне программно нажать ALT + буква(VK_...) в другом приложении. Хендл я нашел, деляю так

 

SendMessage(Handle_, WM_KEYDOWN, VK_MENU,0);

SendMessage(Handle_, WM_KEYDOWN, VK_F1,0);

SendMessage(Handle_, WM_KEYUP, VK_F1,0);

 

но у меня не получается, что не так?

 

Попробуй так

Code:

SendMessage(Handle,WM_KEYDOWN,Byte(C),$20000001);

 

 

Code:

 

// Этот адрес электронной почты защищён от спам-ботов. У вас должен быть включен JavaScript для просмотра.

//

program search;

{©Drkb v.3}

 

{$APPTYPE CONSOLE}

 

uses Windows, SysUtils;

 

var

ProcessID: DWord;

ProcessHandle: THandle;

Mbi: TMemoryBasicInformation;

Addr: DWord;

Value: DWord;

I: Cardinal;

Buf: PChar;

BytesRead: DWord;

begin

if ParamCount < 2 then

begin

WriteLn('Usage: search.exe processid value');

Exit;

end;

 

ProcessID := StrToInt(ParamStr(1));

WriteLn('Process id: ' + IntToStr(ProcessID));

 

Value := StrToInt(ParamStr(2));

WriteLn('Value to search: ' + IntToStr(Value));

 

//

// Открываем процесс

//

ProcessHandle := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ or

PROCESS_VM_OPERATION, false, ProcessID);

 

if ProcessHandle <> 0 then

try

Addr := 0;

 

//

// Перечисляем все регионы виртуальной памяти процесса

//

while VirtualQueryEx(ProcessHandle, Pointer(Addr), Mbi, SizeOf(Mbi)) <> 0 do

begin

  // Uncomment чтобы увидеть список регионов, найденых в адресном пространстве

  // WriteLn('region: ' + IntToHex(Integer(Mbi.BaseAddress), 8) +

  //   ' size: ' + IntToStr(Mbi.RegionSize));

 

  //

  // Если региону выделена память, и регион не является "сторожевым" (как вершина стека),

  // то читаем этот регион

  //

  if (Mbi.State = MEM_COMMIT) and not ((Mbi.Protect and PAGE_GUARD) = PAGE_GUARD) then

  begin

   //

   // Это демонстрационная программа, поэтому здесь выделяется буфер под весь регион.

   // Регион может быть достаточно большим, поэтому лучше читать его блоками для экономии

   // памяти. Но здесь для простоты алгоритма вся оптимизация похерена.

   //

   GetMem(Buf, Mbi.RegionSize);

   try

    //

    // Читаем весь регион в выделенный буфер

    //

    if ReadProcessMemory(ProcessHandle, Mbi.BaseAddress, Buf,

      Mbi.RegionSize, BytesRead) then

    begin

     //

     // Ищем значение типа DWORD в буфере

     //

     for I := 0 to BytesRead - SizeOf(Value) do

     begin

      if PDWord(@Buf[I])^ = Value then

       // Найдено, выводим

       WriteLn('Value ' + IntToStr(Value) + ' found at ' +

        IntToHex(Integer(Cardinal(Mbi.BaseAddress) + I), 8));

     end;

    end

    else

     WriteLn('Failed to read process memory ' + IntToStr(GetLastError));

 

   finally

    FreeMem(Buf);

   end;

  end;

 

  // Вычисляем адрес следуюшего региона

  Addr := Addr + Mbi.RegionSize;

end;

 

finally

CloseHandle(ProcessHandle);

end

else

WriteLn('Failed to open process');

end.

 

а вот программа, в которой ведем поиск для примера:

 

program someprog;

 

{$APPTYPE CONSOLE}

 

uses SysUtils;

 

var

SomeValue: Integer;

begin

SomeValue := 12345;

WriteLn('One variable of this program has a value ' + IntToStr(SomeValue));

WriteLn('Press any key to exit');

ReadLn;

end.

 

Автор Rouse_

Создайте форму и разместите на ней два компонента ListBox.

Скопируйте код, показанный ниже.

Запустите SysEdit.

Запустите форму Delphi. Первый ListBox должен содержать список всех запущенных приложений. Дважды щелкните на SysEdit и нижний ListBox покажет дочернее MDI-окно программы SysEdit.

Paul Powers (Borland)