Что нового

Как не давать пользователю сворачивать/закрывать программу

Suppir

Продвинутый
Сообщения
967
Репутация
62
Добрый день!

Возникла следующая задача. Допустим, на компьютере установлена программа с названием (title) "Программа". Необходимо сделать скрипт, который:

1) не даст пользователю свернуть/развернуть/закрыть данную программу после того, как она будет запущена. Т.е. заблокировать работу кнопок в верхнем правом углу Программы.
2) также нужно заблокировать ALT+F4 и CTRL+ALT+DEL.
3) программа должна запускаться на весь экран, панель задач windows, которая отображается внизу экрана, а также трей и кнопка Пуск должны быть скрыты.
4) выход и вход в данный режим работы должен осуществляться комбинацией хоткеев.

p.s. Чтобы не было недоразумений - скрипт нужен НЕ для SMS-вируса, а для запуска программы на терминале (такая стойка с сенсорным управлением). Чтобы Программа была всегда развернута и пользователи не закрывали ее.



Добавлено:
Сообщение автоматически объединено:

Для примера возьмем, что эта программа - notepad.exe
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Думаю что один из этих вариантов должен подойти ;)

1) Задаем окну блокнота "Сквозной режим".
Код:
#include <WindowsConstants.au3>

Run('notepad', '', @SW_MAXIMIZE)

WinWait('[CLASS:Notepad]')
$hWnd = WinGetHandle("[CLASS:Notepad]")
$nStyle = _WinGetStyle($hWnd, 0)
$nExStyle = _WinGetStyle($hWnd, 1)

_WinSetStyle($hWnd,  -1,BitOr($nExStyle, BitOr($WS_EX_TRANSPARENT, $WS_EX_TOPMOST)))
WinSetTrans($hWnd,"",255)
WinSetOnTop($hWnd,"",1)

Func _WinSetStyle($hWnd, $nStyle = -1, $nExStyle = 0)
    Local Const $GWL_STYLE = -16, $GWL_EXSTYLE = -20
    Local Const $SWP_NOMOVE = 0x2, $SWP_NOSIZE = 0x1, $SWP_SHOWWINDOW = 0x40, $SWP_NOZORDER = 0x4
    Local $iFlags = BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOZORDER)

    If $nStyle = -1 Then
        $nStyle = BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)
    EndIf
    $Pos = WinGetpos($hWnd)
    $x = $Pos[0]
    $y = $Pos[1]

    DllCall("User32.dll", "int", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_STYLE, "int", $nStyle)
    DllCall("User32.dll", "int", "SetWindowLong", "hwnd", $hWnd, "int", $GWL_EXSTYLE, "int", $nExStyle)
    DllCall("User32.dll", "int", "SetWindowPos", "hwnd", $hWnd, "hwnd", 0, "int", $x + 1, "int", $y + 1 , "int", 0, "int", 0, "int", $iFlags)
EndFunc

Func _WinGetStyle($hWnd, $iIndex = 0)
    Local Const $GWL_STYLE = -16, $GWL_EXSTYLE = -20

    Local $iGWL_Index = $GWL_STYLE

    If $iIndex > 0 Then
        $iGWL_Index = $GWL_EXSTYLE
    EndIf

    Local $aStyles = DllCall('User32.dll', 'long', 'GetWindowLong', 'hwnd', $hWnd, 'int', $iGWL_Index)
    Return $aStyles[0]
EndFunc


2) Морозим процесс блокнота.
Код:
Global $process="notepad.exe",$fSuspended

Run('notepad.exe', '', @SW_MAXIMIZE)
WinWait('[CLASS:Notepad]')
_ProcSuspendResume('notepad.exe')

Func _ProcSuspendResume($process)
      $processid = ProcessExists($process)
      If $processid Then
          If $fSuspended Then
              $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
              $i_sucess = DllCall("ntdll.dll","int","NtResumeProcess","int",$ai_Handle[0])
              DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
              If IsArray($i_sucess) Then
                  $fSuspended = 0
                  Return 1
              Else
                  SetError(1)
                  Return 0
              Endif
          Else
              $ai_Handle = DllCall("kernel32.dll", 'int', 'OpenProcess', 'int', 0x1f0fff, 'int', False, 'int', $processid)
              $i_sucess = DllCall("ntdll.dll","int","NtSuspendProcess","int",$ai_Handle[0])
              DllCall('kernel32.dll', 'ptr', 'CloseHandle', 'ptr', $ai_Handle)
              If IsArray($i_sucess) Then
                  $fSuspended = 1
                  Return 1
              Else
                  SetError(1)
                  Return 0
              Endif
          EndIf
      Else
          SetError(2)
          Return 0
      Endif
EndFunc

Global $fSuspended = 0
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Так, спасибо, я вечером потестирую, так как сейчас сижу за сервером и боюсь на нем запускать :smile:
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir [?]
а для запуска программы на терминале (такая стойка с сенсорным управлением)
IMHO этого будет достаточно.
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Form1", @DesktopWidth, @DesktopHeight, 0, 0, BitOR($WS_MINIMIZEBOX,$WS_POPUP,$WS_GROUP,$WS_CLIPSIBLINGS))
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $GUI_EVENT_CLOSE
			Exit

	EndSwitch
