1 (изменено: Mikki, 2021-05-26 23:23:42)

Тема: AHK: "убегание" ToolTip-a с TaskBar-a

Добрый день/вечер форумчане. Давненько я сюда не заглядывал, да вот возникла необходимость.

При попытке показать тултип над таскбаром - тултип улетает к противоположной от таскбара стороне экрана.
Нашел аналогичный вопрос на https://www.autohotkey.com, но там на него ответа нет.

Собственно вопрос - как побороть у ToolTip-а "непереносимость" TaskBar-a?


Скрипт для примера:


#Singleinstance force
SetTimer, Show_Sound, 100

~vkAf::
SetTimer, Show_Sound, 100
Show_Sound: ; тултип к Регулировке громкости 
  SoundGet, CurSound
  CurSound:=Round(CurSound)
  ToolTip, Громкость: %CurSound%
return
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

2

Re: AHK: "убегание" ToolTip-a с TaskBar-a

CoordMode?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

3

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker, извините, но не осознал. Попробовал поиграться с CoordMode-ом, но не помогло

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

4

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Так укажите конкретные координаты в тултипе, предварительно задав CoordMode, ToolTip, Screen.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Попробовал так - результат тот же.

Show_Sound: ; тултип к Регулировке громкости 
  CoordMode, ToolTip, Screen
  MouseGetPos,mX,mY,
  SoundGet, CurSound
  CurSound:=Round(CurSound)
  ToolTip, Громкость: %CurSound%, mX+20, mY+40
return
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

6

Re: AHK: "убегание" ToolTip-a с TaskBar-a

А для мыши CoordMode?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Тоже встречал такую проблему.
Если применить в секции автовыполнения команду 'CoordMode' - то в окошке получения звука всё показывает нормально.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

8

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker , __Михаил__ Ни чего не изменилось. Все так же перепрыгивает на верх

Show_Sound: ; тултип к Регулировке громкости 
  CoordMode, ToolTip, Screen
  CoordMode, Mouse, Screen
  MouseGetPos,mX,mY,
  SoundGet, CurSound
  CurSound:=Round(CurSound)
  ToolTip, Громкость: %CurSound%, mX+20, mY+10
return
Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

9

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Так зачем вы его к координатам курсора привязываете? Бывает, что курсор прыгает по какой-то причине. Привяжите к конкретным координатам экрана, или координатам окна, возле которого хотите показать ToolTip.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker, а-ааа, так ведь, я его и хочу привязать к курсору.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

11

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Тогда будет прыгать вместе с курсором (если это так). В любом случае, я не могу воспроизвести проблему, пока вы не приведёте скрипт, который можно запустить, и который её продемонстрирует.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker, а разве в первом посте скрипт не воспроизводит проблему?

При попадании тултипа на таскбар - его перекидывает на верх экрана. Мышка остается там где и была. С ней все впорядке.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

13

Re: AHK: "убегание" ToolTip-a с TaskBar-a

А вы пробовали запускать этот скрипт, как есть?

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker спасибо за замечание. Поправил и в начальном посте и привожу тут:

#Singleinstance force
SetTimer, Show_Sound, 100

~vkAf::
Show_Sound: ; тултип к Регулировке громкости 
  CoordMode, ToolTip, Screen
  CoordMode, Mouse, Screen
  MouseGetPos,mX,mY,
  SoundGet, CurSound
  CurSound:=Round(CurSound)
  ToolTip, Громкость: %CurSound%, mX+20, mY+10
return

не знаю как заставить работать постоянно - пришлось добавить некую горячую клавишу.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

15

Re: AHK: "убегание" ToolTip-a с TaskBar-a

#Persistent нужно было. Теперь удалось воспроизвести на Windows 10, на семёрке нормально. Скорее всего, на десятке ToolTip не хочет показываться по какой-то причине поверх панели задач, не знаю, почему. Наверно, можно что-то нагуглить. Но у меня получилось показывать над панелью задач кастомный ToolTip, заодно можно менять цвет и шрифт.

#Persistent
SetTimer, Show_Sound, 100
Return

Show_Sound:
   MouseGetPos,mX,mY,
   SoundGet, CurSound
   CurSound:=Round(CurSound)
   if !hToolTip
      hToolTip := CustomToolTip({text: "Громкость: " . CurSound, x: mX, y: mY}*)
   else {
      if !(CurSound = prevCurSound)
         UpdateText(hTooltip, "Громкость: " . CurSound), prevCurSound := CurSound
      if !(mX = prevMx && mY = prevMy) {
         SendMessage, TTM_TRACKPOSITION := 0x412,, mX | (mY << 16),, ahk_id %hToolTip%
         prevMx := mX, prevMy := mY
      }
   }
return

CustomToolTip( text, x := "", y := "", title := ""
             , icon := 0  ; can be 1 — Info, 2 — Warning, 3 — Error, if greater than 3 — hIcon
             , transparent := false
             , closeButton := false, backColor := "", textColor := 0
             , fontName := "", fontOptions := ""  ; like in GUI
             , isBallon := false, timeout := "", maxWidth := 600 )
{
   static ttStyles := (TTS_NOPREFIX := 2) | (TTS_ALWAYSTIP := 1), TTS_BALLOON := 0x40, TTS_CLOSE := 0x80
        , TTF_TRACK := 0x20, TTF_ABSOLUTE := 0x80
        , TTM_SETMAXTIPWIDTH := 0x418, TTM_TRACKACTIVATE := 0x411, TTM_TRACKPOSITION := 0x412
        , TTM_SETTIPBKCOLOR := 0x413, TTM_SETTIPTEXTCOLOR := 0x414
        , TTM_ADDTOOL        := A_IsUnicode ? 0x432 : 0x404
        , TTM_SETTITLE       := A_IsUnicode ? 0x421 : 0x420
        , TTM_UPDATETIPTEXT  := A_IsUnicode ? 0x439 : 0x40C
        , WM_SETFONT := 0x30, WM_GETFONT := 0x31
        , WS_EX_TRANSPARENT := 0x00000020
        , exStyles := (WS_EX_TOPMOST := 0x00000008) | (WS_EX_COMPOSITED := 0x2000000) | (WS_EX_LAYERED := 0x00080000)
        
   dhwPrev := A_DetectHiddenWindows
   DetectHiddenWindows, On
   defGuiPrev := A_DefaultGui, lastFoundPrev := WinExist()
   hWnd := DllCall("CreateWindowEx", "UInt", exStyles | WS_EX_TRANSPARENT * !!transparent, "Str", "tooltips_class32", "Str", ""
                                   , "UInt", ttStyles | TTS_CLOSE * !!CloseButton | TTS_BALLOON * !!isBallon
                                   , "Int", 0, "Int", 0, "Int", 0, "Int", 0, "Ptr", 0, "Ptr", 0, "Ptr", 0, "Ptr", 0, "Ptr")
   WinExist("ahk_id" . hWnd)
   if (textColor != 0 || backColor != "") {
      DllCall("UxTheme\SetWindowTheme", "Ptr", hWnd, "Ptr", 0, "Str", "")
      ByteSwap := Func("DllCall").Bind("msvcr100\_byteswap_ulong", "UInt")
      SendMessage, TTM_SETTIPBKCOLOR  , ByteSwap.Call(backColor << 8)
      SendMessage, TTM_SETTIPTEXTCOLOR, ByteSwap.Call(textColor << 8)
   }
   if (fontName || fontOptions) {
      Gui, New
      Gui, Font, % fontOptions, % fontName
      Gui, Add, Text, hwndhText
      SendMessage, WM_GETFONT,,,, ahk_id %hText%
      SendMessage, WM_SETFONT, ErrorLevel
      Gui, Destroy
      Gui, %defGuiPrev%: Default
   }
   if (x = "" || y = "")
      DllCall("GetCursorPos", "Int64P", pt)
   (x = "" && x := (pt & 0xFFFFFFFF) + 15), (y = "" && y := (pt >> 32) + 15)
   
   VarSetCapacity(TOOLINFO, sz := 24 + A_PtrSize*6, 0)
   NumPut(sz, TOOLINFO)
   NumPut(TTF_TRACK | TTF_ABSOLUTE * !isBallon, TOOLINFO, 4)
   NumPut(&text, TOOLINFO, 24 + A_PtrSize*3)
   
   SendMessage, TTM_SETTITLE      , icon, &title
   SendMessage, TTM_TRACKPOSITION ,     , x | (y << 16)
   SendMessage, TTM_SETMAXTIPWIDTH,     , maxWidth
   SendMessage, TTM_ADDTOOL       ,     , &TOOLINFO
   SendMessage, TTM_UPDATETIPTEXT ,     , &TOOLINFO
   SendMessage, TTM_TRACKACTIVATE , true, &TOOLINFO
   
   if timeout {
      Timer := Func("DllCall").Bind("DestroyWindow", "Ptr", hWnd)
      SetTimer, % Timer, % "-" . timeout
   }
   WinExist("ahk_id" . lastFoundPrev)
   DetectHiddenWindows, % dhwPrev
   Return hWnd
}

