Есть такая программа - WindowBlinds. Наверняка все про нее слышали, и многие видели. Вопрос: как она делает то, что делает?
Нифига вопроса не понял, хотя прогу сию видел и жарко спорил со многими ее любителями на тему почему эта прога заслуживает удаления в корзину. Что именно интересует? Она много что делает, но, уверяю, ничего сверхестественного.
зависит от версии винды в WinXP+ всё гораздо проще, т.к. WB использует встроенные функции системы по поддержке визуальных стилей плюс ко всему она активно хучит и сабклассирует
Ну если речь идет о шкурах на окна, то да, она хучит и сабклассирует Скорее всего, хучит она WH_CALLWNDPROC или WH_GETMESSAGE. Ловится, имхо, WM_PAINT, там и происходят все страшные дела. Версию под ВинХР не видел. Есть мнение, что сия прога там не особо нужна - вроде граждане уже освоили рисование шкур под ХР и поставили это дело на поток. Я противник подобных украшательств, поэтому деталей не знаю.
Вообще, иду в зубы и понеслась. Понимаю, что кода там дохрена, но общую суть можно понять довольно легко. Просто посмотреть параметры SetWindowsHookEx (или без Ex, мало ли..), ну и найти процедуру обработки хука. А там уже можно дальше и не копать, главное - убедиться, что прога действительно делает все так, как я описал (это может быть и не так, ибо это лишь моя догадка, как я бы сделал). Дерзай
Хм. Вот как перерисовывать клиентскую область я знаю, а чтобы перерисовать все окно с ног до головы? Или панель задач разукрасить? Как это?
Ну с панелью задач ничего сложного - класс окна известен и всегда постоянен (что естественно). Поэтому банально ищем окно именно с этим классом и малюем по нему всяко и даже можно эту глупую кнопку Start передвинуть и всячески ее извратить. Тут я проблем не вижу. С заголовком окна интереснее - о нем я как-то не подумал. Действительно, ведь WM_PAINT работает с клиентской частью окна (или нет? надо проверить..), а заголовок - это отдельная история. Не знаю. Думать надо, читать что-нибудь. Я бы схватил иду и нашел интересующий код. Вобще, в блэкбоксе есть плагин для приделывания шкуры именно к заголовку и рамке окна (клиентская часть не извращается шкурами). Если будет время в ближайшие дни, могу его покопать и посмотреть как он это делает. Не думаю, что WB использует другую технику.
Хотя вопрос не совсем по теме, но всё же. Копался я в АПИ инклюдах Дельфи, и нашёл набор функций для работы с дэсктопами. Сделал простой "дэсктоп мэнэджер", но есть одно но. Так и не научился (если это вообще возможно) переносить окна из одного дэсктопа в другой. Хотя Desktop Manager nView и набор других программ это делает без проблем. Кто-нибудь знает как?
Ну вообще, винда умеет рабочий стол растаскивать на несколько мониторов. Может, эта ценная фенька как-нить юзается. А вообще, виртуальный десктоп можно сделать захайдив все окна первого десктопа и показав окна второго. Ну и на панели задач (или ее альтернативе) тоже кнопки прятать и другие показывать. Хотя, повторюсь, может быть можно и штатными средствами как-то сделать.
Вот еще вопросик. При смене шкур также меняются и некоторые размеры, и, стало быть GetSystemMetrics (SM_CXHSCROLL) должно возврадать иную величину. Видел одну програмку, использующцю свои шкуры. Так вот она создавала окно БЕЗ жаголовка и пририсовывала его. А вооружаться идой будет сложно. Прога использует кучу длл-ок, размер каждой хорошо если меньше мегабайта.
Глянул быстренько ИДой во внутренности nview.dll - в функции "ДМСетДесктоп" (а точнее в более глубокой ф-ции, т.к. это только враппер какой-то) используется куча ф-ций в стиле IsWindowVisible, RedrawWindow, SendMessageX (с мсг вроде SHOW и HIDE - это толком не проверял), EnumWindows, FindWindowX - судя по всему оно работает так, как говорит господин n0p. Никаких из функций связанных с настоящими виндошными Desktop'ами нема. Так что всё с ними понятно.
И не только манагеры столешниц так работают. Всякие "пряталки приложений" - аналогичная шняга. Ну еще из списка процессов иногда убирают. А что сделаешь, в долгое время Винде больше одной столешницы на комп не полагалось, и все уже привыкли. "Если ты родился баобабом - так ты баобабом и помрешь"(с)Высоцкий.
она хучит CreateWindowEx и сабклассит все создающиеся окна. ну а в WindowProc - делает сама отрисовку. Всего делов.
Касательно DM-ов msdn://SetThreadDesktop и далее пляшем по тексту. Все делается, все переключается, все до противного просто и легко. Да, на втором десктопе, если хочешь рабочий стол, а не просто окошки приложений - надо эксплорер запускать. И последнее - мультидесктопность работает на ура начиная с WinNT4.0 - это часть системы. в 9х\ме не работает.
Уважаемый rst, Еслы бы всё было так просто, то бы я не задавал таких глупых вопросов. Если внимательнее прочитать содержание МСДНовского хелпа насчёт SetThreadDesktop, то можно увидеть вот это: Remarks The SetThreadDesktop function will fail if the calling thread has any windows or hooks on its current desktop (unless the hDesktop parameter is a handle to the current desktop). Несмотря на этот Ремарк, я пробовал заставить эту функцию работать и с потоками, имеющими окошки, но не вышло...
Переносить. Меня интересует (а скорее интересовало) как бы заставить ОДИН explorer.exe работать на всех десктопах одновременно - чтобы память зря не жрал. Но сюдя по всему при помощи нормального Api этого не получится сделать. А запускать изначально - это легко - при CreateProcess можно указать десктоп (по имени) на котором должен данный процесс функционировать.