
@echo off
taskkill /F /T /IM speedfan.exe
start "" "C:\Program Files (x86)\SpeedFan\speedfan.exe"
cls
exit
Я использую приведенные выше команды в .bat-файле для автоматического перезапуска SpeedFan каждый раз после выхода компьютера из спящего режима.
Однако старый значок SpeedFan в системном трее не исчезает автоматически при появлении нового. Мне приходится вручную перемещать курсор на старый значок, чтобы он исчез. Как сделать так, чтобы он исчезал автоматически?
Я только что нашел простое решение: скачайте NoTrayOrphans.exe с сайтаhttp://www.autohotkey.net/~Nazzal/Other/NoTrayOrphans.exe
Я благодарю всех вас за вашу помощь!
решение1
У меня была точно такая же проблема, и я исправил ее простым изменением bat-файла и без необходимости установки каких-либо других программ.
Проблема в том, что вы запускаете taskkill с /f, что принудительно (жестко) убивает задачу. Если вы убиваете ее без /f, она отправляет сигнал закрытия приложению, приложение завершается корректно и удаляет свой значок в системном трее.
В своем bat-файле я делаю две команды taskkill: первую без /f, а затем снова с /f. Если первая срабатывает (а обычно так и должно быть), то все хорошо, и значок в системном трее исчезает. Если по какой-то причине первая не срабатывает, вторая все равно убьет его, хотя в этом случае значок в системном трее не будет удален.
Итак, в вашем случае используйте:
taskkill /T /IM speedfan.exe
taskkill /F /T /IM speedfan.exe
решение2
Теперь правильный ответ.
Просто используйте простой скрипт AutoIt вместо taskkill /F /IM
:
WinClose("SpeedFan")
Вам просто нужно убедиться, что в настройках SpeedFan (вкладка «Параметры») отключена функция «Сворачивать при закрытии».
Извините, если это некорректный ответ, и я не могу подкрепить его личным опытом, но вы вообще пытались найти решение?
Мой общий подход будет заключаться в том, чтобы сделатьвиртуальные движения мышиили использовать некоторыеВызовы Windows-APIчтобы заставить окнаобновить область уведомлений.
Я никогда ничего подобного не делал, но после нескольких поисков я пришел к такой строке поиска Google:windows refresh icons "system tray" OR "notification area" autohotkey OR autoit
Один неплохой результат:AHK - значки-системного-трея-необходимо-обновить
Еще один: autohotkey.com/board/topic/80624-notrayorphans/
(ссылка в теме выше)
Другие результаты (без autohotkey OR autoit
):
- обновление-области-уведомлений-системного-трея
forum.lazarus.freepascal.org/index.php?topic=14847.0
blog.stephenklancher.com/2013/08/refreshing-the-notification-area-system-tray/
(сисполняемый- но, похоже, это не работает на Windows 8.1 с классической оболочкой)
EстьВозможный дубликатна SO (помню, что видел еще, но не могу найти):
stackoverflow.com/questions/74723/can-you-send-a-signal-to-windows-explorer-to-make-it-refresh-the-systray-icons
К сожалению, я не могу публиковать больше прямых ссылок, и я бы предпочел написать комментарий вместо этого «ответа»...
решение3
Поместите приведенный ниже код в пакетный файл, чтобы обновить системный трей. нашел источник по этой ссылке, который работает хорошо(код вставлен ниже по ссылке)
@echo off
reg export "HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" %userprofile%\desktop\traynotify.reg /y
reg delete "HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v IconStreams /f
reg delete "HKCU\Software\Classes\Local Settings\Software\Microsoft\Windows\CurrentVersion\TrayNotify" /v PastIconsStream /f
taskkill /f /im explorer.exe
start explorer.exe
exit
решение4
Следующая партия переместит средство исправления на значки, а значки программ, которые были завершены, будут удалены:
Посмотри наhttps://www.nirsoft.net/utils/nircmd.htmlдля бесплатных функций.
SET "_NirCmd=D:\_NirSoft\nircmd-x64\nircmd.exe"
:: For the Taskbar on the bottom scan left -> right<br/>
%_NirCmd% SETCURSOR 1445, 1060<br/>
FOR /L %%C in (1,1,20) DO %_NirCmd% MOVECURSOR 20, 0<br/>
%_NirCmd% SETCURSOR 1445, 1060 <=== Just to move out of the way
:: For the Taskbar on the right scan two columns top -> down
%_NirCmd% SETCURSOR 1895, 800<br/>
FOR /L %%C in (1,1,20) DO %_NirCmd% MOVECURSOR 0, 10<br/>
%_NirCmd% SETCURSOR 1870, 800<br/>
FOR /L %%C in (1,1,20) DO %_NirCmd% MOVECURSOR 0, 10<br/>
%_NirCmd% SETCURSOR 1895, 800 <=== Just to move out of the way