Не понимаю как работать с mirror driver'ом.
Сбился в поисках последовательности действий, чтобы понять, что к чему. Исходники VNC очень большие — не разобраться вовек.
Есть ddk 2003 — ставлю.
Пример в папке mirror "просто так" ничего не показывает. Раскомментировал строку "CreateMyWindow...", и поставил MessageBox после создания окна — в окне всё синее.
Что характерно при поисках, обнаруживал как топики со словами "откомпилил ММ пример, всё работает, но...." и далее по тексту, что там его не устраивает; так и топики со словами "данный пример — просто пустышка, нужно многое дописывать ручками".
Итак, вопросы:
1. Пример драйвера в ddk полноценный? На его базе возможно написать аналог радмина?
2. Пример программы, использующей этот драйвер, в ddk законченный? т.е. должен ли он показывать кусок экрана или нет? Просто чтобы знать, что у меня что-то не так как у всех с системой.
3. Каков порядок действий, при подписывании своей программы на изменения экрана? Вначале я так понял идёт это: ========================
1. в реестре проставляем 1 в значении Attach.ToDesktop.
2. выполняем ChangeDisplaySettingsEx — видимо драйвер перечитывает реестр и цепляется к экрану, если там 1.
3. дальше идёт кусок кода:
HDC hdc = CreateDC("DISPLAY",
deviceName,
NULL,
NULL);
printf("hdc1=%d\n",hdc);
// we should be hooked as layered at this point
HDC hdc2 = CreateCompatibleDC(hdc);
printf("hdc2=%d\n",hdc2);
// call DrvCreateDeviceBitmap
HBITMAP hbm = CreateCompatibleBitmap(hdc, 100, 100);
SelectObject(hdc2, hbm);
BitBlt(hdc2, 0, 0, 50, 50, hdc, 0, 0, SRCCOPY);
// delete the device context
DeleteDC(hdc2);
DeleteDC(hdc);
который я видел в примерах и без драйвера (только там было GetDC(0) — с рабочего стола, видимо) — это снимок с нашего mirror-устройства, я так понял. Но вот чего я не понял, так почему, когда я заменяю deviceName на любую другую надпись, всё работает как и работало — разве не должен был CreateDC вернуть 0?
========================
дальше начинается неразбериха — если оповещение драйвером об изменениях происходит через оконные сообщения, то как окно из CreateMyWindow подписывается на эти сообщения? или оповещения рассылаются всем окнам?
В общем, методом тыка ничего не получается выяснить — объясните, пожалуйста, кто-нибудь — как всё это должно работать?
N>Итак, вопросы: N>1. Пример драйвера в ddk полноценный? На его базе возможно написать аналог радмина?
Нет. Да — только в качестве базы.
N>2. Пример программы, использующей этот драйвер, в ddk законченный? т.е. должен ли он показывать кусок экрана или нет? Просто чтобы знать, что у меня что-то не так как у всех с системой.
Нет.
N>3. Каков порядок действий, при подписывании своей программы на изменения экрана? Вначале я так понял идёт это: N>======================== N>1. в реестре проставляем 1 в значении Attach.ToDesktop. N>2. выполняем ChangeDisplaySettingsEx — видимо драйвер перечитывает реестр и цепляется к экрану, если там 1. N>3. дальше идёт кусок кода: N>который я видел в примерах и без драйвера (только там было GetDC(0) — с рабочего стола, видимо) — это снимок с нашего mirror-устройства, я так понял. Но вот чего я не понял, так почему, когда я заменяю deviceName на любую другую надпись, всё работает как и работало — разве не должен был CreateDC вернуть 0? N>========================
Должен. И возвращает.
N>дальше начинается неразбериха — если оповещение драйвером об изменениях происходит через оконные сообщения, то как окно из CreateMyWindow подписывается на эти сообщения? или оповещения рассылаются всем окнам?
Там просто заготовка — никакого обмена нет. Смотрите ExtEscape, впрочем, можно и другие механизмы использовать — как в обычных драйверах. Но будут проблемы с синхронизацией, которая в ExtEscape выполняется автоматически.
передумал пока писать свой драйвер — решил воспользоваться бесплатным миражом (dfmirage).
копаюсь в исходниках vnc.
если будут результаты, выложу здесь.
AS>> используйте отрицательную высоту при создании диб секции. N>Большое спасибо! N>Помогло!
Я бы порекомендовал вам сделать все основное в unmanaged, потому как то, что сейчас делаете вы, будет безбожно тормозить. Вытащить нужные интерфейсы наружу в виде функций или COM объекта и спокойно пользовать. Это будет куда как практичнее, особенно с учетом последующей обработки полученных изменений. Вообще, откровенно, не понимаю, зачем такие вещи могу пригодится непосредственно в managed коде. Там, где требуется хоть какая-то минимальная производительность при взаимодействии с системой, managed пока что делать нечего.
А>а можно попросить на мыло (dabeat@bk.ru) экзампл который юзает этот класс, а то второй день мучаюсь а результата 0 (((
За нормальным и работающим примером идём на сайт TightVNC и качаем исходники. Всё, что относится к mirror-драйверу, лежит в файлах VideoDriver.h и VideoDriver.cpp.