Прочитал статью на Хабре, погрустил по старым временам, когда начинал изучать программирование, имея в руках книгу Зубкова «Assembler. Язык неограниченных возможностей. Ассемблер для DOS, Windows и Unix». А теперь я расскажу страшные вещи: доступа к Интернету не было, о существовании win9xsdk и о файле windows.inc, содержащем описание констант и структур, никто и не слыхивал.
Был только Borland Tasm 5x, текстовый редактор и отладчик Win32dasm, и справочник win32hlp, найденный на дисках с дистрибутивами. Этого комплекта хватило для того, чтобы программировать самостоятельно. Не мне судить, какой ассемблер лучше, но в Tasm часто напрягала необходимость объявления функций API и поиски констант для вызова функций.
С тех пор много воды утекло, я увидел PureBasic, в котором уже объявлены все структуры, функции и константы. Поэтому я часто использую PB для написания небольших утилит, о двух из которых я расскажу
Transparent clock

Однажды нашел страницу comrade, программа TopText подсказала идею написать часики. Максимум изменений — это перетаскивание надписи по десктопу и выбор параметров текста — цвет и вид шрифта. Эти опции доступны в значке systray.Для обработки сообщений используется SetWindowCallback(@WndProc()).
Суть идеи в формировании области окна(в терминологии win32api Region ) в виде текста. Созданный участок накладывается на окно, поэтому оно получается полупрозрачным.
Способ перетаскивания окна описан в интернетах(но без описания), поэтому использован код обработки сообщения WM_LBUTTONDOWN.
Mouse Clock

Похожая программа появилась на DonationCoder.com, но мне не нравился способ отображения времени — не показывались секунды. К тому же стало интересно, как написать подобную программу? Статья MSDN немного помогла понять принцип действия.
Сначала создается окно ToolTip:
hwndTT.l = CreateWindowEx_(#WS_EX_TOPMOST, #TOOLTIPS_CLASS, 0,#WS_POPUP | #TTS_NOPREFIX | #TTS_ALWAYSTIP,#CW_USEDEFAULT, #CW_USEDEFAULT, #CW_USEDEFAULT, #CW_USEDEFAULT,WindowID(0), 0, GetModuleHandle_(0),0) SetWindowPos_(hwndTT, #HWND_TOPMOST, 0, 0, 0, 0, #SWP_NOMOVE | #SWP_NOSIZE | #SWP_NOACTIVATE);
Для изменения текста к созданному окну добавляется структура
ti.TOOLINFO ti\cbSize = SizeOf(TOOLINFO); ti\uFlags = #TTF_SUBCLASS; ti\hwnd = hwnd ti\hinst = hinst ;ti\lpszText = @"This is your tooltip string." GetClientRect_(WindowID(0), @ti\rect); SendMessage_(hwndTT, #TTM_ADDTOOL, 0, @ti);
После проделанных действий запускается таймер AddWindowTimer(0, 123, 25).
Repeat Event = WaitWindowEvent() Select event Case #PB_Event_Timer: If mou SendMessage_(hwndTT, #TTM_TRACKACTIVATE, #True, @ti) re.POINT GetCursorPos_(re) st.SYSTEMTIME GetLocalTime_(st) res.l=GetTimeFormat_(#LOCALE_USER_DEFAULT, #TIME_FORCE24HOURFORMAT,st,0,*d,1024) ti\lpszText = *d SendMessage_(hwndTT, #TTM_UPDATETIPTEXT, 0, ti); SendMessage_(hwndTT, #TTM_TRACKPOSITION, 0, MakeLong(re\x, re\y)) EndIf
Сообщение TTM_TRACKACTIVATE говорит окну об активации ToolTip. Сообщение TTM_UPDATETIPTEXT изменяет текст — время, который формируются с помощью API функций. И последнее действие — сообщение TTM_TRACKPOSITION меняет позицию окна-подсказки, привязанную к курсору.
Для пробы я перевел код для MASM32, но параноик антивирус определяет программу как троян. Исходники приложены, любой может скомпилировать, чтобы убедиться, что программа безвредна.
Обе программы написаны для Windows 7 32bit, и я с ужасом ожидаю комментария: «не работает на… платформе».
Скачать программы+исходники
ссылка на оригинал статьи https://habr.com/ru/post/506442/
Добавить комментарий