Windows
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;
|
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Этот модуль включает две процедуры, которые эмулируют популярные Visual Basic процедуры : Sendkeys and AppActivate. SendKeys берет PChar
как первый параметр и boolean как второй. Выглядит это так:
SendKeys('KeyString', Wait);
- Подробности
- Родительская категория: 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
- Категория: Работа с чужими процессами
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 |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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.
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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 |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Она может брать текст, где этого не может делать GetWindowText(), вот собственно и все!
Должна работать на всех win, но небыло возможности проверить.... =)
Так что кому надо... Отдельное спасибо .alex'у
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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. |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Как мне программно нажать 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); |
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
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_
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Создайте форму и разместите на ней два компонента ListBox.
Скопируйте код, показанный ниже.
Запустите SysEdit.
Запустите форму Delphi. Первый ListBox должен содержать список всех запущенных приложений. Дважды щелкните на SysEdit и нижний ListBox покажет дочернее MDI-окно программы SysEdit.
Paul Powers (Borland)
- Подробности
- Родительская категория: Windows
- Категория: Работа с чужими процессами
Страница 22 из 42