Что нового

ToolTip, сделать всегда на заднем плане

duglas24h

Новичок
Сообщения
4
Репутация
0
Прошу помощи, нужно заставить выводимый tooltip всегда оставаться на заднем плане. Сейчас делаю вот так:
Код:
ToolTip($string,1040,650,"",1)
_WinAPI_SetWindowPos(WinGetHandle("starline"), $HWND_BOTTOM, 0, 0, 0, 0, BitOR($SWP_NOACTIVATE, $SWP_NOMOVE, $SWP_NOSIZE))

окно на заднем плане, все отлично. однако при нажатии Win+D, сочетания "Свернуть все" в windows - сворачиваются все окна и в том числе - tooltip. при клике на любом свернутом окне он тоже разворачивается. а мне текст на нем нужен всегда на рабочем столе, в бэкграунде. как это можно реализовать?
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
duglas24h
Обязательно tooltip? Может лучше отдельное GUI сделать с нужными свойствами?

Кроме того, можно пользоваться не стандартной функцией "свернуть все", а наподобие такой:
http://autoit-script.ru/index.php?topic=4649.0
 
Автор
D

duglas24h

Новичок
Сообщения
4
Репутация
0
GUI не пользуюсь, вид не нравится, хочу тултип :smile:
я не пользуюсь скриптом для сворачивания всех окон. у меня есть скрипт, который должен работать в фоне и выводить инфу в тултип. я работаю за компом. как только мне нужна информация - я жму руками Win+D, все сворачивается, смотрю инфу, опять Win+D, все разворачивается.

вот когда первый раз жму - сворачивается и тултип. возможно это в скрипте запретить?
 
Автор
D

duglas24h

Новичок
Сообщения
4
Репутация
0
100 просмотров, толку нету - нету на вопрос ответа.. :beer: :IL_AutoIt_1:
 

axlwor

Скриптер
Сообщения
657
Репутация
147
попробуй win+m
но я все равно не понимаю чего ты добиваешься
 

edward_freedom

Осваивающий
Сообщения
200
Репутация
44
Зачем вообще надло ToolTip, если он будет на заднем плане?
 

axlwor

Скриптер
Сообщения
657
Репутация
147
Проверил. win7. код из примера для tooltip. паузу поставил на 20 секунд. win+d показывает десктоп. снова win+d. тултип виден в обоих случаях
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Можно вот так попробовать:

Код:
HotKeySet("{ESC}", "_Exit")

Opt("WinWaitDelay", 0)

Global $hDesktop = WinGetHandle("[CLASS:Progman]")
Global $sToolTip = "starline"
Global $sExcludes = '^(' & $hDesktop & '|' & $sToolTip & ')$'

While 1
	_DesktopWaitActive($sExcludes)
	ToolTip($sToolTip, 1040, 650, "", 1)
	_DesktopWaitNotActive($sExcludes)
	ToolTip("")
WEnd

Func _Exit()
	Exit
EndFunc

Func _DesktopWaitActive($sExclude_Pattern)
	Local $aWinList, $nWinState, $aWinPos
	
	While 1
		Sleep(10)
		$aWinList = WinList()
		
		For $i = 1 To $aWinList[0][0]
			$nWinState = WinGetState($aWinList[$i][1])
			
			If $aWinList[$i][0] = "" Or _
				StringRegExp($aWinList[$i][0], $sExclude_Pattern) Or _
				StringRegExp($aWinList[$i][1], $sExclude_Pattern) Or _
				Not BitAND($nWinState, 2) Then ContinueLoop
			
			If Not BitAND($nWinState, 16) Then ;window not minimized
				$aWinPos = WinGetPos($aWinList[$i][1])
				If $aWinPos[0]+$aWinPos[2] > 0 And $aWinPos[1]+$aWinPos[3] > 0 Then ContinueLoop 2
			EndIf
		Next
		
		Return 1
	WEnd
EndFunc

Func _DesktopWaitNotActive($sExclude_Pattern)
	Local $aWinList, $nWinState, $aWinPos
	
	While 1
		Sleep(10)
		$aWinList = WinList()
		
		For $i = 1 To $aWinList[0][0]
			$nWinState = WinGetState($aWinList[$i][1])
			
			If $aWinList[$i][0] = "" Or _
				StringRegExp($aWinList[$i][0], $sExclude_Pattern) Or _
				StringRegExp($aWinList[$i][1], $sExclude_Pattern) Or _
				Not BitAND($nWinState, 2) Then ContinueLoop
			
			If Not BitAND($nWinState, 16) Then ;window not minimized
				$aWinPos = WinGetPos($aWinList[$i][1])
				If $aWinPos[0]+$aWinPos[2] > 0 And $aWinPos[1]+$aWinPos[3] > 0 Then
					Return 1
				EndIf
			EndIf
		Next
	WEnd
