снова mirror driver
От: Neco  
Дата: 26.08.07 14:22
Оценка:
Не понимаю как работать с 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 подписывается на эти сообщения? или оповещения рассылаются всем окнам?

В общем, методом тыка ничего не получается выяснить — объясните, пожалуйста, кто-нибудь — как всё это должно работать?
всю ночь не ем, весь день не сплю — устаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.