Спрашивал я как вывести прямо на рабочий стол текст, мне в бегинерах сказали что как обычно с помощью драутекст окруженной функциями контекста устройства Написал я программу ключевые фрагменты вот а остальное во вложении. Программа выполняется без ошибок а текста на экране нету. Я получил описатель окна рабочего стола и использовал его при субклассировании - заменяю функцию окна на свою, которая выводит строку текста как в моем окне Для дочерней кнопки этот прием работает а для рабочего стола нет Как быть чтоб написать прям поверх обоев ? Код (Text): ;----------------------------------------- lea EAX,_DesktopWinProc@16 push EAX mov EAX,GWL_WNDPROC push EAX call GetDesktopWindow mov hWndDesktop,EAX push EAX call SetWindowLong mov OriginDesktopProc,EAX ;----------------------------------------- Исходник я в rtf формате представил так как стиль кода у меня специфический старомодный и стандартные inc я перекомпоновал так что щас у меня там не только прототипы Чтоб не морочится с сборкой грузите в отладчик exe и там смотрите @Routine_private - макрос пишущий стандартный прототип push EBP mov EBP,ESP Код (Text): ;=======[ SUBROUTINE ]============================ ; ;------------------------------------------------- ; Return: ;------------------------------------------------- ; Parameters: @HWND\ = 08h @iMSG\ = 0Ch @WParam\ = 10h @LParam\ = 14h ;------------------------------------------------- @Routine_private\ _DesktopWinProc@16 ;----------------------------------------- mov EAX,[EBP+@iMSG] cmp EAX,WM_PAINT je $paint jmp $default ;----------------------------------------- $paint: mov EAX,[EBP+@HWND] call Respond_WM_PAINT jmp\ short $exit ;----------------------------------------- $default: push [EBP+14h];lParam1 push [EBP+10h];wParam1 push [EBP+0Ch];uMsg1 push [EBP+08h];hWnd1 mov EAX,OriginDesktopProc push EAX call CallWindowProc ;----------------------------------------- $exit: xor EAX,EAX @Routine_end 10h
Ты явно что-то напутал с параметрами, которые ты передаёшь для создания кнопки. Без "реальных" сорцов, а не листинга, довольно трудно догадаться, но я вечером посмотрю, а завтра отпишусь.
Не стал ждать вечера, а сразу и разобрался, думал, что там что-то действительно сложное. За это время (можно посмотреть по постам) я даже успел сбегать за пивом.... 4011d5 - зачем там ксор, если после этого ты в еакс пихаешь число? 4011D7 -вот это то самое число, которое ты пихаешь, если инструкцию mov eax,40 занупить, то всё будет нормально. Если хочешь моё субъективное мнение, то ты напутал с параметрами. Разочарую тебя, надпись выведется в твоём окне, не на десктопе, ты что-то неправильно делаешь... тут уж думай сам. Приложи нормальные исходники....
Неправильный алго, в любом случае.... Ты в своём перекрытом обработчике, если получаешь сообщение вм_паинт, то сам делаешь отрисовку и всё... что довольно странно. Ты должен получить сообщение вм_паинт, вызвать дефолтный виндов прок (чтобы дать системе отрисовать то, что ей надо), а потом уж самому рисовать поверху. GetDesktopWindow - никогда ей не пользовался, но по-моему не она тебе нужна... сорри, но локального мсдн у меня под руками нет. Как вариант попробуй искать десктоп с помощью финдвиндов (как-то так, по-моему). Программа выполняется без ошибок а текста на экране нету Ну, ты приколист, однако.... Проверяй всегда, что тебе возвращают апи... Здесь на форуме есть такой kero, он себя позиционирует как тонкий знаток ГУИ. Можешь подостовать его.... Верный алго он тебе непременно подскажет.
Похоже, что это интересно только мне. И диалог постепенно превращается в монолог. Сам задаю вопросы, сам отвечаю - да я как kero!!! Для полной идентичности осталось только поспорить сам с собой )). Стало самому интересно и я вчера попытался субклассировать десктоп. И нифига у меня не получилось... нашел окно (которое десктоп) попытался его субклассировать и в ответ получил ERROR_ACCES_DENIED. Подумал, что надо субклассировать десктоп от его же лица, до четырёх ночи осваивал как запустить удалённый тред и лоад либрари. Успешно всё освоил. Свою длл так и не удалось написать (фасм глючит не по-детски, опыта в делании длл у меня нет). Зато png.dll очень клёво грузилась )) в контекст эксплорера. А сейчас сижу и думаю, неужели нет более лёгкого пути? Если и этот метод не проканает, то что тогда делать?! Рискую сегодня опять до четырёх утра кодить и отлаживать... почитал, блин, на свою голову.... P.S.: А стиль программирования у тебя,Rockphorr действительно какой-то странный...
Я под айсом трассировал (система win95 и айс 4 под win95) было какое то мелкое сообщение об ошибке - но я еще не понял куда копать стиль программирования такой чтоб 1) манглинг полностью руками контролировать 2) файлы с исходниками в rtf формат загонять для печати в 2 столбца - мне так удобно 3) не люблю invoke он хоть и позволяет контролировать количество и тип параметров не дает возможности передавать параметры push EAX c предварительным вычислением и загрузкой туда значения
Я тоже айс люблю, но это тот случай когда пушкой по воробьям. Я по быстрому погонял прогу под олей, там справа есть поле last error. И в первый раз калл, в котором ошибка я проскочил, но посмотрел на поле и решил вернуться.... mov eax,FFh add eax,ebx not eax invoke SomeFunk,eax - это разве не то? В фасме вполне можно переписать макрос, чтобы стало возможным: invoke SomeFunk,eax,<sub eax,ecx>,eax (это два параметра). Направление в котором копать: mov EAX,WS_EX_MDICHILD - вместо неё надо xor eax,eax - это есть у тебя push eax - это надо вставить Но надпись будет выводиться в твоём окне.... На этом сайте каждый второй читал Рихтера, но почему-то все решили промолчать (а я просто забыл об это), что субклассирование возможно только "внутри" процесса, то есть чужое окно нельзя просто так субклассировать. Но это не значит, что это в принципе невозможно, просто надо написать весь необходимый код в длл, а при получении сообщения длл_аттач творить свои чёрные дела. Почитай 22 главу Рихтера (обязательно!!!), там про инжект всё написано.... Я ненадолго приостановил копания в этом направлении, но обязательно напишу рабочий код, как только разберусь почему фасм компилит мою длл без импорта, и когда будет свободное время. Сам инжект у меня проходит на ура . Удачного чтения!
Свершилось! Мой код нормально работает (по крайней мере под икс-пи 2 и 3 сервис паком) Оно-то работало уже давно, но надпись прорисовывалась только если её что-нибудь затирало. Покопался в исходниках Print Layered от kero, нашёл замечательную функцию RedrawWindow. И после этого всё заработало как надо. Кстати, БегинПайнт и ЭндПайнт отпали сразу же... только глюков из-за них. ГетДс работает более стабильно.... Варнинг! Я по привычки использовал юникодовские функции так что, я не знаю будет ли прога работать на твоей 98-ой винде. Надеюсь, что ты сможешь переписать исходники, если что.... Главное помнить, что у меня NULL = FALSE = ebx = 0 (но не всегда... будьте осторожны...). Я почти всегда использую ebx вместо нуля.... За код просьба не пинать, я торопился... там много рудиментов (вроде названия или код какой-нибудь). Компилировать всё это непотребство правильно установленным фасмом. Алго такой (длл): 1) Находим окно, энумим его чилды, сравниваем заголовки, если подходит, то прыгаем на пункт 2 2) Делаем SetWindowLong, и далее RedrawWindow, для корректного отображения. 3) Далее в нашем субклассе мы сравниваем пришедшее сообщение с ВМ_ПАИНТ, если оно, то вызываем дефолтную процедуру, а потом уже рисуем сами. Надеюсь что тебе надо было рисовать и поверх иконок!!! Хотя если сильно подумать, то можно и рисовать под иконками, у меня есть пара мыслишек на эту тему. Чуть не забыл, там шрифт Colibri, надеюсь, что винда вместо того, чтобы вылететь с ошибкой, подберёт наиболее похожий. Простор для творчества я тебе оставил большой. Вот хотя бы вынести создание брюшей и пенов в процедуру, которую вызывать лишь один раз. Или, вот, извернуться и присвоить окну стиль CS_OWNDC, чтобы не получать его каждый раз. Наш код сократился бы несколько раз. Внимание! Вопрос к знатокам! Почему я не могу присвоить стиль CS_OWNDC?! Есть какие-то ограничения, о которых я не знаю?! А если я всё-таки изворачиваюсь и присваиваю окну этот стиль, то всё виснет наглухо... . P.S.: Если бы вы знали, сколько раз мне пришлось убивать эксплорер, пока я писал эту прогу. Я её всё-таки доведу до ума....
PS нравится мне Windows 95 OSR 2.1, под нее есть смысл писать на асме - например универсальный драйвер для флешек как в 2000 тока по свойму смысл установки даже 2000 на мой старенкий пень2 очень сомнительный - пишу в редакторе от нортона - на кой мне эти навороты в моем зоопарке ??? ))
Так она у тебя пошла или нет?! А то ты молчишь об этом. Если тебе нужен только инжект и субклассинг, то Рихтера можно читать сразу с 22 главы, там всё просто, хотя прочитать всю книжку тоже будет очень полезно.... Я думал, что в 95 вместо юникодовских функций только затычки... будет очень интересно, если это всё зарабатает . Слушай, а тебе вообще зачем понадобилось выводить на рабочий стол надпись? Код смотрел? Там синтаксис от масма почти не отличается, портировать будет легко. Если у тебя такой слабенький комп, то переделать прогу надо 100%, там много чего можно вынести из цикла.
Прогу еще не смотрел и не пробовал. Главное что я понял куда копать. На форуме masm32 мне тоже говорили что не так просто субклассировать окно чужого процесса. Весь мой опыт програминга в асме состоит в копании в чужом дос-коде и написании под дос собственного средства для интерфейса пользователя. Щас почитал пецольда программирование под windows95, наткнулся на функцию получающую описатель рабочего стола - чем не продолжение проги привет мир ??
Весь мой опыт програминга в асме состоит в копании в чужом дос-коде Прикольно, полтора года назад весь мой опыт в асме - это копание в чужом 32-х битном коде. Я хорошо знал асм, но не умел на нём программировать. Так привык к ассаблеру, что предпочитаю его вместо с++ и С. функцию получающую описатель рабочего стола - GetDc,0 ??? Если так, то эта функция получает дс окна, которое в данный момент занимает весь экран.... чем не продолжение проги привет мир ?? Ну, не хилое такое продолжение... от тридцати строчек кода до инжекта и субклассинга одновременно + решение мелких проблем.... Я улучшил программу и вынес всё ненужное из цикла. А заодно и пофиксил не хилый такой баг - добавил в конец цикла ReleaseDc )). А я всё до этого думал, почему всё так притормаживает?! Оформил всё в отдельных процедурах, чтобы при изменении текста можно было просто прокалить процедуру и всё. Да, и заменил шрифт на Комик Санс. А вот как присвоить стиль CS_OWNDC, я так и не понял... . Похоже, что его можно присвоить только в самом начале, перед тем, как оно создаётся. Что делать понятия не имею . Придётся всё оставить как есть. А вот выводить текст под иконками очень даже реально. Я понял, что это окно, которое я сабклашу выводит только иконки, а кто-то совершенно другой рисует бэкграунд. Если дейстройнуть наше окно, то исчезают только иконики... есть простор для раздумий. Прогу еще не смотрел и не пробовал. Главное что я понял куда копать Копать тебе ещё и копать... Будут проблемы - обращайся. Удачи!