Прежде чем перейти к статье, хочу вам представить, экономическую онлайн игру Brave Knights, в которой вы можете играть и зарабатывать. Регистируйтесь, играйте и зарабатывайте!
Прочитал статью на Хабре, погрустил по старым временам, когда начинал изучать программирование, имея в руках книгу Зубкова «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, и я с ужасом ожидаю комментария: «не работает на… платформе».
Скачать программы+исходники