Пожалуйста, а то я залез в какие-то дебри, оставив позади себя простые истины. И не могу их найти. Итак, имеем стороннее приложение, которое создаёт несколько окошек и кое-что пишет в них с помощью DrawTextW, которую я намерен перехватить, когда она будет записывать нечто в ОДНО ИЗ ОКОН Для этого мне нужно найти дескриптор контекста устройства, который бы этому окну соответстовал. С помощью оконного менеджера, скачанного отсюда http://decoding.narod.ru/download/soft/objectviewer.zip нахожу хэндл окна. Потом с помощью такой вот проги нахожу дескриптор контекста устройства. Код (Text): #include <Windows.h> #include <stdio.h> #define handle_okna 1247792 /*предположим*/ int main () { printf ("%x", GetDC ((HWND) handle_okna)); getchar (); return 0; } Компилирую, запускаю. И вот пока на этом стоп. Вот 10 раз включу, появится 10 разных значений, как генератор случайных чисел кто-то включил. А аргумент-то GetDC один и тот же всегда! Хэндл окна неизменен, а дескрипоры его меняются постоянно причём. В общем, не пойму я, так должно быть, что ли? Спасибо.
я конечно не спец во всех этих окнах, но если учесть, что вся оконная инфа содержится в таблицах, общих для всех приложений, то можно сделать вполне логичный вывод: 1) последний выделенный дескриптор 0х100 2) запускаем наше приложение, естественно получаем 0х101 3) пока мы второй раз запустем приложение дескрипторы получают и освобождают десятки других приложений, что приводит к тому, что на момент второго запуска последний выделенный дескриптор может быть как больше, так и меньше 0х100.
А почему тебя не смущает, например, что CreateFile с одними и теми же аргументами всегда разные значения возвращает?
Я не пользовался CreateFile. Ну, или редко, раз-другой, буквально. Не настолько, чтобы заметит Ну, в общем, я понял, что так и должно быть, спасибо. А вообще я разницы не могу понять между дескриптором хэндлом идентификатором, допустим PID или потока (TID). Подставляю одно значение, не получилось- подставляю другое. Так вот, мыкаюсь.
amvoz GetDC не определяет (считывает откуда-то), а создаёт графический контекст для указанного окна. "Догадаться" об этом легко по тому факту что такие контексты после использования следует удалять ReleaseDC.
amvoz Почитай и это вот тоже. Там есть инфа про гди хэндлы и всё такое. Книга проскакивала здесь на сайте под название asmgrahics.rar. А название оригинальное название - Feng Yuan - Windows Graphics Programming Win32 Gdi And Directdraw.chm
Y_Mur Пошто путаете воина "догадками" ? GetDC не "создаёт" (как CreateDC), а - занимает, а ReleaseDC соответственно не "удаляет" (как DeleteDC), а - высвобождает, так ведь ?
kero Попробовал проверить догадку путём наблюдения за памятью процесса - сравнил её расход для GetDC и CreateCompatibleDC - в обоих случаях её расхода хватает только на создание нового handle Собственно вполне логичный результат - сама память для контекста выделяется ядром, а не в АП процесса, поэтому таким образом не определишь создаётся новый контекст или только новый handle. Но имхо совершенно нелогично в этом случае создавать новый handle (про появление которого и спрашивает ТС) для старого контекста.