Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Получение декриптора окна по дескриптору процесса
DF2 :: ФОРУМЫ > Основные форумы > Софт и железо > Программирование / Coding
hippocamus
Есть код на Си.
Код
    
int pid = (ProcessID != 0)? ProcessID : int(GetCurrentProcessId());

HANDLE hss = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (int(hss) == (-1))  return false;

THREADENTRY32 thr;
thr.dwSize = sizeof(thr);

bool ret;
try {
for (bool loop = Thread32First(hss, &thr); loop; loop = Thread32Next(hss, &thr))
{  if ( int(thr.th32OwnerProcessID) != pid)    continue;
    ...
    HWND mhwnd = 0;
    EnumThreadWindows(thr.th32ThreadID, (WNDENUMPROC)My1_EnumThreadWndProc, long(&mhwnd));
    tnp->Code3 = long(mhwnd);
    ...
  }
ret = true;
}  // try
catch (...)  {  ... ret = false;  }

CloseHandle(hss);
return ret;
}


BOOL CALLBACK My1_EnumThreadWndProc
    (HWND hwnd    // handle to window
    ,LPARAM lParam // application-defined value
    )
{
*((HWND*)lParam) = hwnd;
return false;
}

Может ли кто-нибудь переложить это на Делфи, оформить в виде функции, принимающей дескриптор процесса, и возвращающий дескриптор окна?
Буду благодарен!
ChASnock
А что такое
Код
tnp->Code3
?

Короче, если tnp.Code3 - это дескриптор окна (out parameter), то:

Код
function WindowFromProcess(ProcessID: Integer): HWND;
var
  hss: HANDLE;
  mhwnd: HANDLE;
  thr: THREADENTRY32;
  loop: Boolean;

  function My1_EnumThreadWndProc(hwnd: HWND; lParam: LPARAM): Boolean;
  begin
    mhwnd := hwnd;
    Result := False;
  end;

begin
  Result := 0;

  if ProcessID = 0 then
    ProcessID := GetCurrentProcessID;

  hss := CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  if hss = -1 then
    Exit;

  thr.dwSize := SizeOf(thr);

  try
    loop := Thread32First(hss, @thr);
    while loop do
    begin
      if thr.th32OwnerProcessID <> pid then
        continue;
      ...
      mhwnd := 0;
      EnumThreadWindows(thr.th32ThreadID, WNDENUMPROC(My1_EnumThreadWndProc), 0);
      Result := mhwnd;
      ...

      loop := Thread32Next(hss, @thr);
    end;
  except
    ...
    Result := 0;
  end;

  CloseHandle(hss);
end;


Функция возвращает дескриптор окна от дескриптора процесса или 0, если failed.

P.S.: Снимаю с себя ответственность за испорченные процессоры и нервные клетки (если таковые будут))).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2025 IPS, Inc.