Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > [ "Начинающим" ]
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 14.02.2023, 20:36
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 41
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию Сколько памяти выделено другому приложению

Как узнать количество используемой памяти другим приложением зная его HWND?

Есть код
Код:
uses .., psAPI, Windows;
 
procedure TForm1.Button1Click(Sender: TObject);
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
begin
  Memo1.Lines.Clear;
  cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
  GetMem(pmc, cb);
  pmc^.cb := cb;
  if GetProcessMemoryInfo(GetCurrentProcess(), pmc, cb) then
  begin
    Memo1.Lines.Add( FloatToStr(pmc^.WorkingSetSize/1024) + ' KB');
    Memo1.Lines.Add( FloatToStr(pmc^.PagefileUsage/1024) + ' KB');
  end;
  FreeMem(pmc);
end;

Но он выдает кол-во используемой памяти только у самого себя.
Ответить с цитированием
  #2  
Старый 16.02.2023, 17:43
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Цитата:
Сообщение от Vladimr
выдает кол-во используемой памяти только у самого себя.

Ну правильно, в функцию GetProcessMemoryInfo первым передается ID нужного процесса. А там функция GetCurrentProcess она возвращает ID своей программы.

Если честно я не знаю как по HWND вычислить ID процесса, мне никогда такой подход не требовался, я обычно это узнавал по имени процесса
Ответить с цитированием
  #3  
Старый 16.02.2023, 18:54
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 41
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Можно узнать PID окна по его HWND использую функцию

Код:
GetWindowThreadProcessId(HWND,PID);

Но даже передавая pid процесса в
Код:
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
 PID:DWORD; //pid процесса (как в диспетчере задач), найденный через HWND
begin
  Memo1.Lines.Clear;
  cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
  GetMem(pmc, cb);
  pmc^.cb := cb;
  if GetProcessMemoryInfo(pid, pmc, cb) then
  begin
    Memo1.Lines.Add( FloatToStr(pmc^.WorkingSetSize/1024) + ' KB');
    Memo1.Lines.Add( FloatToStr(pmc^.PagefileUsage/1024) + ' KB');
  end;
  FreeMem(pmc);
end;

ничего не выводиться.

Последний раз редактировалось Vladimr, 16.02.2023 в 20:26.
Ответить с цитированием
  #4  
Старый 17.02.2023, 10:39
Shaft Shaft вне форума
Новичок
 
Регистрация: 15.05.2013
Сообщения: 74
Версия Delphi: 7/10.4
Репутация: 12
По умолчанию

Я обманул, судя по документации
BOOL GetProcessMemoryInfo(
[in] HANDLE Process,
[out] PPROCESS_MEMORY_COUNTERS ppsmemCounters,
[in] DWORD cb
);
не идентификатор нужно передавать а дескриптор
Вот так должно
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  pmc: PPROCESS_MEMORY_COUNTERS;
  cb: Integer;
  Proc: THandle;
  PID:DWORD; //pid процесса (как в диспетчере задач), найденный через HWND
begin
  Memo1.Lines.Clear;
  cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
  GetMem(pmc, cb);
  pmc^.cb := cb;
  Proc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID);
  if GetProcessMemoryInfo(Proc, pmc, cb) then
  begin
    Memo1.Lines.Add( FloatToStr(pmc^.WorkingSetSize/1024) + ' KB');
    Memo1.Lines.Add( FloatToStr(pmc^.PagefileUsage/1024) + ' KB');
  end;
  FreeMem(pmc);
  CloseHandle(Proc);
end;

Последний раз редактировалось Shaft, 17.02.2023 в 10:49.
Ответить с цитированием
Этот пользователь сказал Спасибо Shaft за это полезное сообщение:
Vladimr (17.02.2023)
  #5  
Старый 17.02.2023, 13:10
Vladimr Vladimr вне форума
Прохожий
 
Регистрация: 17.03.2021
Сообщения: 41
Версия Delphi: Delphi 7
Репутация: 10
По умолчанию

Все получилось.

функция
Код:
function EnumProcid (Wnd: HWnd; Param: LongInt): Boolean; stdcall; // Обязательно stdcall !!!
Var
    Nm:Array[0..255] of Char;  // буфер для имени
    Cs: Array[0..255] of Char; // буфер для класса
    PID:DWORD;
    Proc: THandle;
    pmc: PPROCESS_MEMORY_COUNTERS;
    cb: Integer;
    s:string;
Begin
    GetWindowText(Wnd,Nm,255); // считываем  текст заголовка окна
    GetClassName(Wnd,Cs,255); // считываем название класса окна

    cb := SizeOf(_PROCESS_MEMORY_COUNTERS);
    GetMem(pmc, cb);
    pmc^.cb := cb;

    GetWindowThreadProcessId(wnd,PID); //узнаем PID процесса через его HWND
    Proc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, PID); //пытаемся получить информацию о процессе

    if GetProcessMemoryInfo(proc, pmc, cb) then s:=FloatToStr(pmc^.WorkingSetSize/1024)+' / '+FloatToStr(pmc^.PagefileUsage/1024);

    if IsWindowEnabled(wnd) and IsWindowVisible(Wnd) then  Form1.ListBox1.Items.Add(inttostr(pid)+' / '+inttostr(wnd)+' / '+String(Cs)+' / '+String(Nm)+' / '+s); // Добавляем PID, HWND, название класса, заголовок окна и кол-во памяти в Кб
    EnumProcid := TRUE;  // продолжать искать окна…

    FreeMem(pmc);
    CloseHandle(Proc);
end;

Ее использование
Код:
procedure TForm1.Button6Click(Sender: TObject);
begin
    ListBox1.Items.Clear;         // Очистим список перед началом поисков
    EnumWindows (@EnumProcid, 0); // и скажем - искать
end;

Выводит PID и кол-во используемой памяти всех запущенных приложений как в диспетчере задач.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 17:41.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter