Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как убрать "Диспетчер очереди печати" (spoolsv.exe) из трея?

Ответить
Настройки темы
[решено] Как убрать "Диспетчер очереди печати" (spoolsv.exe) из трея?

Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


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

Вот скрипт:
Код: Выделить весь код
#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 меню не оказалось.
Может иконку из трея можно убрать как то и иначе, не знаю, пока нашел только способ с "Обновить ..." - в общем надо как то её убрать из трея.

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

Отправлено: 20:54, 14-03-2010

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата kuzyaka:
как выбрать пункт меню "Обновить ..." »
Код: Выделить весь код
#include <GuiToolBar.au3>
#include <GuiMenu.au3>
#include <WindowsConstants.au3>

$sToolTipTitle = "Отложено документов:"
$hSysTray_Handle = ControlGetHandle("[Class:Shell_TrayWnd]", "", "[Class:ToolbarWindow32;Instance:1]")
If @error Then Exit MsgBox(16, "Error", "System tray not found")

$iSystray_ButCount = _GUICtrlToolbar_ButtonCount($hSysTray_Handle)
If $iSystray_ButCount = 0 Then Exit MsgBox(16, "Error", "No items found in system tray")

For $iSystray_ButtonNumber = 1 To $iSystray_ButCount
    If StringInStr(_GUICtrlToolbar_GetButtonText($hSysTray_Handle, $iSystray_ButtonNumber), $sToolTipTitle) Then ExitLoop
Next

If $iSystray_ButtonNumber = $iSystray_ButCount+1 Then Exit  MsgBox(16, "Error", "Item Not Found")
_GUICtrlToolbar_ClickButton($hSysTray_Handle, $iSystray_ButtonNumber, "right", True, 1, 0)

WinWait("[CLASS:#32768]")
$hWndTray  = WinGetHandle("[CLASS:#32768]")
$hMenu = _SendMessage($hWndTray, $MN_GETHMENU, 0, 0)
$aRect = _GUICtrlMenu_GetItemRect($hWndTray, $hMenu, 2)
MouseClick("left", $aRect[0]+5, $aRect[1]+5, 1, 1)
Это сообщение посчитали полезным следующие участники:

Отправлено: 05:09, 15-03-2010 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Новый участник


Сообщения: 3
Благодарности: 0

Профиль | Отправить PM | Цитировать


amel27
Благодарю - все прекрасно работает.

Отправлено: 14:48, 15-03-2010 | #3


Старожил


Сообщения: 413
Благодарности: 161

Профиль | Отправить PM | Цитировать


amel27 с вашей подсказки перелопатил скрипт для закрытия AdMunch.exe
Код: Выделить весь код
#include <GuiToolBar.au3>
#include <GuiMenu.au3>
#include <WindowsConstants.au3>

;$sToolTipTitle = "Отложено документов:"
$sToolTipTitle = "Ad Muncher v4.8 Build 31318/2796"
$hSysTray_Handle = ControlGetHandle("[Class:Shell_TrayWnd]", "", "[Class:ToolbarWindow32;Instance:1]")
If @error Then Exit ;MsgBox(16, "Error", "System tray not found")

$iSystray_ButCount = _GUICtrlToolbar_ButtonCount($hSysTray_Handle)
If $iSystray_ButCount = 0 Then Exit ;MsgBox(16, "Error", "No items found in system tray")

For $iSystray_ButtonNumber = 1 To $iSystray_ButCount
    If StringInStr(_GUICtrlToolbar_GetButtonText($hSysTray_Handle, $iSystray_ButtonNumber), $sToolTipTitle) Then ExitLoop
Next

If $iSystray_ButtonNumber = $iSystray_ButCount+1 Then Exit  ;MsgBox(16, "Error", "Item Not Found")
_GUICtrlToolbar_ClickButton($hSysTray_Handle, $iSystray_ButtonNumber, "right", True, 1, 0)

WinWait("[CLASS:#32768]")
$hWndTray  = WinGetHandle("[CLASS:#32768]")
$hMenu = _SendMessage($hWndTray, $MN_GETHMENU, 0, 0)
;$aRect = _GUICtrlMenu_GetItemRect($hWndTray, $hMenu, 2)
$aRect = _GUICtrlMenu_GetItemRect($hWndTray, $hMenu, 11)
MouseClick("left", $aRect[0]+170, $aRect[1]+5, 1, 0)
но - тоже не всегда срабатывает (если водиш мышкой)
Цитата:
используй BlockInput() на время работы этого куска кода
а куда вставить ?

Отправлено: 19:57, 10-06-2010 | #4


Аватара для madmasles

Ветеран


Сообщения: 812
Благодарности: 353

Профиль | Отправить PM | Цитировать


mamont1,
У меня Ad Muncher так закрывается:
Код: Выделить весь код
#include <SysTray_UDF.au3>

$Pid = ProcessExists("AdMunch.exe")
If Not $Pid Then Exit
BlockInput(1)
Local $Old_Mouse_Pos = MouseGetPos()
MouseMove(@DesktopWidth / 2, @DesktopHeight, 0)
Sleep(50)
$Index = _SysTrayIconIndex($Pid)
If @error Then Exit
_SysTrayIconClick($Index, "Right")
MouseMove($Old_Mouse_Pos[0], $Old_Mouse_Pos[1], 0)
BlockInput(0)
Func _SysTrayIconClick($iIndex, $sButton = "Main")
    Local $TrayIcon_Pos = _SysTrayIconPos($iIndex)
    If Not IsArray($TrayIcon_Pos) Then Return SetError(1, 0, 0)
    MouseClick($sButton, $TrayIcon_Pos[0], $TrayIcon_Pos[1], 1, 0)
    MouseClick("left", $TrayIcon_Pos[0] - 15, $TrayIcon_Pos[1] - 15, 1, 0)
EndFunc   ;==>_SysTrayIconClick
SysTray_UDF.au3

А так, ИМХО, проще всего:
Код: Выделить весь код
If ProcessExists("AdMunch.exe") Then ProcessClose("AdMunch.exe")

Последний раз редактировалось madmasles, 10-06-2010 в 22:22.


Отправлено: 21:45, 10-06-2010 | #5


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


Цитата mamont1:
но - тоже не всегда срабатывает (если водиш мышкой)
Цитата:
используй BlockInput() на время работы этого куска кода
а куда вставить ? »
BlockInput(1) - в начале,
BlockInput(0) - в конце скрипта

Отправлено: 05:19, 11-06-2010 | #6


Старожил


Сообщения: 413
Благодарности: 161

Профиль | Отправить PM | Цитировать


madmasles у меня ваш вариант старый тоже работал, но не всегда.
А вариант который ваше с
Цитата amel27:
BlockInput(1) - в начале,
BlockInput(0) - в конце скрипта »
работает (шевелил мышку - бодро). Спасибо.

amel27 Спасибо.

читать дальше »
Какой редактор используете для встави кода? Или ... ?

Отправлено: 12:17, 11-06-2010 | #7



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » AutoIt » [решено] Как убрать "Диспетчер очереди печати" (spoolsv.exe) из трея?

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Службы - Останавливается служба диспетчер очереди печати Alien2 Microsoft Windows 2000/XP 68 29-01-2019 19:39
Отключается служба "Диспетчер очереди печати" на сервере Microsoft Windows 2003 R2 sashaverx Microsoft Windows NT/2000/2003 1 29-01-2010 09:28
Службы - [решено] Пропал диспетчер очереди печати NDK Microsoft Windows 2000/XP 1 19-08-2009 15:08
Альтернатива сервиса "Очереди Печати" в Win2003 Server philippov Microsoft Windows NT/2000/2003 8 11-09-2008 07:46
как восстановить диспетчер очереди печати nataliia Microsoft Windows 2000/XP 3 21-03-2006 07:22




 
Переход