<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
	<channel>
		<title><![CDATA[Серый форум &mdash; AHK: ToolTip/TrayTip с выбором цвета и шрифта]]></title>
		<link>http://forum.script-coding.com/viewtopic.php?id=12236</link>
		<atom:link href="http://forum.script-coding.com/extern.php?action=feed&amp;tid=12236&amp;type=rss" rel="self" type="application/rss+xml" />
		<description><![CDATA[Недавние сообщения в теме «AHK: ToolTip/TrayTip с выбором цвета и шрифта».]]></description>
		<lastBuildDate>Mon, 19 Dec 2016 22:14:57 +0000</lastBuildDate>
		<generator>PunBB</generator>
		<item>
			<title><![CDATA[AHK: ToolTip/TrayTip с выбором цвета и шрифта]]></title>
			<link>http://forum.script-coding.com/viewtopic.php?pid=109943#p109943</link>
			<description><![CDATA[<h5>Class ToolTip</h5><p>Представляю класс ToolTip, который можно использовать для создания ToolTip&#039;ов и TrayTip&#039;ов с возможностью выбора шрифта (и его размера и стиля), а также цвета фона и текста. Подобных разработок существует множество, моя более функциональна, чем, например, <a href="https://autohotkey.com/boards/viewtopic.php?f=6&amp;t=4777">эта</a>, и более компактна, чем <a href="https://github.com/HotKeyIt/TT">эта</a>.<br />Сам класс:<br /></p><div class="codebox"><pre><code>class ToolTip  {
/*
Версия: 1.05

При создании экземпляра объекта в конструктор передаётся ассоциативный массив с опциями.
Возможные ключи и их псевдонимы:

title
text
icon (1 — Info, 2 — Warning; 3 — Error; n &gt; 3 — предполагается hIcon)
CloseButton (или close) — true или false
transparent (или trans) — true или false, указывает, будет ли ToolTip прозрачен для кликов мыши
ShowNow (или now) — true или false, показывать или не показывать ToolTip при создании экземпляра объекта
   Если параметр не указан, ToolTip будет показан сразу же.
x, y — координаты, если не указаны, ToolTip появится вблизи курсора
BalloonTip (или balloon, или ball) — true или false, BalloonTip — это ToolTip с хвостиком
TrayTip (или tray) — будет показан BalloonTip у иконки скрипта в трее, параметры x, y, и BalloonTip игнорируются
   Если указан ключ TrayTip, удалить экземпляр объекта можно либо методом Destroy(),
      либо указав Timeout с отрицателным значением.
   Если нет, тогда можно просто прировнять ссылку на объект пустому значению.
FontName (или font)
FontSize (или size)
FontStyle (или style) — bold, italic, underline, strikeout в любом сочетании через пробел
Timeout (или time) — время в милисекундах, через которое ToolTip будет скрыт, если число положительное,
   либо уничтожен, если отрицательное
BackColor (или back) — цвет фона
TextColor (или color) — цвет текста
   
Для указания цвета можно использовать литеральные названия, перечисленные здесь:
https://autohotkey.com/docs/commands/Progress.htm#colors
В этом случае название должно быть в кавычках.

Ключи можно задавать в любом порядке и в любой комбинации, как показано в примерах использования.
Если указан ключ TrayTip, удалить экземпляр объекта можно только методом Destroy(),
если нет, тогда можно просто прировнять ссылку на объект пустому значению.

Публичные методы объекта:

1. Show(x, y, timeout) — показ ранее скрытого ToolTip&#039;а, указание координат и времени показа.
   x и y — координаты, если пустые значения — ToolTip будет показан возле курсора
   timeout — время в милисекундах, через которое ToolTip будет скрыт, если число положительное, либо уничтожен, если отрицательное
2. Hide() — скрытие ToolTip
3. SetText(text) — изменение текста
4. SetTitle(icon, title) — изменение иконки и заголовка
5. Destroy() — уничтожение экземпляра объекта

Описание и примеры использования (GitHub): https://goo.gl/51pZeA
Автор teadrinker (на GitHub jollycoder), email dfiveg@mail.ru, skype dmitry_fiveg
*/
   __New( options )  {
      this.ShowNow := true
      for k, v in options
         this[k] := v
      this._CreateToolTip()
      ( this.ShowNow &amp;&amp; this.Show(this.x, this.y, this.Timeout) )
   }
   
   __Set(key, value)  {
      static PsevdoKeys := { close: &quot;CloseButton&quot;, trans: &quot;transparent&quot;, size: &quot;FontSize&quot;
                           , balloon: &quot;BalloonTip&quot;, ball: &quot;BalloonTip&quot;, tray: &quot;TrayTip&quot;
                           , style: &quot;FontStyle&quot;, time: &quot;Timeout&quot;, font: &quot;FontName&quot;
                           , back: &quot;BackColor&quot;, color: &quot;TextColor&quot;, now: &quot;ShowNow&quot; }
                           
      for k, v in PsevdoKeys
         if (key = k)
            this[v] := value
   }
   
   _CreateToolTip()  {
      static WS_POPUP := 0x80000000, WS_EX_TOPMOST := 8, WS_EX_TRANSPARENT := 0x20
           , TTS_NOPREFIX := 2, TTS_ALWAYSTIP := 1, TTS_BALLOON := 0x40, TTS_CLOSE := 0x80
           , TTF_TRACK := 0x20, TTF_ABSOLUTE := 0x80, szTI := A_PtrSize = 4 ? 48 : 72
     
      VarSetCapacity(TOOLINFO, szTI, 0)
      this.pTI := &amp;TOOLINFO
      NumPut(szTI, TOOLINFO)
      (this.TrayTip &amp;&amp; this.BalloonTip := true)
      NumPut(TTF_TRACK|(this.BalloonTip ? 0 : TTF_ABSOLUTE), &amp;TOOLINFO + 4)
      
      this.hwnd := DllCall(&quot;CreateWindowEx&quot;, UInt, WS_EX_TOPMOST|(this.transparent ? WS_EX_TRANSPARENT : 0)
        , Str, &quot;tooltips_class32&quot;, Str, &quot;&quot;
        , UInt, WS_POPUP | TTS_NOPREFIX | TTS_ALWAYSTIP | (this.CloseButton ? TTS_CLOSE : 0) | (this.BalloonTip ? TTS_BALLOON : 0)
        , Int, 0, Int, 0, Int, 0, Int, 0, Ptr, 0, Ptr, 0, Ptr, 0, Ptr, 0)
        
      if (this.FontName || this.FontSize || this.FontStyle)
         this._SetFont()
      
      if (this.TextColor != &quot;&quot; || this.BackColor != &quot;&quot;)
         this._SetColor()
      
      this._SetInfo()
   }
   
   _SetFont()  {
      static WM_GETFONT := 0x31, mult := A_IsUnicode ? 2 : 1, szLF := 28 + 32 * mult
           , LOGPIXELSY := 90, ANTIALIASED_QUALITY := 4
           , styles := { bold: {value: 700, offset: 16, size: &quot;Int&quot;}
                       , italic: {value: 1, offset: 20, size: &quot;Char&quot;}
                       , underline: {value: 1, offset: 21, size: &quot;Char&quot;}
                       , strikeout: {value: 1, offset: 22, size: &quot;Char&quot;} }
                       
      hPrevFont := this._SendMessage(WM_GETFONT)
      VarSetCapacity(LOGFONT, szLF, 0)
      DllCall(&quot;GetObject&quot;, Ptr, hPrevFont, Int, szLF, Ptr, &amp;LOGFONT)
      DllCall(&quot;DeleteObject&quot;, Ptr, hPrevFont)
      
      if this.FontSize  {
         hDC := DllCall(&quot;GetDC&quot;, Ptr, this.hwnd, Ptr)
         height := -DllCall(&quot;MulDiv&quot;, Int, this.FontSize, Int, DllCall(&quot;GetDeviceCaps&quot;, Ptr, hDC, Int, LOGPIXELSY), Int, 72)
         DllCall(&quot;ReleaseDC&quot;, Ptr, this.hwnd, Ptr, hDC)
         NumPut(height, LOGFONT, &quot;Int&quot;)
      }
      FontStyle := this.FontStyle
      Loop, parse, FontStyle, %A_Space%
         if obj := styles[A_LoopField]
            NumPut(obj.value, &amp;LOGFONT + obj.offset, obj.size)

      (this.FontSize &gt; 24 &amp;&amp; NumPut(ANTIALIASED_QUALITY, &amp;LOGFONT + 26, &quot;Char&quot;))
      this.FontName &amp;&amp; StrPut(this.FontName, &amp;LOGFONT + 28, StrLen(this.FontName) * mult, A_IsUnicode ? &quot;UTF-16&quot; : &quot;CP0&quot;)
      this.hFont := DllCall(&quot;CreateFontIndirect&quot;, Ptr, &amp;LOGFONT, Ptr)
   }
   
   _SetColor()  {
      static WM_USER := 0x400, TTM_SETTIPBKCOLOR := WM_USER + 19, TTM_SETTIPTEXTCOLOR := WM_USER + 20
      
      VarSetCapacity(empty, 2, 0)
      DllCall(&quot;UxTheme\SetWindowTheme&quot;, Ptr, this.hwnd, Ptr, 0, Ptr, &amp;empty)   
      ( this.TextColor != &quot;&quot; &amp;&amp; this._SendMessage(TTM_SETTIPTEXTCOLOR, this._GetColor(this.TextColor)) )
      ( this.BackColor != &quot;&quot; &amp;&amp; this._SendMessage(TTM_SETTIPBKCOLOR, this._GetColor(this.BackColor)) )
   }
   
   _GetColor(color)  {
      static WS_CHILD := 0x40000000, WM_CTLCOLORSTATIC := 0x138
      
      Gui, New, +hwndhGui +%WS_CHILD%
      Gui, Color, % color + 0 = &quot;&quot; ? color : Format(&quot;{:x}&quot;, color)
      Gui, Add, Text, hwndhText
      hdc := DllCall(&quot;GetDC&quot;, Ptr, hText, Ptr)
      SendMessage, WM_CTLCOLORSTATIC, hdc, hText,, ahk_id %hGui%
      clr := DllCall(&quot;GetBkColor&quot;, Ptr, hdc)
      DllCall(&quot;ReleaseDC&quot;, Ptr, hText, Ptr, hdc)
      Gui, Destroy
      Return clr
   }
   
   _SetInfo()  {
      static WM_USER := 0x400, TTM_SETMAXTIPWIDTH := WM_USER + 24
           , TTM_ADDTOOL := WM_USER + (A_IsUnicode ? 50 : 4), WM_SETFONT := 0x30
      
      this._SendMessage(WM_SETFONT, this.hFont, 1)
      this._SendMessage(TTM_ADDTOOL, 0, this.pTI)
      this.SetTitle(this.icon, this.title)
      this._SendMessage(TTM_SETMAXTIPWIDTH, 0, A_ScreenWidth)
      this.SetText(this.text)
   }
   
   SetText(text)  {
      static WM_USER := 0x400, TTM_UPDATETIPTEXT := WM_USER + (A_IsUnicode ? 57 : 12)
      NumPut(&amp;text, this.pTI + (A_PtrSize = 4 ? 36 : 48))
      this._SendMessage(TTM_UPDATETIPTEXT, 0, this.pTI)
   }
   
   SetTitle(icon := &quot;&quot;, title := &quot;&quot;)  {
      static WM_USER := 0x400, TTM_SETTITLE := WM_USER + (A_IsUnicode ? 33 : 32), TTM_UPDATE := WM_USER + 29
      
      ((icon || this.CloseButton) &amp;&amp; title = &quot;&quot;) &amp;&amp; title := &quot; &quot;
      this._SendMessage(TTM_SETTITLE, icon, &amp;title)
      (icon &gt; 3 &amp;&amp; DllCall(&quot;DestroyIcon&quot;, Ptr, icon))
      this._SendMessage(TTM_UPDATE)
   }
   
   Show(x := &quot;&quot;, y := &quot;&quot;, timeout := &quot;&quot;)  {
      static WM_USER := 0x400, TTM_TRACKACTIVATE := WM_USER + 17, TTM_TRACKPOSITION := WM_USER + 18
      
      if (x = &quot;TrayTimer&quot;)
         Critical
      
      if this.TrayTip  {
         this._GetTrayIconCoords(xTT, yTT)
         if !this.SetTrayTimer  {
            this.TrayTimer := timer := ObjBindMethod(this, &quot;Show&quot;, &quot;TrayTimer&quot;)
            SetTimer, % timer, 1000
            this.SetTrayTimer := true
         }
         else  {
            this._CheckPosAboveTaskBar()
            if (this.xTT = xTT &amp;&amp; this.yTT = yTT)
               Return
            else
               this.xTT := xTT, this.yTT := yTT
         }
      }
      else  {
         xTT := x, yTT := y
      
         if (xTT = &quot;&quot; || yTT = &quot;&quot;) {
            CoordMode, Mouse
            MouseGetPos, xm, ym
            (xTT = &quot;&quot; &amp;&amp; xTT := xm + 10)
            (yTT = &quot;&quot; &amp;&amp; yTT := ym + 10)
         }
      }
      this._SendMessage(TTM_TRACKPOSITION, 0, xTT|(yTT&lt;&lt;16))
      this._SendMessage(TTM_TRACKACTIVATE, 1, this.pTI)
      
      if this.BalloonTip
         xMax := A_ScreenWidth, yMax := A_ScreenHeight
      else  {
         WinGetPos,,, W, H, % &quot;ahk_id&quot; this.hwnd
         xMax := A_ScreenWidth - W - 10
         yMax := A_ScreenHeight - H - 10
      }
      
      if (xTT &gt; xMax || yTT &gt; yMax)  {
         (xTT &gt; xMax &amp;&amp; xTT := xMax)
         (yTT &gt; yMax &amp;&amp; yTT := yMax)
         this._SendMessage(TTM_TRACKPOSITION, 0, xTT|(yTT&lt;&lt;16))
      }

      if timeout  {
         timer := this.timer
         try SetTimer, % timer, Delete
         this.timer := timer := ObjBindMethod(this, timeout &gt; 0 ? &quot;Hide&quot; : &quot;Destroy&quot;)
         SetTimer % timer, % &quot;-&quot; . Abs(timeout)
      }
   }
   
   Hide()  {
      static WM_USER := 0x400, TTM_TRACKACTIVATE := WM_USER + 17
      this._SendMessage(TTM_TRACKACTIVATE, 0, this.pTI)
      if this.SetTrayTimer  {
         this.SetTrayTimer := false
         timer := this.TrayTimer
         SetTimer, % timer, Delete
      }
   }
   
   Destroy()  {
      this.__Delete()
      this.SetCapacity(0)
      this.base := &quot;&quot;
   }
   
   _CheckPosAboveTaskBar()  {
      static GW_HWNDNEXT := 2, SWP_NOSIZE := 1, SWP_NOMOVE := 2
      
      hTaskBar := WinExist(&quot;ahk_class Shell_TrayWnd&quot;)
      Loop
         hWnd := A_Index = 1 ? DllCall(&quot;GetTopWindow&quot;, Ptr, 0, Ptr) : DllCall(&quot;GetWindow&quot;, Ptr, hWnd, UInt, GW_HWNDNEXT, Ptr)
      until (hWnd = hTaskBar &amp;&amp; TaskBarAbove := true) || hWnd = this.hwnd
      
      if TaskBarAbove
         DllCall(&quot;SetWindowPos&quot;, Ptr, this.hwnd, Ptr, 0
                               , Int, 0, Int, 0, Int, 0, Int, 0
                               , UInt, SWP_NOSIZE | SWP_NOMOVE )
   }
   
   _SendMessage(msg, wp := 0, lp := 0)  {
      Return DllCall(&quot;SendMessage&quot;, Ptr, this.hwnd, UInt, msg, Ptr, wp, Ptr, lp, Ptr)
   }
   
   _GetTrayIconCoords(ByRef x, ByRef y)  {
      static WM_USER := 0x400, TB_BUTTONCOUNT := WM_USER + 24, TB_GETBUTTON := WM_USER + 23, TB_GETITEMRECT := WM_USER + 29
           , PtrSize := A_Is64bitOS ? 8 : 4, szTBBUTTON := 8 + PtrSize*3, szHWND := PtrSize
         
      for k, v in [&quot;TrayNotifyWnd&quot;, &quot;SysPager&quot;, &quot;ToolbarWindow32&quot;]
         hTray := DllCall(&quot;FindWindowEx&quot;, Ptr, k = 1 ? WinExist(&quot;ahk_class Shell_TrayWnd&quot;) : hTray, Ptr, 0, Str, v, UInt, 0, Ptr)
      WinWait, ahk_id %hTray%
      WinGet, PID, PID
      WinGetPos, xTB, yTB
      
      if !IsObject(RemoteBuff := new this.RemoteBuffer(PID, szTBBUTTON))  {
         x := xTB, y := yTB
         MsgBox, % &quot;Не удалось создать удалённый буфер`nОшибка &quot; A_LastError
         Return
      }
      SendMessage, TB_BUTTONCOUNT
      Loop % ErrorLevel  {
         SendMessage, TB_GETBUTTON, A_Index - 1, RemoteBuff.ptr
         pTBBUTTON := RemoteBuff.Read(szTBBUTTON)
         pHWND := RemoteBuff.Read(szHWND, NumGet(pTBBUTTON + 8 + PtrSize) - RemoteBuff.ptr)
         hWnd := NumGet(pHWND + 0, PtrSize = 4 ? &quot;UInt&quot; : &quot;UInt64&quot;)
         if (hWnd = A_ScriptHwnd)  {
            SendMessage, TB_GETITEMRECT, A_Index - 1, RemoteBuff.ptr
            pRECT := RemoteBuff.Read(16)
            x := xTB + ( NumGet(pRECT + 0, &quot;Int&quot;) + NumGet(pRECT + 8, &quot;Int&quot;) )//2
            y := yTB + ( NumGet(pRECT + 4, &quot;Int&quot;) + NumGet(pRECT + 12, &quot;Int&quot;) )//2 - 5
            break
         }
      }
      RemoteBuff := &quot;&quot;, ((x = &quot;&quot; || y = &quot;&quot;) &amp;&amp; (x := xTB, y := yTB))
   }
   
   __Delete()  {
      (this.hFont &amp;&amp; DllCall(&quot;DeleteObject&quot;, Ptr, this.hFont))
      (this.Icon &gt; 3 &amp;&amp; DllCall(&quot;DestroyIcon&quot;, Ptr, this.Icon))
      DllCall(&quot;DestroyWindow&quot;, Ptr, this.hwnd)
   }

   class RemoteBuffer
   {
      __New(PID, size)  {
         static PROCESS_VM_OPERATION := 0x8, PROCESS_VM_WRITE := 0x20
              , PROCESS_VM_READ := 0x10, MEM_COMMIT := 0x1000, PAGE_READWRITE := 0x4
            
         if !(this.hProc := DllCall(&quot;OpenProcess&quot;, UInt, PROCESS_VM_OPERATION|PROCESS_VM_READ|PROCESS_VM_WRITE, Int, 0, UInt, PID, Ptr))
            Return
         
         if !(this.ptr := DllCall(&quot;VirtualAllocEx&quot;, Ptr, this.hProc, Ptr, 0, Ptr, size, UInt, MEM_COMMIT, UInt, PAGE_READWRITE, Ptr))
            Return, &quot;&quot;, DllCall(&quot;CloseHandle&quot;, Ptr, this.hProc)
         
         this.hHeap := DllCall(&quot;GetProcessHeap&quot;, Ptr)
      }
      
      __Delete()  {
         DllCall(&quot;VirtualFreeEx&quot;, Ptr, this.hProc, Ptr, this.ptr, UInt, 0, UInt, MEM_RELEASE := 0x8000)
         DllCall(&quot;CloseHandle&quot;, Ptr, this.hProc)
         DllCall(&quot;HeapFree&quot;, Ptr, this.hHeap, UInt, 0, Ptr, this.pHeap)
      }
      
      Read(size, offset = 0)  {
         (this.pHeap &amp;&amp; DllCall(&quot;HeapFree&quot;, Ptr, this.hHeap, UInt, 0, Ptr, this.pHeap))
         this.pHeap := DllCall(&quot;HeapAlloc&quot;, Ptr, this.hHeap, UInt, HEAP_ZERO_MEMORY := 0x8, Ptr, size, Ptr)
         if !DllCall(&quot;ReadProcessMemory&quot;, Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, this.pHeap, Ptr, size, Int, 0)
            Return, 0, DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось прочитать данные`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
         Return this.pHeap
      }
      
      Write(pLocalBuff, size, offset = 0)  {
         if !res := DllCall(&quot;WriteProcessMemory&quot;, Ptr, this.hProc, Ptr, this.ptr + offset, Ptr, pLocalBuff, Ptr, size, PtrP, writtenBytes)
            DllCall(&quot;MessageBox&quot;, Ptr, 0, Str, &quot;Не удалось записать данные`nОшибка &quot; A_LastError, Str, &quot;&quot;, UInt, 0)
         Return writtenBytes
      }
   }
}</code></pre></div><h5>Примеры использования</h5><div class="codebox"><pre><code>myToolTip := new ToolTip({ title: &quot;Title&quot;
                         , text: &quot;I&#039;m the colored TrayTip!&quot;
                         , icon: 1  ; icon Info
                         , TrayTip: true
                         , FontName: &quot;Comic Sans MS&quot;
                         , FontSize: 20
                         , TextColor: &quot;Navy&quot;
                         , BackColor: 0xFFA500 })
#Include %A_ScriptDir%\ToolTip.ahk</code></pre></div><p>Результат:</p><p><span class="postimg"><img src="http://i.imgur.com/txDfd6v.jpg" alt="http://i.imgur.com/txDfd6v.jpg" /></span></p><br /><p>Для работы примеров необходимо сохранить класс ToolTip в файл ToolTip.ahk и положить его в папку скрипта, либо удалить из кода строку <span style="color: #004488"><em>#Include %A_ScriptDir%\ToolTip.ahk</em></span> и дописать класс непосредственно в код примера.<br />Ещё пример:<br /></p><div class="codebox"><pre><code>myTrayTip := new ToolTip({ title: &quot; Look!&quot;
                         , text: &quot; It&#039;s a blue TrayTip! &quot;
                         , FontSize: 18
                         , icon: 2            ; icon Warning
                         , TrayTip: true      ; будет отображаться возле иконки скрипта в трее
                         , Timeout: -4000     ; TrayTip будет удалён через 4 секунды
                         , BackColor: 0x0055aa
                         , TextColor: &quot;white&quot; })
Sleep, 2500
myTrayTip.SetTitle()  ; удаляем иконку и текст заголовка
myTrayTip.SetText(&quot;Goodbye!&quot;)
Sleep, 2000
ExitApp

#Include %A_ScriptDir%\ToolTip.ahk</code></pre></div><p>Более сложный пример:<br /></p><div class="codebox"><pre><code>myTrayTip := new ToolTip({ text: &quot;Модифицированный TrayTip&quot;
                         , title: &quot;Стандартная иконка «Info»&quot;
                         , CloseButton: true
                         , Icon: 1              ; 1 — Info, 2 — Warning, 3 — Error, n &gt; 3 — предполагается hIcon
                         , TrayTip: true
                         , ShowNow: false       ; изначально показан не будет
                         , FontSize: 16
                         , FontName: &quot;Verdana&quot; })

myToolTip := new ToolTip({ text: &quot;Это модифицированный ToolTip.`nОн прозрачен для кликов мыши.&quot;
                         , title: &quot;Кастомная иконка&quot;
                         , Timeout: 2500
                         , Icon: hIcon := CreateIconFromBase64(GetIcon(), 32)
                         , transparent: true    ; если true — окно прозрачно для мыши
                         , BalloonTip: true
                         , FontSize: 22
                         , FontName: &quot;Times New Roman&quot;
                         , FontStyle: &quot;italic&quot; })
                         
ColoredTip:= new ToolTip({ text: &quot;Я цветной ToolTip!`nЯ исчезну через 7 сек&quot;
                         , x: A_ScreenWidth
                         , y: 0
                         , BalloonTip: true
                         , TextColor: &quot;Navy&quot;
                         , BackColor: 0xFFA500
                         , FontName: &quot;Comic Sans MS&quot;
                         , FontSize: 20
                         , Timeout: -7000 })  ; будет автоматически удалён через 7000 мс
                         
oTimer := Func(&quot;Timer&quot;).Bind(ColoredTip)
SetTimer, % oTimer, 1000  ; этот таймер только для изменения текста
Sleep, 1000
myTrayTip.Show()  ; показываем изначально скрытый TrayTip, созданный с параметром ShowNow: false
Sleep, 1500
myToolTip.SetText(&quot;Можно менять`nтекст и расположение&quot;)  ; меняем текст
Sleep, 500

myToolTip.Show(50, 50, 2000)  ; показываем в координатах x = 50, y = 50 на две секунды
Sleep, 2000

myToolTip.SetText(&quot;I&#039;m near the mouse cursor!&quot;)
Sleep, 500

myToolTip.Show(&quot;&quot;, &quot;&quot;, -2500)  ; без координат — в районе курсора, таймаут отрицательный, значит объект через 
                               ; две с половиной секунды удалится без возможности дальнейшего использования
Sleep, 2500

myTrayTip.SetTItle(2, &quot;Изменённый заголовок&quot;)  ; меняем иконку и заголовок
myTrayTip.SetText(&quot;Goodbye!&quot;)
Sleep, 1000
myTrayTip.Destroy()
Sleep, 1000
ExitApp

Timer(oTip)  {
   static i := 0
   oTip.SetText(&quot;Я цветной ToolTip!`r`nЯ исчезну через &quot; (7 - ++i) &quot; сек&quot;)
   if (i = 7)
      SetTimer,, Delete
}

CreateIconFromBase64(StringBASE64, Size)
{
   StringBase64ToData(StringBASE64, IconData)
   Return DllCall(&quot;CreateIconFromResourceEx&quot;, Ptr, &amp;IconData + 4
      , UInt, NumGet(&amp;IconData, &quot;UInt&quot;), UInt, true, UInt, 0x30000, Int, Size, Int, Size, UInt, 0)
}
   
StringBase64ToData(StringBase64, ByRef OutData)
{
   DllCall(&quot;Crypt32.dll\CryptStringToBinary&quot;, Ptr, &amp;StringBase64 
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64 := 1, UInt, 0, UIntP, Bytes, UIntP, 0, UIntP, 0)

   VarSetCapacity(OutData, Bytes) 
   DllCall(&quot;Crypt32.dll\CryptStringToBinary&quot;, Ptr, &amp;StringBase64 
      , UInt, StrLen(StringBase64), UInt, CRYPT_STRING_BASE64, Str, OutData, UIntP, Bytes, UIntP, 0, UIntP, 0)
   Return Bytes
}

GetIcon()  {
   Icon32 = 
   (RTrim Join
      qBAAACgAAAAgAAAAQAAAAAEAIAAAAAAAgBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      FRgjABMXIQATFyEAFBchABMXIQAVGCMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAABUYIwAAAAAAAAAAAAAAAAIAAAAAAAAAABUYIwAVGCMAExchABMXIRQUFyETExchABUYIwAVGCMAAAAAAAAAAAAAAAACAAAAAAAAAAAVGCMAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRgjABQXIgAUFyIAFBciABMXIQATFyEAFRgjABUYIwIUFyIAFBciqxQXIqoUFyIAFRgjAhUYIwAUFyIA
      FBgiABQXIgATFyIAExciABUYIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVGCMAFBciABQXIhAUFiFCExgiABMWIQAAAAAA
      FRgjAxUYIwAVFiO4ExghuBUYIwAVGCMDAAAAABQXIgATGiIAExchQhMYIhATGCIAFRgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAABUYIwEUFyIAFBchMhQXIv8TFyFDFBciABUXIwIVGCMCFRgjABUXI7sUGCK7FRgjABUYIwIUFyMCFBciABQXIkMUFyL/FBchMhQXIgAVGCMBAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRgjABUXIgEVFyIAFBciuRQXItoVGSICFRgiARUYIwMUFyIBFBcinRMXIp0UFyIBFRgjAxUYIgEVGCIC
      FBci2hQXIroVFyIAFRciARUYIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRgjAAAAAAAAAAAAAAAAAgAAAAEVGCMAFBgjARQXIgAUFyIkFBci/xQXImEUFyIC
      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
      FBci2xQXIrcUGCMAFBgjARUYIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVGCMBFRciABUXIjIUFyL/FBciQxQXIgAUFyMC
      FRgjAxUYIwAVFyO7FBgiuxUYIwAVGCMDFRgiAhQXIgAUFiFFFBci/xQXIjEUFyIAFRgjAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAABUYIwAUFyIAFBciEBQXIkITGCYAFRQiAAAAAAAVGCMDFRgjABUWI7gTGCG4FRgjABUYIwMAAAAAExYgABQVHgATFiFDFBYiEBQWIgAVGCMAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFRgjABQXIgAUFyEAFBciABQXJAAVFSIAFRgjABUYIwIVFyIAFBciqxQXIqoVFyIAFRgjAhUYIwATFiEA
      FBYgABMXIgAUFyIAFBciABUYIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVGCMAAAAAAAAAAAAAAAACAAAAAAAAAAAVGCMA
      FRgjABUWIQAUFyEVFRYiFBUWIQAVGCMAFRgjAAAAAAAAAAAAAAAAAgAAAAAAAAAAFRgjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAVGCMAFRciABQXIgAVFiIAFRYiABUYIwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
      AAAAAAAAAAAAAAAA/////////////n////5///++ff//nnn//8/z///f+//38A/v8eAHj/jAAx//gAH//wAB//8AAP//AAD/wwAAw8MAAMP/AAD//wAA//+AAf//gAH/
      +MADH/HgB4/38A/v///////P8///nnn//759///+f////n////////////8=
   )
   Return Icon32
}

#Include %A_ScriptDir%\ToolTip.ahk</code></pre></div><p>Вопросы можно задать в <a href="http://forum.script-coding.com/viewtopic.php?id=12125">этой</a> теме.<br /><a href="https://github.com/jollycoder/AutoHotkey/tree/ToolTip-%D1%81%D0%BE-%D1%81%D0%B2%D0%BE%D0%B8%D0%BC-%D1%88%D1%80%D0%B8%D1%84%D1%82%D0%BE%D0%BC-%D0%B8-%D1%86%D0%B2%D0%B5%D1%82%D0%BE%D0%BC"><strong>Пост на GitHub:</strong></a> описание, примеры и changelog.</p>]]></description>
			<author><![CDATA[null@example.com (teadrinker)]]></author>
			<pubDate>Mon, 19 Dec 2016 22:14:57 +0000</pubDate>
			<guid>http://forum.script-coding.com/viewtopic.php?pid=109943#p109943</guid>
		</item>
	</channel>
</rss>
