Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.09.2010, 18:09   #1
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию Узнать к какому процессу принадлежит известный класс окна

Всем привет=)
Ситуация такая:
Есть 5 одинаковых классов окон запущенных в системе от разных процессов.
как проверить к какому процессу принадлежит окно? Заголовки окон тоже одинаковые..

Допустим
Есть 5 классов окон все ConsoleWindowClass и заголовок у всех пяти "Console".

Последний раз редактировалось Человек_Борща; 01.09.2010 в 18:11.
Человек_Борща вне форума Ответить с цитированием
Старый 01.09.2010, 18:23   #2
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

копай в сторону getwindowthreadprocessid
_Engine_ вне форума Ответить с цитированием
Старый 04.09.2010, 19:47   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Гм.. так.. вот накопал =) Кое-чего вытащил из procInfo:
Код:
const
  // Размер буфера, резервируемого для имени класса при
// использовании функций GetClassName и GetReadWindowClass
  ClassNameLen = 512;

function EnumWindowProc(Wind: HWND; LI: TListItem): BOOL; stdcall;
var
  Text: string;
  TextLen: Integer;
  ClassName: array[0..ClassNameLen - 1] of Char;
begin
  Result := True;
  TextLen := GetWindowTextLength(Wind);
  SetLength(Text, TextLen);
  if TextLen > 0 then
    GetWindowText(Wind, PChar(Text), TextLen + 1);
  if TextLen > 100 then
    Text := Copy(Text, 1, 100) + ' ...';
  GetClassName(Wind, ClassName, ClassNameLen);
  ClassName[ClassNameLen - 1] := #0;
  LI := AddAppForm.AppWindList.Items.add;
  LI.Caption := IntToStr(Wind);
  LI.SubItems.Add(ClassName);
  if Text = '' then
    LI.SubItems.Add('без имени')
  else
    LI.SubItems.Add(Text);
end;

function EnumTopWindowProc(Wind: HWND; PID: Cardinal): BOOL; stdcall;
var
  Text: string;
  TextLen: Integer;
  ClassName: array[0..ClassNameLen - 1] of Char;
  WindPID: Cardinal;
  LI: TListItem;
begin
  Result := True;
  GetWindowThreadProcessId(Wind, @WindPID);
  if WindPID = PID then
  begin
    TextLen := GetWindowTextLength(Wind);
    SetLength(Text, TextLen);
    if TextLen > 0 then
      GetWindowText(Wind, PChar(Text), TextLen + 1);
    if TextLen > 100 then
      Text := Copy(Text, 1, 100) + ' ...';
    GetClassName(Wind, ClassName, ClassNameLen);
    ClassName[ClassNameLen - 1] := #0;
    LI := AddAppForm.AppWindList.Items.add;
    LI.Caption := IntToStr(Wind);
    LI.SubItems.Add(ClassName);
    if Text = '' then
      LI.SubItems.Add('без имени')
    else
      LI.SubItems.Add(Text);
    //EnumChildWindows(Wind,@EnumWindowProc,LParam(LI));
  end;
end;

function GetProcessPID(ExeFileName: string): Cardinal;
var
  ContinueLoop: Bool;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := 0;
  FSnapshotHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.DwSize := Sizeof(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
      AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
      AnsiUpperCase(ExeFileName))) then
      Result := FProcessEntry32.Th32ProcessID;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

function ProcessExists(ExeFileName: string): Boolean;
var
  ContinueLoop: Bool;
  FSnapshotHandle: THandle;
  FProcessEntry32: TProcessEntry32;
begin
  Result := False;
  FSnapshotHandle := CreateToolHelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  FProcessEntry32.DwSize := SizeOf(FProcessEntry32);
  ContinueLoop := Process32First(FSnapshotHandle, FProcessEntry32);
  while Integer(ContinueLoop) <> 0 do
  begin
    if ((AnsiUpperCase(ExtractFileName(FProcessEntry32.SzExeFile)) =
      AnsiUpperCase(ExeFileName)) or (AnsiUpperCase(FProcessEntry32.SzExeFile) =
      AnsiUpperCase(ExeFileName))) then
    begin
      Result := True;
    end;
    ContinueLoop := Process32Next(FSnapshotHandle, FProcessEntry32);
  end;
  CloseHandle(FSnapshotHandle);
end;

procedure GetWindList(PID: Cardinal);
begin
  if PID = 0 then
    Exit;
  EnumWindows(@EnumTopWindowProc, PID);
end;
но вот ситуация такая:
Допустим запущеный 2 одинаковые программы(копии) в консольном режиме.
соответственно 2 окна у обоих окон одинаковый классс ConsoleWindowClass.

Как надо сделать что-бы программа отличала их? т.е. как выводить в listview окна присущие только выбранному процессу...
Человек_Борща вне форума Ответить с цитированием
Старый 05.09.2010, 00:13   #4
_Engine_
Форумчанин
 
Регистрация: 29.06.2008
Сообщений: 603
По умолчанию

Написано на коленке, но думаю смысл понятен

Код:
Type
  ThreadsID = array of DWORD;


function GetProcessThreads(PID: Cardinal): ThreadsID;
 var snapHandle : DWORD;
     lpte : tagTHREADENTRY32;
begin
  SetLength(Result, 0);
  snapHandle := CreateToolhelp32Snapshot(TH32CS_SNAPALL, PID);
  if SnapHandle <> INVALID_HANDLE_VALUE then
    try
      lpte.dwSize := SizeOf(lpte);
      if Thread32First(snapHandle, lpte) then
      begin
        if lpte.th32OwnerProcessID = PID then
        begin
          SetLength(Result, length(Result) + 1);
          Result[high(Result)] := lpte.th32ThreadID;
        end;
        while Thread32Next(snapHandle, lpte) do
          if lpte.th32OwnerProcessID = PID then
          begin
           SetLength(Result, Length(Result) + 1);
            Result[high(Result)] := lpte.th32ThreadID;
          end;
      end;
    finally
      CloseHandle(snapHandle);
    end;
end;

procedure ListWindows;
 var thIDs : ThreadsID;
     i : Integer;
begin
  thIDs := GetProcessThreads(PID);
  for i :=  low(thIDs) to high(thIDs) do
    EnumThreadWindows(thIDs[i], @WindowEnumeration, i);
end;
_Engine_ вне форума Ответить с цитированием
Старый 05.09.2010, 00:27   #5
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

Код:
 EnumThreadWindows(thIDs[i], @WindowEnumeration, i);
@WindowEnumeration
я понимаю надо заменить на свою функцию в данном случае это EnumTopWindowProc?
Человек_Борща вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как узнать класс окна? ImmortalAlexSan Общие вопросы Delphi 3 01.08.2010 17:11
Как узнать какому классу принадлежит объект? boris-blade Общие вопросы .NET 3 08.04.2010 01:08
Каким образом можно узнать сборку, которой принадлежит определенный класс? Stilet Общие вопросы .NET 2 08.02.2010 15:19
Handle окна по процессу Sensizu Общие вопросы Delphi 9 08.01.2010 14:42
окна, принадлежащие процессу Var17 Win Api 3 04.12.2009 13:21