Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
ВнизИзменение цвета фона чужого окна Найти похожие ветки
← →
Teenager © (2006-09-13 23:15) [0]Здравствуйте, знающие добрые люди :)
у мя возник очередной вопрос, который скорее всего неразрешим... как изменить цвет фона у чужого окна? по-идее - никак. Но мало ли :) Так же мне хотелось бы изменить имя класса чужого окна... но это должно быть еще нереальнее.
Заранее спасибо.
← →
Eraser © (2006-09-13 23:55) [1]> [0] Teenager © (13.09.06 23:15)
это сделать довольно проблематично, нужно внедриться в адресное пространство "вражеского" процесса и перекрыть оконную процедуру таким образом, чтобы перехватывать WM_PAINT и рисовать там свой фон.. не факт, что будет корректно работать в общем случае.
← →
Galiaf © (2006-09-14 12:42) [2]можно взять хэндл окна и порсто нарисовать на нем прямоугольник нужного цвета, но на сколько я помню таким образом могут пострадать кнопки или текст этого окна, кажется будет рисоваться поверх всего, ща я гляну правда ли это...
← →
Teenager © (2006-09-14 19:40) [3]Eraser, да, скорее всего ты прав :( я такого делать не буду. уж слишком много версий чужого приложения мне прийдется поддерживать.
Galiaf, и ты прав... только то, что ты написал - делать совершенно низя... а жаль.
я вот подумал следующее...
а что если брать каждый пиксел чужого окна... переводить его в градацию серого - а оттуда - скажем в градации красного... таким образом чужое окно можно будет "перекрасить" полностью... также по идее можно будет регулировать параметры изменения цвета - чтобы частично цвет чужого окна оставался (для многоцветия)... только по идее такой процесс будет ресурсоемким и достаточно сложным :(
есть еще один вариант - поверх чужого окна рисовать свое - полупрозрачное и (например) красное - это тоже окрасит чужое окно в красный цвет... только при попытке кликанья на кнопки на чужом окне - события будут передаваться не ему, а поверхлежащему нашему полупрозрачному окну. как это изменить? как передавать события нижележащему окну - или дочерним окнам нежележащего окна - кнопкам например...?
как Вам мои варианты?
заранее спасибо, люди - за поддержку :)
← →
Ketmar © (2006-09-14 19:52) [4]> [3] Teenager © (14.09.06 19:40)
клади поверх окно со стилем WS_EX_TRANSPARENT. оно, afair, пропускает мышиные события "насквозь".
← →
Teenager © (2006-09-14 21:45) [5]спасибо! :) а что, идея норм? насчет верхнего окна? + а можно контрол (панель) сделать ПОЛУпрозрачной средствами ВинАпи и уже после создания прикрепить ей отэтот мегастиль? оч хотелось бы именно такой вариант (тонкости моей проги )
← →
Ketmar © (2006-09-14 22:40) [6]> [5] Teenager © (14.09.06 21:45)
нет. стиль задаётся при создании. иначе -- будет грустно. %-)
← →
Teenager © (2006-09-15 19:28) [7]если не сложно (!) , можете привести :) как это делать на ВинАпи - создавать окно, делать его прозрачным... выставить его поверх чужого окна - думаю, сумею ) надеюсь )
← →
Ketmar © (2006-09-15 19:29) [8]могу. но севершенно не хочу. ибо есть гугль и ещё куча других поисковиков.
← →
Galiaf © (2006-09-18 13:12) [9]Звиняйте, долго меня небыло хотя говорил что ща прооверю =)... так уж вышло. Вот я глянул, если рисовать прямоугольник на окне то выходит что кнопки не перерисовываются но перерисовываются всякие label"ы больше не проверял т.к. перерисовка лабелов это недопустимо, вот на счет взятия цвета пикселя, идея подходит имхо только для не старых машин но вот если делать список всяких программ с готовыми параметрами(имею в виду что ты знаешь в какой програме где что нарисовано и не рисуешь на этом месте), т.е. ты указываешь какая это программа и твоя открывает соответствующий файл и ресует по параметрами взятыми от туда, кстати файл можно писать после первого запуска незнакомой программы и брать цвета пикселов тем самым записывая в файл где можно рисовать а где нельзя. В любом случае я могу сильно ошибаться, просто высказал свои мысли на эту тему.
← →
Eraser © (2006-09-18 13:13) [10]> [9] Galiaf © (18.09.06 13:12)
рисовать надо на WM_PAINT, но перед тем, как это сделает приложение.
← →
DVM © (2006-09-21 15:02) [11]
> рисовать надо на WM_PAINT, но перед тем, как это сделает
> приложение.
Если речь об изменении фона, то может все таки на WM_ERASEBKGND ?
← →
Eraser © (2006-09-21 15:06) [12]> [11] DVM © (21.09.06 15:02)
точно, так оптимальнее будет.
← →
NickCoder © (2006-09-21 20:53) [13]Я могу предложить только поменять системную политру, но в этом случае все окна будут иметь такой цвет!
← →
Teenager © (2006-09-21 23:31) [14]Привет... а я думал, тут ничего больше не напишут :)
Кетмар - блин, отот стиль, что ты мне посоветовал, не пропускает события :(((
а насчет гугля и других поисковиков ты совершенно прав :)
Мне нужна комбинация стилей - чтобы пропускало...
WS_EX_LAYERED вроде подходит, но не для child windows. А я-то панельку юзаю...
короче говоря, есть уже прозрачная панелька, но через нее события не проходят... люди, найдите мне нужный стиииль :)
попиксельная прорисовка - тоже вариант конечно классный... но не думаю, что он пойдет.. надо ведь будет хукать пэйнт-мессаги нижележащего окна, и реагировать на это прорисовкой всей области.. и снова-таки.. может другой вариант- как-то рэндэрить чужое окно на свой битмап,[далее быстро его изменять в цветах] а потом уже его кидать на свою панель...
ваши предложения?
← →
Ketmar © (2006-09-21 23:37) [15]>[14] Teenager(c) 21-Sep-XLI A.S., 23:31
>Кетмар - блин, отот стиль, что ты мне
>посоветовал, не пропускает события :(((
пропускает. только не надо окно делать дочерним.
← →
Teenager © (2006-09-21 23:46) [16]эээ... а без дочернего никак! я ж компонентом хочу..
← →
Ketmar © (2006-09-21 23:49) [17]тогда всё руками.
← →
Teenager © (2006-09-21 23:58) [18]доступное объяснение... если смогу все-таки что-то сделать - напишу :)
может, сделаю частичную реализацию - т.е. буду ловить клики-мувы.. и посылать их форме внизу. мож че-то и выйдет.
Есть как бы еще один супербешеный вариант - для особых извращенцев - пришел только что в голову... посредством регионов ))) т.е. один пиксел - куда указывает мышь в данный момент- делать "прозрачным" - и мышь всегда будет пробивать окно.....
как вам, а? :)
← →
Ketmar © (2006-09-22 00:22) [19]>[18] Teenager(c) 21-Sep-XLI A.S., 23:58
>пиксел - куда указывает мышь в данный момент-
>делать "прозрачным" - и мышь всегда будет
>пробивать окно.....
фиговато нам.
← →
Teenager © (2006-09-22 00:27) [20]ясно. жаль без объянений. что ж, будем искать других путёв :)
← →
Ketmar © (2006-09-22 00:30) [21]>[20] Teenager(c) 22-Sep-XLI A.S., 00:27
>ясно. жаль без объянений.
подумай сам. пойми, что движение мыши отлавливается постфактум. и что постоянно корёжить регион -- операция накладная.
← →
Teenager © (2006-09-22 00:34) [22]это логично :) но разве не сложнее - отлавливать изменение нижележащего окна и перерисовываться полностью, корректируя цвет каждого пикселя?
а если не так, то как? как-то - можно.
http://www.c-sharpcorner.com//Code/2003/May/TransparentControls.asp
жаль, ничего конкретного тут не говориться... и исходников нет :( только дээльэлька...
← →
Teenager © (2006-09-22 00:37) [23]извиняюсь, туплю к ночи :) пора идти спать. предложенная ссылка не дает возможности "пробивать" свое окно, зато там люди делают реально клаффную прозрачность.
может, за ночь что-то и придумается.
← →
Ketmar © (2006-09-22 00:48) [24]>[22] Teenager(c) 22-Sep-XLI A.S., 00:34
>изменение нижележащего окна и перерисовываться
>полностью, корректируя цвет каждого пикселя?
WS_EX_LAYERED -- для кого?
>
>http://www.c-sharpcorner.com//Code/2003/May/Trans
>parentControls.asp
>жаль, ничего конкретного тут не говориться... и
>исходников нет :( только дээльэлька...
всё там сказано. WS_EX_TRANSPARENT. и ручное рисование. зачем, если есть WS_EX_LAYERED -- не понятно. и ставить стили цифирью вместо констант -- моветон.
← →
Teenager © (2006-09-22 19:43) [25]Вы ошибаетесь, Кетмар... ничего не выходит, если юзать указанную мной статью. Мало того, что компонент не "пробивается" мышью, так еще при получении перекрываемой кнопкой фокуса (или вообще если даже мышь навести) то она не позволяет больше прорисовываться над собой транспарэнт-компоненту.... хоть в перекрываемом участке продолжает не реагировать на клики.
еще раз повторяю. WS_EX_LAYERED не катит для дочерних окон :(
эх.
← →
Ketmar © (2006-09-22 19:59) [26]>[25] Teenager(c) 22-Sep-2006, 19:43
>юзать указанную мной статью. Мало того, что
>компонент не "пробивается" мышью, так еще при
он и не должен. в данном случае WS_EX_TRANSPARENT используется несколько для другого. в частности для того, чтобы окно, лежащее поверх других, получало WM_PAINT в последнюю очередь.
>вообще если даже мышь навести) то она не
>позволяет больше прорисовываться над собой
>транспарэнт-компоненту.... хоть в перекрываемом
>участке продолжает не реагировать на клики.
потому что там все намного сложнее, нежели думал автор статьи. %-)
>еще раз повторяю. WS_EX_LAYERED не катит для
>дочерних окон :(
мда. вполне возможно. тут я запросто мог ошибиться. проверять лениво пока. %-)
← →
Teenager © (2006-09-22 20:56) [27]"мда. вполне возможно. тут я запросто мог ошибиться. проверять лениво пока. %-)"
MSDN ;) (хотя там и есть ошибки - черные дыры))) )
http://forum.sources.ru/index.php?showtopic=79535
моя идея насчет регионов - оказывается, уже реализована в коде - ну правильно, я ж не гениален :)
Люди, я в Вас верю ))
← →
Ketmar © (2006-09-22 21:31) [28]>[27] Teenager(c) 22-Sep-2006, 20:56
>MSDN ;) (хотя там и есть ошибки - черные дыры)))
да понятно, что MSDN. это я извиняюсь так за дезу. вот, ещё и открытым текстом извиняюсь (если деза %-).
>моя идея насчет регионов - оказывается, уже
>реализована в коде - ну правильно, я ж не
>гениален :)
а я и не говорил, кстати, что это не будет работать. я лишь имел в вижду, что будет работать криво. %-)
← →
Teenager © (2006-09-22 21:45) [29]поискал по куче форумов. видимо, норм решения нет.
если есть предложения - буду счастлив.
Кетмар - спасибо за поддержку, кросавчег :)
← →
Ketmar © (2006-09-22 21:50) [30]>[29] Teenager(c) 22-Sep-2006, 21:45
>Кетмар - спасибо за поддержку, кросавчег :)
ну, ежели ещё что обругать надо -- так ты заходи, я с удовольствием. %-)
← →
Teenager © (2006-09-22 22:57) [31]появилась новая возможность - как-то через рисунки с прозрачностью :)
например запихнуть в png альфа-канал, и радоваться )))
ссылку на эту возможность - кину позже, если кому интересно. но там на .NET :(
← →
Ketmar © (2006-09-23 07:52) [32]>[31] Teenager(c) 22-Sep-2006, 22:57
>появилась новая возможность - как-то через
>рисунки с прозрачностью :)
фу. обыкновенный AlphaBlend() на канву контрола. %-)
← →
Старик (2006-09-23 12:13) [33]Teenager, если ты можешь получить хендл чужого окна, то почему нельзя:
1. Скопировать ВСЮ его поверхность в канву своей программы.
2. Перерисовать так, как тебе нужно.
3. Полученное произведение искусства нарисовать на форме нужного приложения.
Тогда у тебя будет окно, окрашенное нужным цветом. Другое дело, что я не уверен, что будет происходить при нажатии на кнопку, допустим, если ты вдруг и ее перекрасишь. Скорей всего, глюки. Но попробовать, я думаю, стоит.
← →
GrayFace © (2006-09-23 21:45) [34]Teenager © (13.09.06 23:15)
Так же мне хотелось бы изменить имя класса чужого окна... но это должно быть еще нереальнее.
Это проще, но тоже сложно.
Teenager © (14.09.06 19:40) [3]
как Вам мои варианты?
Утопические :)
Ketmar © (14.09.06 19:52) [4]
клади поверх окно со стилем WS_EX_TRANSPARENT. оно, afair, пропускает мышиные события "насквозь".
Да как-то нет. Проверял на форме. Вам удавалось его удачно использовать? А то не всегда его WM_PAINT вызывается.
Teenager © (14.09.06 21:45) [5]
+ а можно контрол (панель) сделать ПОЛУпрозрачной средствами ВинАпи и уже после создания прикрепить ей отэтот мегастиль? оч хотелось бы именно такой вариант (тонкости моей проги )
Это уже реальнее. Панель, через которую можно кликать сделать нет проблем (httransparent в WM_NCHITTEST), с прозрачностью тоже может получится. По меньшей мере, можно сделать чтоб через панель были видны неWin контролы.
← →
Teenager © (2006-09-25 20:00) [35]хм, вы так умеете обнадеживать :) спасибо.
только я все равно не понимаю - что мне делать :)
httransparent в WM_NCHITTEST - как понимать?
как я понял, событие возникает при щелчке по неклиентской части окна.
надо глянуть в описания)
а еще мне бы очень хотелось оцэ всё на .NET реализовать (C#) ...
Старик - чужая форма будет активно юзаться.
мне надо цветовой фильтр... хоть какой-то... эх :(
← →
GrayFace © (2006-09-26 18:51) [36]Teenager © (25.09.06 20:00) [35]
httransparent в WM_NCHITTEST - как понимать?
как я понял, событие возникает при щелчке по неклиентской части окна.
надо глянуть в описания)
Этим событие возникает при движении мыши по форме и выясняет, к какой части окна принадлежит данная точка. Если HTTRANSPARENT, то кликается насквозь, с одним условием - окно снизу должно принадлежать этому потоку.
Teenager © (25.09.06 20:00) [35]
мне надо цветовой фильтр... хоть какой-то... эх :(
Смешать цвета легко, рисовать поверх чужого окна - неизвестно, получится ли.
Teenager © (25.09.06 20:00) [35]
только я все равно не понимаю - что мне делать :)
А ты объясни, что надо в целом.
← →
Ketmar © (2006-09-26 23:52) [37]>[34] GrayFace(c) 23-Sep-2006, 21:45
>Да как-то нет. Проверял на форме. Вам удавалось
>его удачно использовать? А то не всегда его
>WM_PAINT вызывается.
писал нечто вроде CursorXP. вроде бы вполне себе работало. правда, WM_PAINT там был побоку, потому что окно с альфа-каналом, тут свои приколы.
← →
Teenager © (2006-09-28 21:26) [38]хай, люди %)
"А ты объясни, что надо в целом."
Итак, я на панель в моем окне пытаюсь запихнуть часть чужого окна :) достаточно сложной структуры. Чужое окно имеет свой цвет, который не подходит под дизайн моего приложения.
Я принимаю решение - поместить поверх моей панели с чужим окном - прозрачную панель для корректировки цвета. Другие варианты - более удачные - приветствуются!
Насчет прозрачной панели - она должна пропускать события мув/клик, и отображать все контролы, что под ней с регулируемой степенью прозрачности.
"с одним условием - окно снизу должно принадлежать этому потоку."
как видишь, ГрэйФэйс... мне не повезло )
"правда, WM_PAINT там был побоку, потому что окно с альфа-каналом, тут свои приколы."
если ты считаешь, Кетмар :), что это мне поможет - расскажи, плиз )
эх, ну... надеюсь, вы все-таки поможете мне разобраться )
← →
Ketmar © (2006-09-28 21:33) [39]>[38] Teenager(c) 28-Sep-2006, 21:26
>если ты считаешь, Кетмар :), что это мне поможет
гильотина поможет. %-) я всё равно до сих пор толком задачу не понял. %-) когда решишь -- покажи хоть, что мы тут так весело обсуждали. %-)
← →
teenager © (2006-09-28 21:37) [40]эй, эй, эй...
ну неужели я плохо объяснил :(
вот смотри, есть у мя скажем калькулятор, да? кальк.ехе
1) запускаю
2) запихиваю окно калькулятора в свою панель в своем окне
3) у мя все в красном дизайне, а калькулятор - виндошного цвета
4) надо сделать так, чтобы калькулятор - покраснел
5) вывод - наложить на него полупрозрачную красную панель.
6) и будет все одноцветным в красном дизайне.
понятно? :)
← →
Ketmar © (2006-09-28 21:38) [41]>[40] teenager(c) 28-Sep-2006, 21:37
>4) надо сделать так, чтобы калькулятор -
>покраснел
ну, покажи ему синус голый, что ли..
вообще -- нишиша непонятно. непонятно, зачем так над программами издеваться. мой инопланетный моск мне отказывает... %-)
← →
Ketmar © (2006-09-28 21:39) [42]слушай, а не проще подсовывать калькулятору для рисования DC битмапа, а когда он полность отрисуется -- заальфпблэндить битмап -- и на экран?
← →
teenager © (2006-09-28 22:07) [43]"непонятно, зачем так над программами издеваться. мой инопланетный моск мне отказывает... %-)"
не уверен, что мне стоит вдаваться в реальный пример. долго и нет смысла. мож как-нить позже )
"слушай, а не проще подсовывать калькулятору для рисования DC битмапа, а когда он полность отрисуется -- заальфпблэндить битмап -- и на экран?"
идея неплохая! даже альфаблендить особо смысла не будет :)
только - как?... как подсунуть битмап для серьёзных приложений - например, Виндовс эксплорэра, Виндовс медиа плеера, Аутлук Эпкспресса?
я понимаю, что способы левые, но задача больно специфическая у мя...
жду комментов :)
← →
Ketmar © (2006-09-28 22:19) [44]>[43] teenager(c) 28-Sep-2006, 22:07
>Виндовс медиа плеера
забудь сразу и прочно.
← →
Teenager © (2006-09-29 19:46) [45]ммм...... мы народ интересующийся, притом это касается моих разработок...
почему забыть? (че-то на ум сразу приходит библиотека DirectX, но то мои додумки :) )
← →
GrayFace © (2006-10-03 18:24) [46]teenager © (28.09.06 22:07) [43]
только - как?... как подсунуть битмап для серьёзных приложений - например, Виндовс эксплорэра, Виндовс медиа плеера, Аутлук Эпкспресса?
Дак ты определись, нужна ли тебе реакция чужого окна на нажатия? Если скопировать, реакции не будет.
Для начала убедись, что простое подмешивание цвета тебя устраивает - сделай у своего окна нужную прозрачность и цвет и поставь его на чужое.
← →
GrayFace © (2006-10-03 18:32) [47]> Если скопировать
Т.е. скопировать изображение на свою панель
← →
Teenager © (2006-10-04 00:07) [48]1) функциональность чужого приложения нужна обязательно. идея-то в чем... чтобы моя панель например была сверху и непрозрачной, но прозрачной для кликов и мувов мыши. тогда можно отот метод копирования использовать.
2) я так понял, что прозрачную панель мне поместить как компонент в мое окно - не удастся... в таком случае - надо создать что-то типа окна, которое:
- прозрачно
- топ-левел
- двигается, если перемещать мое приложение, чтобы всегда быть поверх чужого окна, которое я впихиваю в своё приложение
- z-положение прозрачного окна должно быть на 1 больше чем z-положение моего приложения
вот такие вот пироги... ваши варианты?
← →
Германн © (2006-10-04 02:19) [49]
> Teenager © (13.09.06 23:15)
>
> Здравствуйте, знающие добрые люди :)
>
> у мя возник очередной вопрос, который скорее всего неразрешим.
> .. как изменить цвет фона у чужого окна? по-идее - никак.
> Но мало ли :)
Не читал весь сей топик, но вспомнил WindowsBlind. Они-то могли рисовать чужое окно в соответствии с той шкурой, которая выбрана. Может стоит поискать в гугле?
← →
Teenager © (2006-10-04 22:30) [50]эх, чувак :) , спасибо за помощь, но идея WindowsBlinds тут не поможет... хотя я гляну - мож ошибаюсь..........
← →
Ketmar © (2006-10-04 22:46) [51]>[49] Германн(c) 4-Oct-2006, 02:19
>WindowsBlind. Они-то могли рисовать чужое окно
там технология долгая и страшная. %-)
← →
Германн © (2006-10-05 01:32) [52]
> etmar © (04.10.06 22:46) [51]
>
> >[49] Германн(c) 4-Oct-2006, 02:19
> >WindowsBlind. Они-то могли рисовать чужое окно
> там технология долгая и страшная. %-)
>
И не сомневался. Но вдруг можно оттуда почерпнуть что "разумное, доброе, вечное". :-)
Мне вот лично, очень понравилась идея показывать "Часы" в заголовках окон любых прложений! Люблю я, когда часы всегда при мне!
← →
Ketmar © (2006-10-05 01:44) [53]>[52] Германн(c) 5-Oct-2006, 01:32
>когда часы всегда при мне!
а у меня в таскбаре... %-)
← →
Германн © (2006-10-05 02:35) [54]
> Ketmar © (05.10.06 01:44) [53]
>
> >[52] Германн(c) 5-Oct-2006, 01:32
> >когда часы всегда при мне!
> а у меня в таскбаре... %-)
>
Занимать часть доступного пространства для окна программы только для того, чтоб видеть часики? Или у тебя есть иные мотивы видеть "панель задач" постоянно?
← →
Ketmar © (2006-10-05 02:38) [55]>[54] Германн(c) 5-Oct-2006, 02:35
>Или у тебя есть иные мотивы видеть "панель задач"
>постоянно?
конечно. во-первых, она у меня очень маленькая -- потому что shell нестандартный. а во-вторых, туда можно положить кучу полезной информации. %-)
← →
Германн © (2006-10-05 03:54) [56]
> Ketmar © (05.10.06 02:38) [55]
>
> >[54] Германн(c) 5-Oct-2006, 02:35
> >Или у тебя есть иные мотивы видеть "панель задач"
> >постоянно?
> конечно. во-первых, она у меня очень маленькая -- потому
> что shell нестандартный. а во-вторых, туда можно положить
> кучу полезной информации. %-)
>
Любопытства ради. Можешь кинуть скриншот мне на мыло?
Это во-первых. А во вторых, зачем что-то видеть "всегда", если оно не время?
Какая ещё есть "полезная" информация? Это не в упрек, а просто интересно.
← →
Ketmar © (2006-10-05 04:31) [57]>[56] Германн(c) 5-Oct-2006, 03:54
>Любопытства ради. Можешь кинуть скриншот мне на
>мыло?
смысл? поставь себе blackbox -- всё сам увидишь. %-) если лениво -- кину. а твоё мыло, кстати, не дошло ещё. %-)
>зачем что-то видеть "всегда", если оно не время?
например, приятно видеть активность ftp/htpp серверов. %-)
>Какая ещё есть "полезная" информация?
да собственно, сейчас -- никакой. а вообще -- загруженость проксика, наличие новых мыл, etc. виртуальные рабочие столы, опять же... текущий язык ввода... %-) etc, etc, etc...
← →
Германн © (2006-10-05 05:09) [58]
> а твоё мыло, кстати, не дошло ещё. %-)
Посылаю ещё раз! Если не придёт, скажи.
← →
Ketmar © (2006-10-05 05:46) [59]>[58] Германн(c) 5-Oct-2006, 05:09
>Посылаю ещё раз! Если не придёт, скажи.
увы. фиг с ним -- затык, значит, какой-то. %-)
← →
Teenager © (2006-10-06 19:58) [60]Дельный разговор %-)
ЗЫ: спасибо, новый смайл мне пришелся по вкусу ))))
← →
Германн © (2006-10-07 01:35) [61]
> Teenager © (06.10.06 19:58) [60]
>
> Дельный разговор %-)
>
Конференция WinAPI так редко посещаема "писателями". :-)
Страницы: 1 2 вся ветка
Форум: "WinAPI";
Текущий архив: 2007.02.18;
Скачать: [xml.tar.bz2];
Память: 0.63 MB
Время: 0.05 c