Что нового

Как запретить закрывать окно

lixar21

Новичок
Сообщения
70
Репутация
0
Добрый вечер. У меня есть такой вопрос к специалистам.

Я собственно недавно установил программу Avast. И с удивлением обнаружил - что ее нельзя закрыть из диспетчера задач. Она постоянно в трее висит и никак ее не закроешь.
Вылетает сообщение типа - процесс не может быть закрыт, отказано в доступе. Что-то в этом духе.

Подскажите как автоитом - сделать что-то похожее для окна "Книга-15.xls" ?
Чтобы окно "Книга-15.xls" никак нельзя было закрыть, если оно открыто. Только при помощи перезагрузки (в общем по образу этого Avast'а)
 
Автор
L

lixar21

Новичок
Сообщения
70
Репутация
0
joiner, ну вот нашел две ссылки.
Что-то в них есть, но это не совсем то.

1.Этот скрипт замораживает окно. Сделать с ним ничего нельзя. Но зато там и напечатать ничего нельзя.
Код:
Global $process="notepad.exe",$fSuspended

Run('notepad.exe', '', @SW_MAXIMIZE)
WinWait('111.txt')
_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

2. Этот скрипт просто убирает кнопку закрытия. Причем это окно можно перетаскивать как угодно.
Код:
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

И оба скрипта с легкостью закрываются - через диспетчер задач.

Я имел ввиду - как запретить в диспетчере задач - прерывать процесс, связанный с окном.
 
Верх