Пропадают значки в трее? Тогда мы идём к вам!
То немногое, почему мне нравится Window XP по сравнению с Win2k – это возможность скрывать ненужные иконки в трее. ![]()
Мне мнавится, что я всегда могу убедиться, что запущен антивирус и файервол, что работает сеть и я нахожусь на 5-м десктопе. И в то же время не обращать внимания на значок громкости и необходимых программ из автозапуска. Всё это можно настроить нажав правой кнопкой на стрелочке, которая открывает скрытые значки (или на часах) и выбрав "Настройка уведомлений".
Но как же меня начало бесить, когда, установив "Всегда отображать" на значок Kaspersky 8.0 (2009) - через некоторое время эта настройка сбрасывалась в "Скрывать, если не активны" и значок опять исчезал. Я попробовал использовать Kaspersky 2010 - да, там такой проблемы нет, зато он больше тормозит систему, при установке стирает файл ключей Webmoney из секретного сектора диска (а они ещё рекламируют его :)) и иногда вызывает ошибку "Память не может быть writen", когда внедряется в чужие программы.
Что ж, хорошо, что я знаю такую замечательную утилиту, как AutoHotKey (см. предыдущую запись).
Сохраните следующий скрипт с расширением .ahk и поместите в папку Автозагрузки (shell:startup):
#NoTrayIcon
#Persistent
DetectHiddenWindows, On
SetTimer, ReShowIcons, 5000 ; 5 seconds timer
return
ReShowIcons:
RegExMatch(TrayIcons("avp.exe"), "(?<=idn: )\d+", idn), HideTrayIcon(idn, bHide:=0)
; добавьте здесь такие же строки для других (не avp.exe) приложений из трея...
return
Это не всё! Под катомчто это? продолжение файла (тела функций).
;---------------------------------------------------------------;
TrayIcons(sExeName = "")
{
WinGet, pidTaskbar, PID, ahk_class Shell_TrayWnd
hProc:= DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
pProc:= DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
idxTB:= GetTrayBar()
SendMessage, 0x418, 0, 0, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_BUTTONCOUNT
Loop, %ErrorLevel%
{
SendMessage, 0x417, A_Index-1, pProc, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_GETBUTTON
VarSetCapacity(btn,32,0), VarSetCapacity(nfo,32,0)
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", &btn, "Uint", 32, "Uint", 0)
iBitmap := NumGet(btn, 0)
idn := NumGet(btn, 4)
Statyle := NumGet(btn, 8)
If dwData := NumGet(btn,12)
iString := NumGet(btn,16)
Else dwData := NumGet(btn,16,"int64"), iString:=NumGet(btn,24,"int64")
DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", &nfo, "Uint", 32, "Uint", 0)
If NumGet(btn,12)
hWnd := NumGet(nfo, 0)
, uID := NumGet(nfo, 4)
, nMsg := NumGet(nfo, 8)
, hIcon := NumGet(nfo,20)
Else hWnd := NumGet(nfo, 0,"int64"), uID:=NumGet(nfo, 8), nMsg:=NumGet(nfo,12)
WinGet, pid, PID, ahk_id %hWnd%
WinGet, sProcess, ProcessName, ahk_id %hWnd%
WinGetClass, sClass, ahk_id %hWnd%
If !sExeName || (sExeName = sProcess) || (sExeName = pid)
VarSetCapacity(sTooltip,128), VarSetCapacity(wTooltip,128*2)
, DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", &wTooltip, "Uint", 128*2, "Uint", 0)
, DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
, sTrayIcons .= "idx: " . A_Index-1 . " | idn: " . idn . " | Pid: " . pid . " | uID: " . uID . " | MessageID: " . nMsg . " | hWnd: " . hWnd . " | Class: " . sClass . " | Process: " . sProcess . "`n" . " | Tooltip: " . sTooltip . "`n"
}
DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
DllCall("CloseHandle", "Uint", hProc)
Return sTrayIcons
}
RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2)
{
NumPut(VarSetCapacity(ni,444,0), ni)
NumPut(hWnd , ni, 4)
NumPut(uID , ni, 8)
NumPut(1|2|4, ni,12)
NumPut(nMsg , ni,16)
NumPut(hIcon, ni,20)
Return DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", &ni)
}
HideTrayIcon(idn, bHide = True)
{
idxTB := GetTrayBar()
SendMessage, 0x404, idn, bHide, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_HIDEBUTTON
SendMessage, 0x1A, 0, 0, , ahk_class Shell_TrayWnd
}
DeleteTrayIcon(idx)
{
idxTB := GetTrayBar()
SendMessage, 0x416, idx - 1, 0, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_DELETEBUTTON
SendMessage, 0x1A, 0, 0, , ahk_class Shell_TrayWnd
}
MoveTrayIcon(idxOld, idxNew)
{
idxTB := GetTrayBar()
SendMessage, 0x452, idxOld - 1, idxNew - 1, ToolbarWindow32%idxTB%, ahk_class Shell_TrayWnd ; TB_MOVEBUTTON
}
GetTrayBar()
{
ControlGet, hParent, hWnd,, TrayNotifyWnd1 , ahk_class Shell_TrayWnd
ControlGet, hChild , hWnd,, ToolbarWindow321, ahk_id %hParent%
Loop
{
ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
If Not hWnd
Break
Else If hWnd = %hChild%
{
idxTB := A_Index
Break
}
}
Return idxTB
}
--------------------------------------
Наконец-то я разобрался как добиться перенса текста внутри блоков <pre>. Т.к. css свойство width здесь не помощник (в <pre> перенос только после конца строки: \r\n) придётся немного извратится.

ноября 6, 2009 в 01:16
Респект чуви!спасибо за совет, у меня этих иконок там мам дорогая совет как раз кстате, ещё раз спс.
ноября 7, 2009 в 04:31
очень полезная информация. Спасибо за помощь. Ошибку одну исправил этим методом.