IPB

Здравствуйте, гость ( Вход | Регистрация )

> Получение декриптора окна по дескриптору процесса, на с++, а надо на delphi
hippocamus
сообщение 25 Mar 2011, 22:38
Сообщение #1

допустим, мяў
Сообщений: 24 057
Спасибо сказали: 13360 раз




Есть код на Си.
Код
    
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;
}

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


--------------------
Вокруг столько фильмов, книг, музыки - а природа какая невероятная!
Если тебе скучно жить - ты совсем дурак. (Татьяна Черниговская)
Go to the top of the pageAdd Nick
 
+Quote Post
 
Start new topic
Ответов (1 - 1)
ChASnock
сообщение 26 Mar 2011, 11:49
Сообщение #2

Geoff Snock | 茶スノック
Сообщений: 533
Спасибо сказали: 248 раз




А что такое
Код
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.: Снимаю с себя ответственность за испорченные процессоры и нервные клетки (если таковые будут))).


--------------------
гномов сопротивляются заклинанию!

Цитата
Фейспалмы свои себе в сракотан засуньте, если больше сказать нечего.
Go to the top of the pageAdd Nick
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 26 June 2025 - 18:51
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика