Что нового

Как убрать "Диспетчер очереди печати" (spoolsv.exe) из трея?

kuzyaka

Новичок
Сообщения
3
Репутация
0
Суть такова.
Периодически забивается очередь печати, не дающая возможность печатать что либо дальше.
Единственный способ - перезапустить службу "Диспетчер очереди печати" с очисткой файлов из очереди печати.

Вот скрипт:
Код:
#NoTrayIcon
#RequireAdmin
#Region ;**** Directives created by AutoIt3Wrapper_GUI ****
#AutoIt3Wrapper_icon=printer.ico
#EndRegion ;**** Directives created by AutoIt3Wrapper_GUI ****

;============================================ Check of running copy ============================================
If WinExists(@ScriptName) Then Exit
AutoItWinSetTitle(@ScriptName)

$objShellApp = ObjCreate("Shell.Application")
$Service = "Spooler"
$dir = @SystemDir & "\spool\PRINTERS\"

If FileFindFirstFile($dir & "*.*") = -1 Then
    MsgBox(48, "Очистка очереди печати.", "В очереди печати нет ни одного задания!" & @CRLF & "Можете продолжать печать!")
    Exit
EndIf

If MsgBox(32+4, "Очистка очереди печати.", "Вы действительно хотите очистить очередь печати?") = 7 Then Exit

If $objShellApp.IsServiceRunning($Service) Then
	If $objShellApp.ServiceStop($Service, false) = 0 Then
		MsgBox(16, "Очистка очереди печати.","Ошибка " & @error & " при остановке сервиса")
		Exit
	EndIf
EndIf

Sleep(500)

If FileDelete($dir & "*.*") = 0 Then
	MsgBox(16, "Очистка очереди печати.","Ошибка при удалении файлов из очереди печати!" & @CRLF & "Попробуйте еще раз!")
	If $objShellApp.ServiceStart($Service, false) = 0 Then
		MsgBox(16, "Очистка очереди печати.","Ошибка " & @error & " при запуске сервиса")
	Else
		If $objShellApp.IsServiceRunning($Service) = False Then
			MsgBox(16, "Очистка очереди печати.","Ошибка " & @error & " при запуске сервиса")
		EndIf
	EndIf
	Exit
EndIf

If $objShellApp.ServiceStart($Service, false) = 0 Then
		MsgBox(16, "Очистка очереди печати.","Ошибка " & @error & " при запуске сервиса")
Else
	If $objShellApp.IsServiceRunning($Service) = False Then
		MsgBox(16, "Очистка очереди печати.","Ошибка " & @error & " при запуске сервиса")
	EndIf
	MsgBox(48, "Очистка очереди печати.","Очередь печати успешно очищена" & @CRLF & "Можете продолжить печать!")
EndIf

Но, после всего этого, в трее продолжает висеть значок "Диспетчера очереди печати" и сам он оттуда уже не убирается, даже если продолжаешь печатать.
Единственный способ (при пустой очереди печати) - это в его контекстном меню выбрать пункт "Обновить ...", тогда он исчезает.

Вот даже нашел скрипт как открыть контекстное меню:
Код:
#NoTrayIcon
#include <SysTray_UDF.au3>
;

$Pid = ProcessExists("spoolsv.exe")

If Not $Pid Then
    MsgBox(16, "Error", "This process not exists")
    Exit
EndIf

$Index = _SysTrayIconIndex($Pid)

If @error Then
    MsgBox(16, "Error", "This process not have tray icon")
    Exit
EndIf

_SysTrayIconClick($Index, "Right")

If @error Then
    MsgBox(16, "Error", "There was an error to click on the icon")
    Exit
EndIf

Func _SysTrayIconClick($iIndex, $sButton="Main")
    Local $TrayIcon_Pos = _SysTrayIconPos($iIndex)
    If Not IsArray($TrayIcon_Pos) Then Return SetError(1, 0, 0)

    Local $Old_Mouse_Pos = MouseGetPos()
    MouseClick($sButton, $TrayIcon_Pos[0], $TrayIcon_Pos[1], 1, 0)
    MouseMove($Old_Mouse_Pos[0], $Old_Mouse_Pos[1], 0)
EndFunc

А вот как выбрать пункт меню "Обновить ..." пока не знаю.
Пытался с помощью ResHacker-а узнать ID контекстного меню, но в файле spoolsv.exe меню не оказалось.
Может иконку из трея можно убрать как то и иначе, не знаю, пока нашел только способ с "Обновить ..." - в общем надо как то её убрать из трея.

Так, что я пока в очень сильном затруднении как поступить дальше.
 

r35p3ct

Продвинутый
Сообщения
228
Репутация
60
Так не щелкается?
Соотв. класс меню у тебя может быть другим...
 
Автор
K

kuzyaka

Новичок
Сообщения
3
Репутация
0
r35p3ct сказал(а):
Так не щелкается?
Соотв. класс меню у тебя может быть другим...

Спасибо, твой метод в купе с моими вполне работает, только пункт меню на "2" надо исправить.

А вот ЗДЕСЬ предложено аналогичное, но более полное решение.
 
Верх