![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Можно ли по ID просесса узнать хендл окна этого просесса ? [D5, WinXP]
-=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. Тем более что не всегда у процесса больше одного потока и не всегда во вторичных потоках есть окна - задача может упростися.