Перейти к содержанию

После перезапуска процесса в трее остается висеть старая "фантомная" иконка. [Решено]


Рекомендуемые сообщения

После прерывания процесса программы батником, в трее (в области уведомлений) остается висеть "фантомная" иконка.

Можно ли перезапустить только панель задач - системный лоток или требуется кардинальный способ, перезагрузка проводника: taskkill /f /im explorer.exe && explorer.exe чтобы убрать значок программы?

Как это можно сделать незаметно. Читал, что можно с эмулировать проведение стрелкой мышки по данной области. Но как это сделать?

Вот нарыл код, как из него сделать исполнительный файл?


Wnd dd ?
uID dd ?
EXTRADATA ends
.data?
IconsCount dd ?
hProcess dd ?
hTaskbar dd ?
hToolbar dd ?
pData dd ?
ProcessId dd ?
button TBBUTTON <>
extra EXTRADATA <>
.code
start:
push 'd'
push 'nWya'
push 'rT_l'
push 'lehS'
mov ecx,esp
push NULL
push ecx
call FindWindow
pop ecx
pop ecx
pop ecx
pop ecx
mov hTaskbar,eax
push GW_CHILD
push eax
call GetWindow
push GW_HWNDNEXT
push eax
call GetWindow
push GW_CHILD
push eax
call GetWindow
push GW_HWNDNEXT
push eax
call GetWindow
push GW_CHILD
push eax
call GetWindow
mov hToolbar,eax
push 0
push 0
push TB_BUTTONCOUNT
push eax
call SendMessage
test eax,eax
jz @e
mov IconsCount,eax
push offset ProcessId
push hToolbar
call GetWindowThreadProcessId
push ProcessId
push FALSE
push PROCESS_ALL_ACCESS
call OpenProcess
mov hProcess,eax
push PAGE_READWRITE
push MEM_COMMIT
push sizeof button
push NULL
push eax
call VirtualAllocEx
mov pData,eax
@l: dec IconsCount
push pData
push IconsCount
push TB_GETBUTTON
push hToolbar
call SendMessage
push NULL
push sizeof button
push offset button
push pData
push hProcess
call ReadProcessMemory
push NULL
push sizeof extra
push offset extra
push button.dwData
push hProcess
call ReadProcessMemory
mov eax,extra.uID
test eax,80000000h
jnz @f
push extra.Wnd
call IsWindow
test eax,eax
jnz @f
push 0
push IconsCount
push TB_DELETEBUTTON
push hToolbar
call SendMessage
push 0
push 0
push WM_SETTINGCHANGE
push hTaskbar
call SendMessage
@@: cmp IconsCount,0
ja @l
push MEM_RELEASE
push 0
push pData
push hProcess
call VirtualFreeEx
push hProcess
call CloseHandle
@e: push NULL
call ExitProcess
end start
EXTRADATA struct

http://www.wasm.ru/forum/viewtopic.php?pid=454132#p454132

Ссылка на комментарий

Можно с помощью AutoIt.

В архиве скомпиленное приложение, которое рефрешит трей + батник.

@echo off
taskkill /f /im App.exe
echo Refreshing System Tray
start /wait _RefreshSystemTray.exe

Ссылка на комментарий

D_Master

Вот возник вопрос с добавлением задания в планировщик заданий.

1. Добавил задание с помощью командного файла:


schtasks /delete /tn "AM" /f
schtasks /create /sc DAILY /mo 1 /st 00:00:00 /tn "AM" /tr "\"%~dp0AM.bat"\" /ru system
@echo off

Все отлично добавилось и путь к батнику: C:\Program Files (x86)\AM\AM.bat

2. Содержимое батника:


taskkill /f /im 123.exe
echo Refreshing System Tray
start /wait _RefreshSystemTray.exe
@echo off

Получается, что задание отлично добавляется и запускается как запланировано, но процесс почему-то весит. Как будто бы программу что-то блокирует или не хватает прав. Пробовал отключать KIS2012, но результат тот же.

Если папку с файлом расположить не в C:\Program Files (x86), то программа выполняется успешно.

Может в коде можно что-то изменить?

ОС: W7 x64

Спасибо за ответ.

Ссылка на комментарий
  • 2 месяца спустя...

1. Для того чтобы выгрузить программу из трея и при этом убрать фантомную иконку, можно так же использовать исполняемый файл nircmd.exe.

Напр.:

@echo off
nircmd.exe closeprocess 123.exe
nircmd.exe waitprocess 123.exe
Exit

При перезапуске программы старая иконка не остается.

2. Что касается вопроса связанного с добавлением задания в планировщик заданий.

http://ulanovka.ru/forum/viewtopic.php?p=3316015#3316015

Решение:

Скомпилировать батник в exe с помощью напр. Bat To Exe Converter.

Было так:


schtasks /delete /tn "AM" /f
schtasks /create /sc DAILY /mo 1 /st 00:00:00 /tn "AM" /tr "\"%~dp0AM[b].bat[/b]"\" /ru system
exit
@echo off

Чтобы все запускалось, нужно так:


schtasks /delete /tn "AM" /f
schtasks /create /sc DAILY /mo 1 /st 00:00:00 /tn "AM" /tr "\"%~dp0AM[b].exe[/b]"\" /ru system
exit
@echo off

Ссылка на комментарий

Пожалуйста, войдите, чтобы комментировать

Вы сможете оставить комментарий после входа в



Войти
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...