Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Можно ли по ID просесса узнать хендл окна этого просесса ? [D5, WinXP]


Страницы:   1 2 3

-=SS=- ©   (2004-12-15 18:17:00) 

Собственно ИМХО может кто знает какие - то апишные функции
зараннее благодарен


GuAV   (2004-12-18 01:28:00) [21]


> http://www.schevchenko.net.ru/SRC/EnumFunctions_60.zip


Мой склероз. Я это смотрел несколько дней назад.

Кстати, Ваш критерий тоже неточен :-)

Проверку из EnumFunctions_60
if (WindowOwner = 0) AND
    ((ExStyle AND WS_EX_TOOLWINDOW) = 0) AND
    ((WinStyle AND WS_VISIBLE) <> 0) then


не проходит такое окно

 CreateWindowEx(WS_EX_APPWINDOW or WS_EX_TOOLWINDOW,
   'BUTTON', 'I''m on taskbar', WS_VISIBLE, 0, 0, 0, 0, HWND_DESKTOP, 0, 0, 0);


Игорь Шевченко   (2004-12-18 00:54:00) [22]

GuAV ©   (18.12.04 00:44) [26]


> А как тогда определить отображается окно на taskbar ?


http://www.schevchenko.net.ru/SRC/EnumFunctions_60.zip

(Только сделал апгрейд, файлы черт знает где, прошу прощения, что приходится ссылку на сайт давать)

С уважением,


Piter   (2004-12-18 00:44:00) [23]

GuAV ©   (17.12.04 23:22) [23]

имхо, первое окно, созданное приложением и есть "главное", то есть отображается на Панели Задач


GuAV   (2004-12-18 00:44:00) [24]

Игорь Шевченко ©   (17.12.04 23:53) [24]

Да..

А как тогда определить отображается окно на taskbar ?

WS_EX_APPWINDOW
Forces a top-level window onto the taskbar when the window is visible.


Игорь Шевченко   (2004-12-17 23:53:00) [25]

GuAV ©   (17.12.04 23:22) [23]

У окон, отображаемых на Taskbar не обязательно имеется стиль  WS_EX_APPWINDOW. Точнее, большинство отображаемых на таскбаре окон этого стиля не имеет :)

С уважением,


GuAV   (2004-12-17 23:22:00) [26]

-=SS=- ©   (16.12.04 10:46) [14]
Теперь надо будет определять если процесс имеет окна, то как определить главное окно ?


Если под "главным окном" понимать окно для которого создаётся кнопка на панели задач, то можно проверить (с пом GetWindowLong) extended style на наличие признака кнопки на панели задач (WS_EX_APPWINDOW).


Piter   (2004-12-17 20:50:00) [27]

Сори, это я уже лажанулся. Ты просто переделал пример для поиска процессов. Ок, тогда остаются вопросы:

Piter ©   (17.12.04 19:30) [21]
Ну и какой смысл в молчанку играть? Почему информацию надо вытягивать, как будто это мне нужно? :)

ЧТО возвращает CreateToolhelp32Snapshot? Если ошибочный Handle - что возвращает GetLastError?


Piter   (2004-12-17 19:30:00) [28]

Ну и какой смысл в молчанку играть? Почему информацию надо вытягивать, как будто это мне нужно? :)

ЧТО возвращает CreateToolhelp32Snapshot? Если ошибочный Handle - что возвращает GetLastError?

а-а-а-а-а-а-а-а.... гы гы.

begin
H := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
Memo1.Clear;
If Process32First(H, P) then
  Memo1.Lines.Add(P.szExeFile)
until Process32Next(H, P) = False;


Нда, я плакаль. Предлагаю найти самому ошибку.

P.S. А также неплохо было бы узнать - откуда ты это собственно взял, если в [10] я привел рабочий код? Из моего FAQ'а что ли?

Тупой Copy-Paste приводит к ошибкам :)


-=SS=-   (2004-12-17 10:37:00) [29]

Я конечно извеняюсь но причем тут EnumWnd.

begin
 H := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
 Memo1.Clear;
 If Process32First(H, P) then
   Memo1.Lines.Add(P.szExeFile)
 until Process32Next(H, P) = False;

Этот код на D5 работает т.е показывает всё процессы, а на D7 не работает т.е не показывает ни одной записи (WIN XP)
кстати Директива stdcall стоит но она используется пожже, но всё равно все работает (Под D5)


Piter   (2004-12-16 23:12:00) [30]

И вместо абстрактного "не работает" почему бы не сказать где именно затык?

P.S. Так как у меня уровень телепатии уже второго уровня, попробую сказать - ты точно в function EnumWndпоставил директиву stdcall;


Piter   (2004-12-16 23:09:00) [31]

-=SS=- ©   (16.12.04 22:34) [17]
Незнаю почему но под DELPHI 7 TollHelp32 не работает


