Мир Вам! Итак, мысля: Есть у меня клава (мультимедийная) с кнопочками регулировки громкости и т.д. Так вот, с ней специальный драйвер-программмка. При нажатии на кнопочки регулировки громкости звука на экране появляется полоска, такая как на телевизоре, показывающая уровень громкости, причем выводится всегда, что бы не было запущено, хоть 3д игра, хоть в режиме эмуляции дос. Вопрос: как вывести графику также поверх всего. Пробовал получать hDC десктопа и рисовать на экране через него, но все этоо надо переодически рефрешить. Если это делать по таймеру - получается некрасиво - мерцает. А в играх частота обновления экрана такая, что моей графики практически не видно. Какие у кого есть идеи? Может надо както отлавливать момент обновления экрана и дорисовывать свою графику, но как?
Сдается мне, что это не на 3-м кольце делается, хотя я скорее всего ошибаюсь. Попробуй сам драйвер посмотреть. Или вот еще, что. Есть у меня замечательный менеджер для трубки - float Mobile Agent называется, там к нему приблуда есть, float Media Control называется, делает нечто подобное (выводит громкость в процентах на экране). Прога это opensource, лежит на SourceForge
Посмотри тут http://www.delphimaster.ru/articles/directx/ там написано что это такое и даже пример использования реализации оверлея в DirectX, насколько я понял из MSDN есть и другие реализации
Есть (полу)документированная возможность рисовать на экране без оверлея. Смысл прост - получаем адрес экраной памяти и рисуем для простоты пример расчитан на 32bpp (сорри за сишный код) Код (Text): #define INITGUID #include <ddraw.h> #include <windows.h> #pragma comment(linker, "/entry:start /subsystem:windows") #pragma comment(lib, "kernel32.lib") #pragma comment(lib, "ddraw.lib") void start() { IDirectDraw7 * direct_draw; IDirectDrawSurface7 * primary_surface; DDSURFACEDESC2 surface_descriptor; char * p = (char *)&surface_descriptor; int i = sizeof(surface_descriptor); while(i--) *p++ = 0; surface_descriptor.dwSize = sizeof(surface_descriptor); DirectDrawCreateEx(0, (void**)&direct_draw, IID_IDirectDraw7, 0); direct_draw->SetCooperativeLevel(0, DDSCL_NORMAL); surface_descriptor.dwFlags = DDSD_CAPS; surface_descriptor.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE; direct_draw->CreateSurface(&surface_descriptor, &primary_surface, NULL); primary_surface->Lock(0, &surface_descriptor, 0, 0); void * memory = surface_descriptor.lpSurface; for( int dy = surface_descriptor.dwHeight; dy; dy--, memory = (char *)memory + surface_descriptor.lPitch ) { for( int dx = surface_descriptor.dwWidth; dx; --dx ) if ( (dx ^ dy) & 1 ) *((int *)memory + dx) = -1; } primary_surface->Unlock(0); ExitProcess(0); } 785445327__over.exe ЗЫ: Тфу, не прочитал как следует, это не то :-(