завис ? не завис ? ...

  • Автор темы Spoiler
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Barmutik

Бррр .. а зачем вы пытаетесь искать название окна по идентификатору процесса ?

Вы передаёте в Вашу функцию идентификатор процесса и потом используете его вместо названия класс окна от которого могло быть порождено окно, которое вы ищите... полные непонятки!
 
S

Spoiler

Бррр .. а зачем вы пытаетесь искать название окна по идентификатору процесса ?

Вы передаёте в Вашу функцию идентификатор процесса и потом используете его вместо названия класс окна от которого могло быть порождено окно, которое вы ищите... полные непонятки!

Понял.

Тогда у меня возник вопрос. Можно какнибудь узнать идентификатор окна зная имя процесса. ( В самом первом посте я говорил именно о таком варианте )
 
B

Barmutik

Воспользуйтесь опять же функцией CreateToolhelp32Snapshot с параметром TH32CS_SNAPTHREAD что бы получить все потоки .. найти среди них те которые принадлежат к Вашему потоку,Ю потому у них каждого потока проверять список окон .. искать верхнее и к нему пытаться применить Вашу функцию...

Или переибирать все окна по очереди с помощью FindWindow далее с помощью GetWindowThreadProcessId смотреть принадлежит ли окно Вашему процессу и далее опять вызывать Вашу функцию...

Так же вот случано на галаза попаласть функция самой системы которая говорит повисло или не повисло окно: IsHungAppWindow

Так что найдя окно можно вызывать сразу её...
 
S

Spoiler

Что то я окончательно затупил
Может поможеш с ниже приведенным кодом
Код:
Function READ_PC_IN_RAM : string;
 var
     ContinueLoop    : BOOL;
     FSnapshotHandle : THandle;
     FProcessEntry32 : TProcessEntry32;
begin
 FSnapshotHandle := CreateToolhelp32Snapshot
 (TH32CS_SNAPPROCESS, 0);
 FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
 ContinueLoop := Process32First(FSnapshotHandle,
 FProcessEntry32);

 while integer(ContinueLoop) <> 0 do
 begin

имя процесса - ExtractFileName(FProcessEntry32.szExeFile);
как реализовать сам перебор окон ( предполагаю, что, но раньше никогда с этим не работал FINDWindow ) с последующим сравнением хандла окна и процессом + вызов функции
  

     ContinueLoop := Process32Next( FSnapshotHandle, FProcessEntry32 );
     INC( RD );
 end;
end;
 
S

Spoiler

В инете достал функцию опенпроцесс. Через нее пытаюсь достать хэндл лкна оприаясь на PID процесса.

Ниже привел пример посылки сообщения.
Проблема в том, что седмессэйдж от всех процессов возвращает ноль. ( в доке по функции 0 - процесс висит, не ноль окно дало ответ не запрос соответственно окно не висит ).

Прояните, что делаю не так ... :(

Function READ_PC_IN_RAM : string;
var
ContinueLoop : BOOL;
FSnapshotHandle : THandle;
FProcessEntry32 : TProcessEntry32;
begin
FSnapshotHandle := CreateToolhelp32Snapshot
(TH32CS_SNAPPROCESS, 0);
FProcessEntry32.dwSize := Sizeof(FProcessEntry32);
ContinueLoop := Process32First(FSnapshotHandle,
FProcessEntry32);

while integer(ContinueLoop) <> 0 do
begin

SendMessageTimeOut (
OpenProcess(STANDARD_RIGHTS_REQUIRED or SYNCHRONIZE or $0FFF, True, FProcessEntry32.th32ProcessID),
WM_NULL,
0,
0,
SMTO_NORMAL or SMTO_ABORTIFHUNG,
100,
Res);

ContinueLoop := Process32Next( FSnapshotHandle, FProcessEntry32 );
INC( RD );
end;
end;
 
B

Barmutik

В SendMessageTimeOut требуется передавать хэндл окна а не процесса.
 
S

Spoiler

Я знаю пид процесса и его имя.
Как зная эти параметры можно узнать хэндл окна конкретного приложения.

Помогите ПЛИЗ
 
B

Barmutik

Я уже отвечал на этот вопрос.. смотрите выше...у процесса в общем случае может быть N(произвольное количество) окон
 
S

Spoiler

Вобщем набросал следующий примерчик.

Перебираю все процессы, нахожу нужный ( например opera.exe ) и определяю его ПИД, затем запускаю цикл по поиску хэндла окна с проверкой ( пытаюсь перебрать все окна и узнать у них пид через хэндл )

у найденного хэндла определяю пид и сравниваю с пидом текущего приложения. Вот сдесь и проблема. Цикл не завершается.

У меня вопрос по по равильности использованию функции FindWindow( nil, nil );

Посоветуйте где у меня здесь ошибка ...

begin
form1.L.Items.Add( ExtractFileName( FProcessEntry32.szExeFile ) );
HProgramm_ID := FProcessEntry32.th32ProcessID;
form1.L1.Items.Add( inttostr( HProgramm_ID ) );
if AnsiLowerCase( ExtractFileName( FProcessEntry32.szExeFile ) ) =
AnsiLowerCase( Form1.Edit1.Text ) then begin
repeat

H := FindWindow( nil, nil );
Form1.Edit2.Text := inttostr( H );
Form1.Edit3.Text := inttostr( GetWindowThreadProcessId( H, nil ) );

Application.ProcessMessages;

until GetWindowThreadProcessId( H, nil ) = HProgramm_ID;

end;
ContinueLoop := Process32Next( FSnapshotHandle, FProcessEntry32 );
end;
 
S

Spoiler

раньше испольовать FindWindow( nil, nil ); не приходилось. Какие параметры надо использовать в данной функции
 
S

Spoiler

Люди, скажите где я неправ ( я думаю истина уже где то рядом )
 
S

Spoiler

Цикл перебора окон возвращает, всегда одно и тоже значение, как будто он топчется на месте, и к следующему окну он не переходит
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!