WEnd

Пункты 2 и 4 в вашем случае не актуальны, потому как на сенсорных панелях горячие клавиши не работают.
 

Zaramot

I ♥ AutoIt
Сообщения
1,160
Репутация
660
Garrett, на сколько я понял, ему нужно заблокировать только внешнюю программу.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Garrett
Открылся полностью серый экран, а дальше что? :blink:
Задача ведь в блокировании сторонней программы (не на AutoIt). Чтобы ее нельзя было свернуть/закрыть.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir,
Не совсем понятна задача. Что может делать пользователь кроме того, что ему запрещено закрыть(свернуть) окно конкретной программы(завершить процесс), какие у него права (админ или нет)?

PS
Некоторый окна еще и по Esc закрываются.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
Что за программа?
Может быть целесобразее написать свою?
Какой интерфейс имеет терминал? клава, мышь тачпад?
Тут желательно пощупать Вашу программу.
з.ы.
убать пуск и прочее можно убив процесс explorer.exe, запретить Alt+Ctrl+Del хитрой записью в реестре.

Ещё как вариант защиты от закрытия: постоянно проверять в цикле состояние окна и и процесса. Если окно свёрнуто - развернуть его. Если закрыто (процесс убит) - запустить его.
 

Garrett

Модератор
Локальный модератор
Сообщения
3,999
Репутация
967
Suppir
Задача ведь в блокировании сторонней программы
Вот именно то, что программа должна быть сторонней, в вашем сообщении чётко не просматривается.

Лично я на основании ниже следующего понял,
p.s. Чтобы не было недоразумений - скрипт нужен НЕ для SMS-вируса, а для запуска программы на терминале (такая стойка с сенсорным управлением). Чтобы Программа была всегда развернута и пользователи не закрывали ее.
что вам нужно создать терминальную программу (по типу оплаты счетов) и чтобы её нельзя было, свернуть или удалить из диспетчера задач. Опираясь на свой опыт, я вам предложил вариант окна, которое (на терминале) не получится свернуть или удалить из диспетчера задач. Также написал вам, что пункты 2 и 4 вашей задачи не актуальны для терминала с сенсорной панелью, потому как для того чтобы воспользоваться горячими клавишами вам нужно будет подключить клавиатуру, что невозможно, если только вы не являетесь оператором данного терминала.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
Ребята, внимательно прочитайте первый пост, пожалуйста.

Для примера берется программа "notepad.exe". То есть нужен скрипт, который будет контролировать обычную программу для Windows.


Добавлено:
Сообщение автоматически объединено:

madmasles

Пользователь может пользоваться открытой программой, но не может закрывать ее или сворачивать.

Представьте, что мы запустили Программу (блокнот). Потом запускаем наш AutoIt-скрипт. Этот скрипт должен увидеть, что блокнот запущен, перевести его в полноэкранный режим, заблокировать клавиши "свернуть, развернуть, закрыть программу" и т.д. Чтобы выйти из этого режима нужно нажать определенный хоткей.
 

ynbIpb

Скриптер
Сообщения
399
Репутация
110
вот типа так?
calcn.png

Тогда функция _WinSetStyle, предложенная Zaramot - то что нужно!

вот оно: remove titlebar and borders of external window
но альт+f4 по прежнему будут работать.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Вот так ещё можно убрать функцию закрытия:

Код:
Global Const $SC_CLOSE = 0xF060
Global Const $SC_MOVE = 0xF010
Global Const $SC_SIZE = 0xF000
Global Const $SC_RESTORE = 0xF120
Global Const $SC_MOUSEMENU = 0xF090
Global Const $SC_MINIMIZE = 0xF020
Global Const $SC_MAXIMIZE = 0xF030

Run("Notepad.exe")
WinWait("[REGEXPCLASS:Notepad.*]")
$hWnd = WinGetHandle("[REGEXPCLASS:Notepad.*]")

_WinAPI_RemoveMenu($hWnd, $SC_CLOSE)

Func _WinAPI_RemoveMenu($hWnd, $iFlag)
	Local $aMenu = DllCall("User32.dll", "hwnd", "GetSystemMenu", "hwnd", $hWnd, "int", 0)
	If @error Then Return SetError(1)
	DllCall("User32.dll", "int", "RemoveMenu", "hwnd", $aMenu[0] , "int", $iFlag, "int", 0x0)
EndFunc
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR
Очень интересно. Крестик, который должен закрывать программу, стал серым. Но кнопки, которые сворачивают и разворачивают программу, остались работать.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir,
С Блокнотом у меня на Windows XP вроде работает.
Код:
#RequireAdmin
#include <WindowsConstants.au3>
#include <HotKey.au3>;http://autoit-script.ru/index.php/topic,296.0.html
#include <vkConstants.au3>
#include <GuiMenu.au3>

If Not IsAdmin() Then
	MsgBox(16, 'Error', 'Вы не админ, до свидания')
	Exit
EndIf

Opt('WinWaitDelay', 0)

_HotKeyAssign(BitOR($CK_ALT, $CK_SHIFT, $CK_CONTROL, $VK_INSERT), '_Quit') ;Alt+Shift+Ctrl+Insert
_HotKeyAssign(BitOR($CK_ALT, $VK_F4), '_Fig_Vam', BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
_HotKeyAssign(BitOR($CK_WIN, $VK_D), '_Fig_Vam', BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))
_HotKeyAssign(BitOR($CK_WIN, $VK_M), '_Fig_Vam', BitOR($HK_FLAG_DEFAULT, $HK_FLAG_EXTENDEDCALL))

RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableTaskMgr', 'REG_DWORD', '1')
RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableRegistryTools', 'REG_DWORD', '1')
Run(@WindowsDir & '\notepad.exe')
$hWindow = WinWait('[REGEXPCLASS:Notepad.*]', '', 3)
If Not $hWindow Then Exit
WinSetState($hWindow, '', @SW_MAXIMIZE)
_WinSetStyle($hWindow, -1, $WS_EX_TOOLWINDOW)
$hMenu = _GUICtrlMenu_GetSystemMenu($hWindow)
_GUICtrlMenu_EnableMenuItem($hMenu, $SC_CLOSE, 1, False)

While 1
	Sleep(10)
WEnd

Func _Quit()
	_WinSetStyle($hWindow, BitOR($WS_SIZEBOX, $WS_MINIMIZEBOX, $WS_MAXIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU))
	_GUICtrlMenu_EnableMenuItem($hMenu, $SC_CLOSE, 0, False)
	WinSetState($hWindow, '', @SW_RESTORE)
	RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableTaskMgr', 'REG_DWORD', '0')
	RegWrite('HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System', 'DisableRegistryTools', 'REG_DWORD', '0')
	Exit
EndFunc   ;==>_Quit

Func _Fig_Vam($iKey)
	MsgBox(16, 'Error', 'Нельзя')
EndFunc   ;==>_Fig_Vam

Func _WinSetStyle($hWnd, $nStyle = -1, $nExStyle = 0)
	Local Const $GWL_STYLE = -16, $GWL_EXSTYLE = -20
	Local Const $SWP_NOMOVE = 0x2, $SWP_NOSIZE = 0x1, $SWP_SHOWWINDOW = 0x40, $SWP_NOZORDER = 0x4
	Local $iFlags = BitOR($SWP_SHOWWINDOW, $SWP_NOSIZE, $SWP_NOMOVE, $SWP_NOZORDER)
	If $nStyle = -1 Then $nStyle = BitOR($WS_MINIMIZEBOX, $WS_CAPTION, $WS_POPUP, $WS_SYSMENU)
	DllCall('User32.dll', 'int', 'SetWindowLong', 'hwnd', $hWnd, 'int', $GWL_STYLE, 'int', $nStyle)
	DllCall('User32.dll', 'int', 'SetWindowLong', 'hwnd', $hWnd, 'int', $GWL_EXSTYLE, 'int', $nExStyle)
	DllCall('User32.dll', 'int', 'SetWindowPos', 'hwnd', $hWnd, 'hwnd', 0, 'int', 0, 'int', 0, 'int', 0, 'int', 0, 'int', $iFlags)
EndFunc   ;==>_WinSetStyle
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles

Отлично работает! Спасибо! :smile:



Добавлено:
Сообщение автоматически объединено:

madmasles
Только остается панель инструментов внизу. Пользователь может кликнуть правой кнопкой мыши по блокноту и закрыть его.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Suppir [?]
Только остается панель инструментов внизу
Можно и без функций отключения меню:

Код:
...

Run(@WindowsDir & '\notepad.exe')
$hWindow = WinWait('[REGEXPCLASS:Notepad.*]', '', 3)
If Not $hWindow Then Exit
WinSetState($hWindow, '', @SW_MAXIMIZE)
_WinSetStyle($hWindow, BitOR($WS_SIZEBOX, $WS_CAPTION, $WS_POPUP))

While 1
    Sleep(10)
WEnd

...


да, и в _Quit нужно удалить строчку с _GUICtrlMenu_EnableMenuItem.
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
CreatoR

Windows 7. Все равно на панели блокнот остался. Я его закрыл через правую кнопку мышки.
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,322
Suppir
А может, в цикл добавить?
Код:
;...
While 1
	If Not WinActive($hWindow) Then
		WinActivate($hWindow)
	EndIf
	Sleep(10)
WEnd
;...
 
Автор
S

Suppir

Продвинутый
Сообщения
967
Репутация
62
madmasles
По-видимому, это будет мешать работе программы. Ведь у нее могут быть свои окна различные, msgbox'ы и т.п.
 

asdf8

Скриптер
Сообщения
564
Репутация
152
Все равно на панели блокнот остался. Я его закрыл через правую кнопку мышки.

Окно можно сделать дочерним, например к окну рабочего стола, тогда оно должно уйти с панели задач.
 
Верх