UpdateText(hTooltip, text) {
   static TTM_UPDATETIPTEXT := A_IsUnicode ? 0x439 : 0x40C
   VarSetCapacity(TOOLINFO, sz := 24 + A_PtrSize*6, 0)
   NumPut(sz, TOOLINFO)
   NumPut(&text, TOOLINFO, 24 + A_PtrSize*3)
   SendMessage, TTM_UPDATETIPTEXT,, &TOOLINFO,, ahk_id %hTooltip%
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker Мдааа, по хоже без кастомизации не обойтись. Спасибо за готовую реализацию. Утащу к себе.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

17

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Например так:

CustomToolTip({text: "Этот ToolTip исчезнет через 2 секунды", timeout: 2000}*)

Но можно, как обычный вызов функции с параметрами:

CustomToolTip("Этот ToolTip исчезнет через 2 секунды",,,,,,,,,,,, 2000)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Думаю баг - напишу на оф.форуме.

19

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker, спасибо, с этим разобрался. Сейчас пытаюсь сделать чтобы тултип всегда двигался за курсором.... И это через таймер получилось.

Но, вот скрывать тултип через секунду после того как перестал изменять громкость - тут некоторая закавыка:
-если я выставляю timeout: , то тултип закрывается через этот промежуток не взирая ни на что иное. Да, если я при этом продолжаю изменять громкость, то он тут же появляется снова. Происходить короткое исчезновение тултипа и он опять на экране.

Можно ли реализовать убирание тултипа с экрана через WinClose а не через timeout: ?

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

20

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Можно, WinClose, ahk_id %hToolTip%.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21 (изменено: Mikki, 2021-05-27 02:37:02)

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Интересно - если в момент нахождения на экране кастомного тултипа кликнуть по таскбару - то он так же как и оригинальный тултип - перепрыгнет на верх экрана.
И - если кликать по разным окнам пока кастомный тултип на экране - то он будет менять свое положение в зависимости от того куда сдвинуто окно в фокусе. Если же окно сильно вверх сдвинуто (как пример) за пределы экрана, то тултип уедет на столько же вниз под экран. 0___0

Но, наверное, я должен уточнить, что я дописал привязку тултипа к курсору таким образом:

Show_Sound: ; тултип к Регулировке громкости 
   MouseGetPos,msX,msY,
   SoundGet, CurSound
   CurSound:=Round(CurSound)
   if !hToolTip
      hToolTip := CustomToolTip({text: "Громкость: " . CurSound, x: msX+20, y: msY+10}*)
   else {
      if !(CurSound = prevCurSound)
         UpdateText(hTooltip, "Громкость: " . CurSound), prevCurSound := CurSound
   }

   SetTimer, Schedule_CustomTooltip_Close, 3000
   if flag_Update_CustomTooltip_Position
		return
	flag_Update_CustomTooltip_Position = 1
   SetTimer, Update_CustomTooltip_Position, 20
return

Update_CustomTooltip_Position:
	MouseGetPos,msX,msY,
    SendMessage, TTM_TRACKPOSITION := 0x412,, msX+20 | (msY+10 << 16),, ahk_id %hToolTip%
return

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

22

Re: AHK: "убегание" ToolTip-a с TaskBar-a

Ваш скрипт опять нельзя запустить, но вижу, что нет CoordMode для мыши, а по умолчанию координаты отсчитываются относительно активного окна.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

23

Re: AHK: "убегание" ToolTip-a с TaskBar-a

teadrinker спасибо. Помогло.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди