Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.12.161.77] |
|
Страницы: (4) « Первая ... 2 3 [4] все ( Перейти к последнему сообщению ) |
Сообщ.
#46
,
|
|
|
2e-yes: это в принципе неправильный код! Почитай мессаги повыше.
А насчёт кнопки на таскбаре... Не знаю, может быть... Ладно, я завтра пороюсь, сообщу результаты. |
Сообщ.
#47
,
|
|
|
Цитата V4n93R<RnD>, 14.04.03, 14:43:39 2e-yes: это в принципе неправильный код! Почитай мессаги повыше. Думаешь я не читал? |
Сообщ.
#48
,
|
|
|
По ходу дела __alex всё-таки был прав.
Смотрите. Я заношу в массив хэндлы всех окон, а затем начинаю поиск всех процессов. Для каждого процесса перебираю все окна и сравниваю id их владельцев (GetWindowThreadProcessId) со значением ProcessID найденного процесса. Если совпадение найдено и окно видимое, вывожу GetWindowText последнего в списке совпавшего окна (вернее первого, но я начинаю поиск с конца), иначе вывожу с заглавной буквы имя файла процесса (без расширения). Я сравнивал результат работы этой программы со списком, вызываемым по Ctrl-Alt-Del. Всё совпадает. Отличия небольшие: [*] У меня нет Explorer'а [*] У меня Winoa386, а у него - Winoldap [*] У него нет Kernel32, Msgsvr32, mmtask, Mprexe [*] Список в другом порядке Вот код. Необходимо создать кнопку Button1 и список ListBox1. var<br> Win: array [1..1024] of DWord;<br> WC: DWord;<br> i: DWord;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br><br> function EnumWindowsProc(H, LP: DWord): Boolean; stdcall;<br> begin<br> Inc(WC);<br> Win[WC] := H;<br> EnumWindowsProc := True<br> end;<br><br>var<br> TH, P: DWord;<br> PE: TProcessEntry32;<br> Found, Ok: Boolean;<br> Title: PChar;<br><br>begin<br> GetMem(Title, 4096);<br> ListBox1.Clear;<br> WC := 0;<br> EnumWindows(@EnumWindowsProc, 0);<br> TH := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);<br> Found := Process32First(TH, PE);<br> while Found do<br> begin<br> Ok := False;<br> for i := WC downto 1 do<br> begin<br> GetWindowThreadProcessId(Win[i], @P);<br> if IsWindowVisible(Win[i]) and (P = PE.th32ProcessID) then<br> begin<br> Ok := True;<br> Break<br> end<br> end;<br> if Ok then<br> begin<br> GetWindowText(Win[i], Title, 4096);<br> Ok := (Title[0] <> #0)<br> end;<br> if not Ok then<br> begin<br> StrPCopy(Title, ExtractFileName(PE.szExeFile));<br> (StrEnd(Title)-Length(ExtractFileExt(PE.szExeFile)))^ := #0;<br> StrLower(Title+1)<br> end;<br> ListBox1.Items.Add(Title);<br> Found := Process32Next(TH, PE)<br> end;<br> CloseHandle(TH);<br> FreeMem(Title, 4096)<br>end; |
Сообщ.
#49
,
|
|
|
о небольших отличиях:
Цитата У меня Winoa386, а у него - Winoldap если глянуть версию файла winoa386.exe, то InternalName=WINOLDAP. Цитата У него нет Kernel32, Msgsvr32, mmtask, Mprexe ну и правильно - это же список задач а не процессов если в своей проге вызвать RegisterServiceProcess, то и она исчезнет из это списка. но и кнопку на таскбаре тоже надо учесть - все же в списке задач (как в win9x, так и в winnt+) отображается не заголовок окна, а текст этой кнопки. |