EndFunc


проверял только на XP.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Можно еще так попробовать, у меня, вроде, работает:
Код:
#include <Misc.au3>

$fShow = False
$fShowOld = False
$sString = 'Test string ToolTip'
HotKeySet('{Esc}', '_Exit')
While 1
	If (_IsPressed('5B') Or _IsPressed('5C')) And _IsPressed('44') Then
		$fShow = Not $fShow
		While (_IsPressed('5B') Or _IsPressed('5C')) And _IsPressed('44')
			Sleep(5)
		WEnd
	EndIf
	If $fShowOld <> $fShow Then
		$fShowOld = $fShow
		If $fShowOld Then
			ToolTip($sString, 0, 0)
		Else
			ToolTip('')
		EndIf
	EndIf
	Sleep(5)
WEnd

Func _Exit()
	Exit
EndFunc   ;==>_Exit
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
madmasles [?]
Можно еще так попробовать, у меня, вроде, работает
Оно не работает если...

* Вручную свернуть все окна.
* Свёртывание из внешних приложений.
* Вызов Desktop.scf (в WinXP оно ещё есть по крайней мере).
* ПКМ на панели задач -> Показать Рабочий стол.

;)

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

Код:
#include <WinAPI.au3>

HotKeySet("{ESC}", "_Exit")
Opt("WinWaitDelay", 0)

Global $hDesktop = WinGetHandle("[CLASS:Progman]")
Global $hTaskBar = WinGetHandle("[CLASS:Shell_TrayWnd]")
Global $sToolTip = "starline"
Global $sExcludes = '^(' & $hDesktop & '|' & $hTaskBar & '|' & $sToolTip & ')$'

While 1
	If _DesktopIsActive($sExcludes) Then
		ToolTip($sToolTip, 1040, 650, "", 1)
		
		While _DesktopIsActive($sExcludes)
			Sleep(10)
		WEnd
		
		ToolTip("")
	EndIf
WEnd

Func _Exit()
	Exit
EndFunc

Func _DesktopIsActive($sExclude_Pattern)
	Local $aWinList, $nWinState, $stRET, $iCmds
	
	$aWinList = WinList()
	
	For $i = 1 To $aWinList[0][0]
		$nWinState = WinGetState($aWinList[$i][1])
		
		If $aWinList[$i][0] = "" Or _
			Not BitAND($nWinState, 2) Or _
			StringRegExp($aWinList[$i][0], $sExclude_Pattern) Or _
			StringRegExp($aWinList[$i][1], $sExclude_Pattern) Then ContinueLoop
		
		If Not BitAND($nWinState, 16) Then ;window not minimized
			$stRET = _WinAPI_GetWindowPlacement($aWinList[$i][1])
			$iCmds = DllStructGetData($stRET, "ptMinPosition", 1)
			If $iCmds <> -1 Then Return 0
		EndIf
	Next
	
	Return 1
EndFunc
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ещё можно вот так сделать (проверять окно находящееся в позиции тултипа):

Код:
#include <WinAPI.au3>
#include <WindowsConstants.au3>

HotKeySet("{ESC}", "_Exit")
Opt("WinWaitDelay", 0)

Global $hDesktop = WinGetHandle("[CLASS:Progman]")
Global $sToolTip_Text = "Some text"
Global $sToolTip_Title = "My ToolTip"

$iLeft_Pos = 1040
$iTop_Pos = 650

$tPoint = DllStructCreate($tagPoint)
DllStructSetData($tPoint, "x", $iLeft_Pos)
DllStructSetData($tPoint, "y", $iTop_Pos)

While 1
	If _WinAPI_GetParentFromPoint($tPoint) = $hDesktop Then
		ToolTip($sToolTip_Text, $iLeft_Pos, $iTop_Pos, $sToolTip_Title, 1)
		$hToolTip = WinGetHandle("[CLASS:tooltips_class32;TITLE:" & $sToolTip_Text & "]")
		WinSetOnTop($hToolTip, "", 0)
		
		While 1
			$hParentFromPoint = _WinAPI_GetParentFromPoint($tPoint)
			If $hParentFromPoint <> $hToolTip And $hParentFromPoint <> $hDesktop Then ExitLoop
			Sleep(10)
		WEnd
		
		ToolTip("")
	EndIf
	
	Sleep(10)
