Это немного запутанная тема, поэтому давайте посмотрим, смогу ли я кое-что прояснить.
Сначала обо всем: как Дэвид, так и Бен уже ответили, вы передаете дескриптор процесса в функцию GetDC
, что неправильно. GetDC
принимает дескриптор окна (тип HWND
) и возвращает контекст устройства (DC, тип HDC
), соответствующий этому окну. Вам нужно исправить это, прежде чем что-нибудь еще сработает.
Теперь, как показывает прочитанная статья, окна (при условии, что они были правильно запрограммированы) реагируют на сообщения WM_PRINT
или WM_PRINTCLIENT
, визуализируя свое изображение в указанном контексте устройства (HDC
). Это простой и эффективный способ захвата «изображения» окна, будь то перекрывающееся окно или окно отдельного элемента управления.
Проблема возникает, как упоминал Ганс в комментарии, потому что имеет отношение к контекстам устройства и имеет сходство процессов , что означает, что HDC
вы передаете окну в отдельном процессе, в который он входит. Предполагается, что будет отображаться сам, не будет действительным от этого другого процесса. Дескрипторы к контексту устройства не могут быть переданы через границы процесса. Это основная причина, по которой ваш код не работает (или собирается потерпеть неудачу, как только вы исправите проблемы с типом дескриптора). Запись MSDN для объектов GDI ясно дает понять:
Дескрипторы объектов GDI являются частными для процесса. То есть только процесс, создавший объект GDI, может использовать дескриптор объекта.
Исправить или обойти это будет тяжелым сражением. Единственное известное мне решение состоит в том, чтобы ввести код в процесс другого приложения, который сначала создает DC в памяти, а затем отправляет сообщение WM_PRINT
или WM_PRINTCLIENT
в окно, принадлежащее этому процессу, для рисования в это устройство в памяти контекста, а затем передает полученное растровое изображение обратно в ваше собственное приложение. Это потребует от вас реализации какого-либо механизма межпроцессного взаимодействия.
Я видел некоторые неподтвержденные доказательства того, что передача контекста устройства между процессами с помощью сообщений WM_PRINT
и WM_PRINTCLIENT
«работает», но мне неясно, является ли это артефактом текущей реализации (и поэтому подвержен в будущих версиях Windows), или, если это так, потому что Windows фактически обрабатывает маршалинг между процессами. Я не видел никакой документации, так или иначе. Если это разовый проект, который вы делаете для развлечения или для ограниченного использования, вы можете попробовать его и сойти с рук. Для других целей вы, вероятно, захотите исследовать использование IPC, чтобы действительно сделать это правильно.