![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
GetWindowThreadProcessId() [D6, Win2k]
VMcL © (2004-02-09 15:23:00)Дано:
- некая программа, пользующая глобальный хук на клавиатуру и мышь;
- некая процедура в этой программе (не в DLL), которая вызывает subj.
Обнаружено, что:
- при исполнении программы под Delphi IDE отладчиком при включенных хуках, выполнение subj приводит к повису ОС; "отвиснуть" ОС можно только с помощью {Ctrl+Alt+Del + Log Off} или {Alt+Tab на Far + Список Процессов + погасить (F8) delphi32.exe};
- при исполнении программы не под Delphi IDE отладчиком или в случае, если хуки отключены, вызов subj проходит нормально и возвращает корректное значение.
Вопрос
Почему вызов subj приводит к зависанию? Ведь subj вроде как не посылает сообщений по типу SendMessage().
P.S. Промежуточное решение реализовано так:
if not IsDebuggerPresent() then GetWindowThreadProcessId(...)
но это не есть хорошо, во время отладки программа частично теряет функциональность.
VMcL (2004-02-24 21:39:00) [1]Готово. Благодарности Игорю Шевченко впечатаны в About ;)
VMcL (2004-02-10 22:20:00) [2]Проблема решена посредством [6].
P.S. Напоролся на еще одни грабли a-la subj: GetModuleFileNameEx. Но обошел их.
Если в течение пары дней ни у кого не будет других замечаний, считаю, что ветку можно закрыть.
Владислав (2004-02-10 20:46:00) [3]Ну если нам условная компиляция помогает, либо прочие "ухищрения", то невнимательные отдыхают...
VMcL (2004-02-10 20:36:00) [4]>>Владислав © (10.02.04 20:09) [15]
Для особо внимательных повторяю:
А отлаживаюя под Win2K.
Владислав (2004-02-10 20:09:00) [5]95 не рассматривается?..
VMcL (2004-02-10 19:51:00) [6]>>Игорь Шевченко © (10.02.04 12:05) [7]
Ну проблема вобщем-то только при отладке. А отлаживаю я под Win2K. Так что могу тогда оставить проверку IsDebuggerPresent(), но в случае присутствия отладчика не пропускать получение Process ID, а получать его с помощью [6] или [7].
Отдельное спасибо Игорю Шевченко, надо будет не забыть упомянуть его в своей программе :)
Владислав (2004-02-10 19:38:00) [7]Бесспорно.
Игорь Шевченко (2004-02-10 19:07:00) [8]
> : "Until the thread terminates"
Тогда и окон не будет. См. сабж.
Владислав (2004-02-10 18:31:00) [9]Игорь Шевченко © (10.02.04 18:18) [10]
Бывает, но с другой стороны нельзя забывать ключевые слова: "Until the thread terminates" ;)
Игорь Шевченко (2004-02-10 18:18:00) [10]Владислав © (10.02.04 17:45)
Упс. Спасибо, я похоже, с Handle спутал...
Владислав (2004-02-10 17:45:00) [11]Это из Platform SDK:
Until the thread terminates, the thread identifier uniquely identifies the thread throughout the system.
Игорь Шевченко (2004-02-10 12:06:00) [12]Кстати, иначе не получится, так как ThreadID не уникальный в системе, а уникальный внутри процесса.
Игорь Шевченко (2004-02-10 12:05:00) [13]Если тебе надо только в Win2k, то NtQuerySystemInformation вместо ToolHelp, пример в http://www.schevchenko.net.ru/SRC/QuerySystemInformation_60.zip
VMcL (2004-02-09 20:57:00) [14]>> Игорь Шевченко © (09.02.04 15:57) [4]
GetWindowThreadProcessId(AWnd, nil);
Не зависает, но мне это не очень нравится, так как нужен именно Process ID :((
Вижу следующее изощрение:
1. Получить всё-таки не Process ID, а Thread ID.
2. CreateToolhelp32Snapshot + Thread32First + Thread32Next => находим Thread => THREADENTRY32.th32OwnerProcessID
Но я так не хочу, извращением попахивает :)
VMcL (2004-02-09 16:12:00) [15]>>[4]
Исходники дома. Приду проверю. Thanx.
Игорь Шевченко (2004-02-09 15:57:00) [16]subj вызывает блокировку диспетчера Win32 на время выполнения запроса, внутри самой реализации NtQueryWindow вроде, ничего, приводящего к зависанию нету - получение нужного потока/процесса.
Еще вопрос: как известно, в Subj можно указать получение только ID потока, задав параметр ProcessID равный 0. Будет ли программа зависать и в этом случае ?
VMcL (2004-02-09 15:51:00) [17]>[1]+[2]
В том числе и окна delphi32.exe.
VMcL (2004-02-09 15:46:00) [18]>потенциально любого
Игорь Шевченко (2004-02-09 15:44:00) [19]Первый вопрос: Окна своего процесса опрашиваются или потенциально любого ?