WEnd

Func _WinAPI_GetParentFromPoint($tPoint)
	Return _WinAPI_GetAncestor(_WinAPI_WindowFromPoint($tPoint), $GA_ROOTOWNER)
EndFunc

Func _Exit()
	Exit
EndFunc
 

Redline

AutoIT Гуру
Сообщения
506
Репутация
375
Вариант, который у меня сработал:
Код:
#Include <WinAPI.au3>
$hTooltip = ToolTip('text', 1040, 650, '', 1)
Global $hTool = WinGetHandle('[REGEXPCLASS:(?i)tooltip]')
WinSetOnTop($hTool, '', 0)
AdlibRegister('check', 500)
Sleep(10000)
Func check()
	$hwd = _WinAPI_GetForegroundWindow()
	If WinGetTitle($hwd) = '' Then
		WinSetOnTop($hTool, '', 1)
		WinSetOnTop($hTool, '', 0)
	EndIf
EndFunc

даже еще короче
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
И ещё:

Код:
HotKeySet("{ESC}", "_Exit")
Opt("WinWaitDelay", 0)

$sToolTip_Text = "Some text"

ToolTip($sToolTip_Text, 1040, 650, "My ToolTip", 1)
WinWait("[CLASS:tooltips_class32;TITLE:" & $sToolTip_Text & "]")
$hToolTip = WinGetHandle("[CLASS:tooltips_class32;TITLE:" & $sToolTip_Text & "]")
WinSetOnTop($hToolTip, "", 0)
WinActivate($hToolTip)

While 1
    If WinActive($hToolTip) Then
        WinSetState($hToolTip, "", @SW_HIDE)
        WinSetState($hToolTip, "", @SW_SHOWNOACTIVATE)
    EndIf
    
    Sleep(10)
WEnd

Func _Exit()
    Exit
EndFunc


Redline [?]
даже еще короче
Короче - это ещё не значит что лучше ;)


Добавлено:
Сообщение автоматически объединено:

duglas24h [?]
100 просмотров, толку нету - нету на вопрос ответа
А теперь то ответы есть, подходит один из вариантов?
А то мы тут будем придумывать разные вариаций решения твоей задачи до посинения :D
 
Автор
D

duglas24h

Новичок
Сообщения
4
Репутация
0
Спасибо всем!
Нормально заработал вот этот пример, думаю, на нем и остановлюсь
Код:
#include <WinAPI.au3>

HotKeySet("{ESC}", "_Exit")
Opt("WinWaitDelay", 0)

Global $hDesktop = WinGetHandle("[CLASS:Progman]")
Global $hTaskBar = WinGetHandle("[CLASS:Shell_TrayWnd]")
Global $sToolTip = "starline"
Global $sExcludes = '^(' & $hDesktop & '|' & $hTaskBar & '|' & $sToolTip & ')$'

While 1
    If _DesktopIsActive($sExcludes) Then
        ToolTip($sToolTip, 1040, 650, "", 1)
        
        While _DesktopIsActive($sExcludes)
            Sleep(10)
        WEnd
        
        ToolTip("")
    EndIf
WEnd

Func _Exit()
    Exit
EndFunc

Func _DesktopIsActive($sExclude_Pattern)
    Local $aWinList, $nWinState, $stRET, $iCmds
    
    $aWinList = WinList()
    
    For $i = 1 To $aWinList[0][0]
        $nWinState = WinGetState($aWinList[$i][1])
        
        If $aWinList[$i][0] = "" Or _
            Not BitAND($nWinState, 2) Or _
            StringRegExp($aWinList[$i][0], $sExclude_Pattern) Or _
            StringRegExp($aWinList[$i][1], $sExclude_Pattern) Then ContinueLoop
        
        If Not BitAND($nWinState, 16) Then ;window not minimized
            $stRET = _WinAPI_GetWindowPlacement($aWinList[$i][1])
            $iCmds = DllStructGetData($stRET, "ptMinPosition", 1)
            If $iCmds <> -1 Then Return 0
        EndIf
    Next
    
    Return 1
EndFunc
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
duglas24h
{TopicSolvedInfo}
 
Верх