Тема: AHK: Корректно закрыть explorer.exe
Доброго! После убийства типа "Process, Close, explorer.exe" он автоматически перезапускается. Вопрос: как его "нормально" закрыть?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Доброго! После убийства типа "Process, Close, explorer.exe" он автоматически перезапускается. Вопрос: как его "нормально" закрыть?
http://www.forum.script-coding.com/view … hp?id=3887
Но вообще-то процесс не должен запускаться заново.
Это я читал. Работает. Можно ли такое реализовать средствами AHK (только конечно не с помощью эмуляции мыши)?
Но вообще-то процесс не должен запускаться заново.
OFF: У меня на Windows XP SP3 по команде, приведённой в первом посте темы — перезапускается . В случае «снятия» процесса «ручками», например, через «Process Explorer» — Проводник не перезапускается.
Sasha-box, Вам обязательно AHK?
Пока не разбирался в деталях, но наблюдаю такое поведение: когда explorer.exe завершается с «Reason»==«0» — головная служба пользовательской сессии WinLogon вновь запускает Проводник. Если завершить «explorer.exe» с «Reason»==«1» (так, кстати, поступает и «Process Explorer») — Проводник не перезапускается. То есть, следующий скрипт завершит Проводник, а WinLogon его вновь запустит:
Option Explicit
Dim objSWbemServicesEx
Dim collSWbemObjectSet
Dim objSWbemObjectEx
Set objSWbemServicesEx = GetObject("winmgmts:{impersonationLevel=impersonate}!\\.\root\cimv2")
Set collSWbemObjectSet = objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_Process", "WQL", 0)
If collSWbemObjectSet.Count > 0 Then
For Each objSWbemObjectEx In collSWbemObjectSet
'WScript.Echo objSWbemObjectEx.Caption
If objSWbemObjectEx.Caption = "explorer.exe" Then
objSWbemObjectEx.Terminate 0
End If
Next
End If
Set collSWbemObjectSet = Nothing
Set objSWbemServicesEx = Nothing
WScript.Quit 0
Стоит поменять в:
objSWbemObjectEx.Terminate 0
«0» на единицу — получаем требуемое поведение — Проводник не перезапускается при завершении процесса «explorer.exe».
Как я понимаю, чтобы добиться такого же поведения в AHK — надо работать непосредственно с WinAPI.
На AHK можно так:
!1::Run, taskkill /f /im explorer.exe,, hide
!2::Run, explorer
Alt + 1 — принудительное завершение explorer.exe
Alt + 2 — перезапуск
teadrinker, а как насчёт:
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
Так нужно ещё hProcess узнать!
teadrinker, а как насчёт:
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
Process, Exist, Explorer.exe
PID := ErrorLevel
h_process := DllCall("OpenProcess", UInt, 0x1, Int, 0, UInt, PID) ; PROCESS_TERMINATE = 0x1
DllCall("TerminateProcess", UInt, h_process, UInt, 0)
DllCall("CloseHandle", h_process)
Попробовал так — перезапускается.
Нормально. Меняем «0» на «1»:
Process, Exist, Explorer.exe
PID := ErrorLevel
h_process := DllCall("OpenProcess", UInt, 0x1, Int, 0, UInt, PID) ; PROCESS_TERMINATE = 0x1
DllCall("TerminateProcess", UInt, h_process, UInt, 1)
DllCall("CloseHandle", h_process)
работает без перезапуска.
Точно!
Спасибо! Добавил в Коллекцию: AHK: Завершение процесса explorer.exe (без перезапуска Проводника).
Автор идеи — teadrinker.
Ну, тут Вы поскромничали!
Большое спасибо за помощь!!!
Ошибочка закралась (UInt в последней строчке), исправьте в Коллекции:
Process, Exist, Explorer.exe
PID := ErrorLevel
h_process := DllCall("OpenProcess", UInt, 0x1, Int, 0, UInt, PID) ; PROCESS_TERMINATE = 0x1
DllCall("TerminateProcess", UInt, h_process, UInt, 1)
DllCall("CloseHandle", UInt, h_process)
Ошибочка закралась (UInt в последней строчке), исправьте в Коллекции:
Спасибо! Сделано.
Подскажите пожалуйста мне нужно завершать активный процесс так как это делается через диспетчер задач, но конечно мне нужно поставить это на комбинацию клавиш, это возможно? У меня "Process, Close" не работает без указания процесса.
Активный процесс -что это? Процесс, чей поток выполняется в данный момент в первом ядре процессора, считая с левого верхнего угла? :-)
Если имеется в виду активное приложение, то WinKill Вам в помощь.
WinKill делает это медленно и в блокноте выдает запрос на сохранение, мне нужно именно завершение процесса с возможной потерей данных. Да верно активное приложение.
#F4:: ; Win+F4
WinGet, p, PID, A
Process, Close, %p%
Return
#F4:: ; Win+F4 WinGet, p, PID, A Process, Close, %p% Return
Огромное спасибо!
Пожалуйста.
#F4:: ; Win+F4 WinGet, p, PID, A Process, Close, %p% Return
Почему то не работает с некоторыми полноэкранными приложениями, типо игр.
Наверное игра перехватывает сообщение о нажатие клавиши и оно просто не доходит до твоего скрипта.. Попробуй другое сочетание клавиш в качестве хоткея.
Наверное игра перехватывает сообщение о нажатие клавиши и оно просто не доходит до твоего скрипта.. Попробуй другое сочетание клавиш в качестве хоткея.
Нет, это работает и игра не перехватывает:
#F4::
Process, Close, arma2oa.exe
return
а это не работает ни в арме ни в бэтмане.
#F4::
WinGet, p, PID, A
Process, Close, %p%
Return
Мне нужно для многих приложений, и каждое записывать, кнопок не хватит.
Проверь, какой процесс и заголовок окна у приложения, которое не закрывается подобным образом:
#F4:: ; Win+F4
WinGet, p, ProcessName, A
WinGetTitle, t, A
MsgBox % "Process: " p "`nTitle: " t
Return
Проверь, какой процесс и заголовок окна у приложения, которое не закрывается подобным образом:
#F4:: ; Win+F4 WinGet, p, ProcessName, A WinGetTitle, t, A MsgBox % "Process: " p "`nTitle: " t Return
Нечего не происходит, с блокнотом работает, а с играми нет.
Нечего не происходит...
Замените именное название (F4) на скан-код (sc3E).
1st пишет:Нечего не происходит...
Замените именное название (F4) на скан-код (sc3E).
#sc3E:: ;Win+F4
WinGet, p, PID, A
Process, Close, %p%
Return
Работает, спасибо!
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться