Здравствуйте вижу тут народ серьезный может ктонибудь тут сможет ответить. Вообщем хочю сделать снятие скриншота и сжатие его по размеру, также как делает Radmin. Вижу что Radmin юзает mirror display driver. Начал разбираться с этим прибамбасом, в DDK нашол пример src\video\displays\mirror. Там якобы как пишет M$ есть пример и сам драйвер. Скомпилировал я драйвер и пример. Драйвер установил нормально. Вот так выглядит С этим у меня проблем нету. Но когда я запускаю пример я кроме инфы о драйвере ничего не вижу. Как-же с ним всётаки работать? В readme написано что типа показывает, но реально ничего невижу. Уже обыскал интернет весь то это точно я уверен. Как-же всё-таким им пользоваться ? :rolleyes:
его нужно приаттачить к десктопу --- указать origin и width/height, после чего ты сможешь подписаться на вызовы GDI. чтобы отодрать его обратно - сделать тоже самое, но width = height = 0. в DDK всё описано, смотреть по ключевому слову ChangeDisplaySettingsEx.
Kelt, извиняюсь что непонимаю всё. Читал я доки т не один раз прочел про Mirror Drivers и Mirror Driver Installiation, но саму суть так и немогу понять. Очень прошу помочь. А именно мне вот что непонятно всетаки: Что они понимают под словом десктоп? И как подписаться на вызовы GDI(при помощи какой(-их) Api функций) если точнее как их ловить?
nbyte Начну с простого: нафига Mirror Driver нужен в твоем случае. RAdmin (и прочие подобные тулзы) так или иначе посылают изображение по сети. Для уменьшения траффика, один раз посылается весь экран целиком, дальше посылаются только измененные части. Есть несколько способов определить измененные части, например сделать два последовательных скриншота и побайтово их сравнить Это плохо, ибо сильно нагружает процессор. Другой вариант: воспользоваться Mirror Driver'ом для отслеживания изменившихся регионов. Теперь чуть глубже. Видел когда-нибудь мультимониторные системы? Так вот. Каждый монитор (каждое графическое устройство) прцеплено куда-то на т.н. виртуальный десктоп. Ты можешь сделать длинную колбасу из трех дисплеев или, например, фигуру, напоминающую букву "г" (один дисплей снизу, другой справа). Так вот: Mirror Driver можно прицепить к какой-то точке этого виртуального дисплея и задать ему размер области, с которой он работает. Дальше, GDI будет дергать соответствующие методы твоего драйвера, если какие-либо пользовательские вызовы GDI будут затрагивать регион, к которому Mirror Driver прицеплен. По памяти примерно так Будут конкретные вопросы - задавай.
Спасибо за ответ. Да я изза этого делаю. Я в эту сторону и делаю . Меня интересуют следущие вопросы: 1.После того как я правильно заполню и сделаю вызов ChangeDisplaySettingsEx то как будет GDI (тоесть какие сообщения будут приходить или еше как либо)? 2.И еше вот что мне очень интересно насшет сжатия(изменение полученного изображения), как так быстро удаёться Radminu это сделать, у меня тока за 80ms получалось сжать качественно, тут скорей всего с Mirror Driver тоже чтото связано?
nbyte я делал аналог радмина. получился более медленный по скорости. пришел к выводу, что надо оптимизировать сжатие, возможно пользоваться алгоритмами типа mpeg, разделять пересылку и приготовление кадров
slow А как насчет структуры DEVMODEW, может там можно сжатие задать(по размеру)? Я немогу это проверить так как незнаю как получить изображение.
1. посмотри файлик disp\enable.c из примера. это оно и есть. там вначале идет табличка функций, на которые подписывается драйвер. её можно расширить до того состояния, которое тебе требуется. вот такого должно хватить: Код (Text): static DRVFN gadrvfn[] = { { INDEX_DrvEnablePDEV, (PFN) DrvEnablePDEV }, { INDEX_DrvCompletePDEV, (PFN) DrvCompletePDEV }, { INDEX_DrvDisablePDEV, (PFN) DrvDisablePDEV }, { INDEX_DrvEnableSurface, (PFN) DrvEnableSurface }, { INDEX_DrvDisableSurface, (PFN) DrvDisableSurface }, { INDEX_DrvAssertMode, (PFN) DrvAssertMode }, { INDEX_DrvDisableDriver, (PFN) DrvDisableDriver }, { INDEX_DrvBitBlt, (PFN) DrvBitBlt }, { INDEX_DrvCopyBits, (PFN) DrvCopyBits }, { INDEX_DrvTextOut, (PFN) DrvTextOut }, { INDEX_DrvEscape, (PFN) DrvEscape }, { INDEX_DrvGetModes, (PFN) DrvGetModes }, { INDEX_DrvStrokePath, (PFN) DrvStrokePath }, { INDEX_DrvStrokeAndFillPath, (PFN) DrvStrokeAndFillPath }, { INDEX_DrvStretchBlt, (PFN) DrvStretchBlt }, { INDEX_DrvPlgBlt, (PFN) DrvPlgBlt }, { INDEX_DrvStretchBltROP, (PFN) DrvStretchBltROP }, { INDEX_DrvLineTo, (PFN) DrvLineTo }, { INDEX_DrvAlphaBlend, (PFN) DrvAlphaBlend }, { INDEX_DrvGradientFill, (PFN) DrvGradientFill }, { INDEX_DrvTransparentBlt, (PFN) DrvTransparentBlt }, { INDEX_DrvSetPointerShape, (PFN) DrvSetPointerShape }, { INDEX_DrvMovePointer, (PFN) DrvMovePointer }, { INDEX_DrvSetPalette, (PFN) DrvSetPalette }, }; описание каждой из них есть в DDK. 2. попробуй передавать измененные регионы по квадрантам. возможно, выиграешь.
kelt, я извиняюсь что непонимаю ,но вот самого главного как мне этой таблицей пользовать(я новичок в драйверах). Описание есть тока ими пользоваться из своей проги (тут импортировать както нужно или как)? Можешь на любом языке программирования кусок кода показать или просто пояснить? Ну не доходит до меня. Заранее спасибо.
Ну пока сколько я статей читал понял что как-то с DrvDrawEscape надо отлавливать тока как? Или я в не правильную сторону думаю? Пробовал DrvDrawEscape в драйвер вставить ,но безусшно.
функции не только экспортом можно передавать. посмотри, как используется глобальная переменная gadrvfn в этом драйвере. табличка очень простая: это массив структур вида { индекс_функции, адрес_функции }. принципиальной разницы между драйвером и не драйвером тут нет эти функции используются только внутри твоего драйвера. ты эти функции пишешь (дописываешь). если тебе надо получить суммарный измененный регион, то делай так: каждой из этих функций так или иначе передается прямоугольник, который предполагается изменить. собираешь все изменения в кучку, после чего при помощи Escape-запроса к DC можно вытащить их из user-mode приложения.
kelt, а пример из src\video\displays\mirror\app, то как я понимаю врубает этот драйвер? То почему я не ловлю при помощи dbview следушии участки кода из enable.c например Код (Text): DISPDBG((1, "Mirror Driver DrvTextOut: pwstr=%08x\n", pstro ? pstro->pwszOrg : (WCHAR*)-1)); А код Код (Text): DISPDBG((0,"DrvEnableDriver:\n")); Ловиться? Чета я до конца не врубаюсь как он работает.
kelt, но я вроде Код (Text): { INDEX_DrvBitBlt, (PFN) DrvBitBlt }, и HOOK_COPYBITS Внёс ,а почему не сробатыет тогда функция DrvCopyBits при BitBlt, я хоть в правильную сторону думаю она по идее должна сробатывать ?
Доперло до меня в чем проблема. Я незнал что не только надо dll менять ,но и инсталить драйвер заново.
Теперь другая проблема. Когда я начинаю юзать Mirror Driver, то на рабочем столе под иконками надпись вместо прозрачного фона получаются с фоном вот так они выглядят и лево прорисовывается выпадающие меню.