Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Управление пунктами Диспетчера задач - taskmgr (перезагрузка) (http://forum.oszone.net/showthread.php?t=130338)

semiono 29-01-2009 20:56 1023845

Управление пунктами Диспетчера задач - taskmgr (перезагрузка)
 
Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>

Run("taskmgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")

If Not WinExists($hTskMgr) Then Exit

$hMenu = _GUICtrlMenu_GetMenu($hTskMgr)
$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, -1) ;change to 3th submenu (zero-based), now it will only show the "About" window.
$iItemID = _GUICtrlMenu_GetItemID($hSubMenu, 3) ;2 = Shutdown, 3 = Restart (2 and 3 it's zero-based item from the top of menu)

_SendMessage($hTskMgr, $WM_COMMAND, $iItemID, 0)

не работает! :(

Кстати, я заметил taskmgr.exe изменяет пункты меню взависимости от активных табов

Постоянными являются File|Options|View| далее если активный первый таб Applications то следуют Windows|Shut Down|Help
Ежели активный таб Processes второй по счёту или любой другой за ним, то пункт Windows в этой последовательности отсутствует!

Список Shut Down таков: Stand By|Hibernate|Turn Off|Restart|Log Off Semiono|Lock Computer Win Key+L

Я вот думаю может там специально секьюрность встроенна и автоитом не возможно перезагрузить комп?
Хочу напомнить, что shutdown() у меня не работает, проблемма такая. Только работает через графич. кнопки...

... я менял номера в скрипте, хотя методом тыка, вроде не получается!

266903582 29-01-2009 23:27 1023961

semiono, а если так:
Код:

Run(@ComSpec & " /c " & 'shutdown -r -t 0 -f', "", @SW_HIDE)

semiono 30-01-2009 00:25 1024003

Нет! Я же говорю, утилита shutdown.exe тоже вешает машину, из-за одного упрямого процесса звуковой карты, который ничем не свалить! Перезагружается только через кнопки пуск или taskmgr.
Кстати, что такое " /c " , я так же знаю есть ещё cmd.exe /k но в чём их разница?
И ещё, shutdown -r -t 0 -f не совсем правильно, надо писать так -t 00 потомучто в некоторых особых случаях это может не сработать,
но я не помню уж в каких...

Котяра 30-01-2009 00:32 1024009

Цитата:

Цитата semiono
Кстати, что такое " /c " , я так же знаю есть ещё cmd.exe /k но в чём их разница »

Параметр /c закрывает cmd.exe после запуска команды.

Creat0R 31-01-2009 14:14 1025331

Цитата:

Цитата semiono
Кстати, я заметил taskmgr.exe изменяет пункты меню взависимости от активных табов »

Точно!
Тогда так:

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>
#include <GuiMenu.au3>

Run("taskmgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)
$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")
If Not WinExists($hTskMgr) Then Exit 1

$nCurrentTab = ControlCommand($hTskMgr, "", "SysTabControl321", "CurrentTab")

$nSubMenu_Item = 3
If $nCurrentTab = 1 Then $nSubMenu_Item += 1

$hMenu = _GUICtrlMenu_GetMenu($hTskMgr)

;Theese two is to activate the menu, strange bug, but GetItemSubMenu fails if the menu was not used (clicked)
ControlSend($hTskMgr, "", $hMenu, "!_")
ControlClick($hTskMgr, "", "SysTabControl321")

$hSubMenu = _GUICtrlMenu_GetItemSubMenu($hMenu, $nSubMenu_Item)

;2 = Shutdown, 3 = Restart (2 and 3 it's zero-based item from the top of menu)
$iItemID = _GUICtrlMenu_GetItemID($hSubMenu, 3)

ConsoleWrite(_GUICtrlMenu_GetItemText($hSubMenu, $iItemID, 0))

;_SendMessage($hTskMgr, $WM_COMMAND, $iItemID, 0)

Если в консоли выводится нужный текст, то просто удали строчку с ConsoleWrite и раскомментируй последнюю строчку.

semiono 31-01-2009 16:34 1025443

не работает :)
я даже explorer.exe установил на место думал может в нём причина, но толку не было

SysTabControl321 это опечатка наверное? может так SysTabControl32 ?


может тут что прояснится?

Creat0R 31-01-2009 23:22 1025798

semiono,
Цитата:

SysTabControl321 это опечатка наверное?
Нет, это так и должно быть.

Цитата:

может тут что прояснится?
Раньше надо было это показывать. Там ведь явно показан ID элемента (4005 для «&Restart»):

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>

Run("taskmgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)

$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")
If Not WinExists($hTskMgr) Then Exit 1

_SendMessage($hTskMgr, $WM_COMMAND, 4005, 0)


semiono 01-02-2009 00:59 1025867

ааабалдеть! :)
кажись перезагружает! после того как я надеяться уже перестал.
Цитата:

Цитата Creat0R
Раньше надо было это показывать. »

значится Info Tool не всё видит? хотя мне и там это не очень очевидно было :)

Ещё такое дело, у меня система иногда плохо перезагружается, как бы со второго только нажатия.
Вот сейчас работу скрипта прервал и смог остановить рестарт. Потому-что всё как бы закрылось,
но диспечер завис немного. У меня так часто бывает, когда инсталлеры или ещё что либо без юзера
пытаются запустить рестарт... Вообщем, я теперь думаю как бы усилить этот скрипт?
Наверное подойдёт даже двукратное нажатие Shut Down, потому как я всегда так и делаю
вручную. Но зато taskmgr обязательно перезагрузит в отличае от shutdown.exe с которым
у меня траблы.

Попробую зделать какойнибудь loop из нажатий на меню если ума хватит код осилить :)

~
имхо - работает!
просто делаем серию комманд, хотябы три или две
Код:

_SendMessage($hTskMgr, $WM_COMMAND, 4005, 0)
_SendMessage($hTskMgr, $WM_COMMAND, 4005, 0)
_SendMessage($hTskMgr, $WM_COMMAND, 4005, 0)

хотя цикл организовать было бы красивее?

Creat0R 01-02-2009 03:16 1025931

Цитата:

Цитата semiono
просто делаем серию комманд, хотябы три или две »

Зачем? Может так?

Код:

#include <WindowsConstants.au3>
#include <SendMessage.au3>

Run("taskmgr.exe")

WinWait("[CLASS:#32770;REGEXPTITLE:.*Windows.*]", "", 5)

$hTskMgr = WinGetHandle("[CLASS:#32770;REGEXPTITLE:.*Windows.*]")
If Not WinExists($hTskMgr) Then Exit 1

ControlSend($hTskMgr, "", "", "!_")
ControlClick($hTskMgr, "", "SysTabControl321")

_SendMessage($hTskMgr, $WM_COMMAND, 4005, 0)


semiono 01-02-2009 14:26 1026163

Ну вот, теперь не работает. Всмысле всё "падает", а диспетчер ждёт ещё одно "китайское предупреждение".
Причём я не вижу где здесь цикл? Одним кликом не срубишь! Мой код получше-то будет ;-
:)

или это '!_' повтор значит? но не сработало, может он в случае успешного одного клика перестаёт далее жать?

Creat0R 01-02-2009 18:07 1026387

Цитата:

Цитата semiono
не вижу где здесь цикл? »

Я и ни писал что там есть цикл ;)

Цитата:

Цитата semiono
Одним кликом не срубишь »

Имхо, пора систему переустанавливать, раз такие проблемы.

Цитата:

Цитата semiono
или это '!_' повтор значит? »

Читаем в справке "что это значит". Я там кстати в первом примере (где я приминил подобный метод) оставил комментарии перед этими строчками, если по русский, то это просто для активации меню, аля клик по меню. С первого раза получить идентификатор меню не получалось подругому.


Время: 19:43.

Время: 19:43.
© OSzone.net 2001-