все работает...


-=SS=-   (2004-12-16 22:34:00) [32]

Незнаю почему но под DELPHI 7 TollHelp32 не работает ... а вот на 5 Delphi работает ... и даже неизвестно почему


Leonid Troyanovsky   (2004-12-16 21:17:00) [33]


> Piter ©   (16.12.04 20:16) [15]
> Ах да, для моего примера [10] нужно подключить юнит TLHelp32


Это само собой. Но, этим ты не отвертишься ;)
Формально, NT4 еще имеет право на жизнь, а там такого
понятия, как ToolHelp functions, нет.
Т.е., включаешь ремарку "исключая NT4".

--
С уважением, LVT


Piter   (2004-12-16 20:16:00) [34]

Ах да, для моего примера [10] нужно подключить юнит TLHelp32

Leonid Troyanovsky ©   (15.12.04 23:03) [11]
Игорь Шевченко ©   (16.12.04 10:43) [13]

понял

-=SS=- ©   (16.12.04 10:46) [14]
Теперь надо будет определять если процесс имеет окна, то как определить главное окно ?


не знаю. И вообще сомневаюсь, что в WinApi есть понятие "главное окно".

Лучше объясни задачу - зачем тебе главное окно? Видимо, ты что-то не так понимаешь...


-=SS=-   (2004-12-16 10:46:00) [35]


> Piter ©   (15.12.04 22:14) [10]

Толково.... спасибо...
Осталась маленькая проблемка ... ну это я думаю что порывшись в хелпе найду что - то подходящее ... Теперь надо будет определять если процесс имеет окна, то как определить главное окно ?


Игорь Шевченко   (2004-12-16 10:43:00) [36]

Piter ©   (16.12.04 00:42) [12]


> а что не так? Я не понял...


Я бы написал вместо


> function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean;
> stdcall;


function EnumWnd(Handle: hwnd; UnicID: LPARAM): BOOL; stdcall;

С уважением,


Piter   (2004-12-16 00:42:00) [37]

Leonid Troyanovsky ©   (15.12.04 23:03) [11]
BOOL CALLBACK EnumThreadWndProc
Хотя, в данном случае это, возможно, не принципиально,
но, вообще-то, надо поаккуратней с хидерами.


а что не так? Я не понял...


Leonid Troyanovsky   (2004-12-15 23:03:00) [38]


> Piter ©   (15.12.04 22:14) [10]

> function EnumWnd(Handle: hwnd; UnicID: LPARAM): boolean;
> stdcall;


 BOOL CALLBACK EnumThreadWndProc
 Хотя, в данном случае это, возможно, не принципиально,
 но, вообще-то, надо поаккуратней с хидерами.

--
С уважением, LVT.

PS  Кстати, Toolhelp32 отсутствует в NT4.


Piter   (2004-12-15 22:14:00) [39]

procedureSearchHandle(ProcessId: DWORD; CallbackFunction: TFNWndEnumProc;
   UnicID: LPARAM);
var
 HSnapShot: THandle;
 te: TThreadEntry32;
begin
  //нам нужен снимок потоков
 HSnapShot:=CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
  try
    //перед использованием TThreadEntry32 нужно заполнить поле dwSize
   te.dwSize := sizeof(TThreadEntry32);
    // если первая запись о потоках получена - продолжаем
    ifThread32First(HSnapShot, te) then
     repeat
        // если этот поток относится к интересующему нас процессу, то
        // перечисляем все окна, созданные этим потоком
        ifte.th32OwnerProcessID = ProcessId then
         EnumThreadWindows(te.th32ThreadID, CallbackFunction, UnicID);
// получаем запись о следующем потоке, если не получаем - выходим из цикла
      until( notThread32Next(HSnapShot,te) );
  finally
   closehandle(HSnapShot); // закрываем описатель снимка
  end;
end;

functionEnumWnd(Handle: hwnd; UnicID: LPARAM): boolean; stdcall;
begin
 Result := True;
 PostMessage(Handle, WM_CLOSE, 0, 0);
end;

procedureTForm1.Button1Click(Sender: TObject);
begin
 SearchHandle(GetCurrentProcessId, @EnumWnd, 0);
end;

-------------------------------------------------------------

SearchHandle ищет все окна заданного процесса. При нахождении очередного окна вызывается функция CallbackFunction, которой в данном случае является  EnumWnd. Она посылает WM_CLOSE всем окнам.

Так как вызывается:
SearchHandle(GetCurrentProcessId, @EnumWnd, 0);
то код приводит к посылке сообщений WM_CLOSE всем окнам данного процесса...


GuAV   (2004-12-15 21:56:00) [40]

IMHO лучше найти все потоки процесса и искать окно в потоках с помощью EnumThreadWindows. Тем более что не всегда у процесса больше одного потока и не всегда во вторичных потоках есть окна - задача может упростися.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо