Что нового

[Окна, Диалоги] Заблокировать окно

Крепыш

Новичок
Сообщения
105
Репутация
2
Код:
WinSetState($hWnd, "", @SW_ENABLE)

запрещает доступ к окну. При этом его также нельзя закрыть стандартным образом. Можно ли как-то сделать, чтобы окно реагировало на Alt+F4 или крестик?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Крепыш [?]
запрещает доступ к окну
Наоборот.

Можно попробовать так:

Код:
#include <WinAPIEx.au3>

$hWindow = WinGetHandle('[ACTIVE]')
_WindowEnable($hWindow, False)

Sleep(5000)

_WindowEnable($hWindow, True)

Func _WindowEnable($hWnd, $bEnable)
	Local $aChilds = _WinAPI_EnumChildWindows($hWnd)
	
	For $i = 1 To $aChilds[0][0]
		_WinAPI_EnableWindow($aChilds[$i][0], $bEnable)
	Next
EndFunc


но это не защитит от доступа к меню.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Ещё вариант:

Код:
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$hWindow = WinGetHandle('[ACTIVE]')

$hEnable = _WinEnable($hWindow, False)

Sleep(5000)

_WinEnable($hEnable, True)

Func _WinEnable($hWnd, $bEnable = True)
	If $bEnable Then
		GUIDelete($hWnd)
		Return
	EndIf
	
	Local $aWinPos = WinGetPos($hWnd)
	Local $aWinCSize = WinGetClientSize($hWnd)
	Local $hGUI = GUICreate('', $aWinCSize[0], $aWinCSize[1], 0, 0, $WS_POPUP, -1, $hWnd)
	
	WinSetTrans($hGUI, '', 254)
	GUISetState(@SW_DISABLE, $hGUI)
	GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
	_WinAPI_SetParent($hGUI, $hWnd)
	
	Return $hGUI
EndFunc
 
Автор
К

Крепыш

Новичок
Сообщения
105
Репутация
2
CreatoR,
спасибо за варианты, но меню и горячие клавиши также необходимо заблокировать.
 

CreatoR

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

Код:
#include <GUIMenu.au3>
#include <WindowsConstants.au3>
#include <WinAPI.au3>

$hWindow = WinGetHandle('[ACTIVE]')

$hEnable = _WinEnable($hWindow, False)

Sleep(5000)

_WinEnable($hWindow, $hEnable)

Func _WinEnable($hWnd, $bEnable = True)
	If $bEnable Then
		GUIDelete($bEnable)
	EndIf
	
	$hMenu = _GUICtrlMenu_GetMenu($hWnd)
	$iItems = _GUICtrlMenu_GetItemCount($hMenu)
	
	For $i = 0 To $iItems - 1
		_GUICtrlMenu_EnableMenuItem($hMenu, $i, ($bEnable ? 0 : 2))
	Next
	
	If $bEnable Then
		Return
	EndIf
	
	Local $aWinPos = WinGetPos($hWnd)
	Local $aWinCSize = WinGetClientSize($hWnd)
	
	Local $hGUI = GUICreate('', $aWinCSize[0], $aWinCSize[1], 0, 0, $WS_POPUP, -1, $hWnd)
	
	_WinAPI_SetParent($hGUI, $hWnd)
	WinSetTrans($hGUI, '', 254)
	GUISetState(@SW_DISABLE, $hGUI)
	GUISetState(@SW_SHOWNOACTIVATE, $hGUI)
	
	Return $hGUI
EndFunc
 
A

Alofa

Гость
Крепыш сказал(а):
... чтобы окно реагировало на Alt+F4 ...
Пример с окном штатного калькулятора:
(как вариант)
Код:
Run('calc.exe')

$hWnd_1 = WinWait("[CLASS:CalcFrame]", "", 5)
If Not $hWnd_1 Then
    MsgBox(4096, 'Сообщение', 'Окно не найдено, завершаем работу скрипта')
    Exit
EndIf

HotKeySet('!{F4}', '_WinClose') ; Для "Alt+F4"

While WinExists($hWnd_1)
	Sleep(250)
Wend

Func _WinClose()
	If WinActive($hWnd_1) Then WinClose($hWnd_1) ; Если окно активно - Закрываем его
	Exit
EndFunc
 
A

Alofa

Гость
OffTopic:

CreatoR ваш пример без сомненья круче (серьезно).
CreatoR сказал(а):
... а как быть с кнопками в заголовке?
Вот и я думаю?.. Поэтому выложил как есть.
 

InnI

AutoIT Гуру
Сообщения
4,912
Репутация
1,429
Заблокированное окно блокнота можно закрыть по Alt+F4 и кликом по кнопке "Закрыть"
Код:
#include <UIAutomate.au3>
#include <Misc.au3>
#include <WinAPI.au3>

Opt("WinWaitDelay", 50)

If Not WinExists("[class:Notepad]") Then Run("Notepad.exe")
$hWnd = WinWait("[class:Notepad]")

WinSetState($hWnd, "", @SW_DISABLE)

While Sleep(10)
  If _IsPressed("01") Then
    $tPos = _WinAPI_GetMousePos()
    If _WinAPI_WindowFromPoint($tPos) = $hWnd Then WinActivate($hWnd)
    $oElement = _UIA_GetElementFromPoint($tPos.X, $tPos.Y)
    If Not @error Then
      If  _UIA_ElementGetPropertyValue($oElement, "ControlType") = $UIA_ButtonControlTypeId _
      And _UIA_ElementGetPropertyValue($oElement, "Name") = "Закрыть" _
      And _UIA_ElementGetPropertyValue(_UIA_ElementGetParent(_UIA_ElementGetParent($oElement)), "NativeWindowHandle") = $hWnd Then
        WinClose($hWnd)
        Exit
      EndIf
    EndIf
  EndIf
  If _IsPressed("12") And _IsPressed("73") And WinGetHandle("[active]") = $hWnd Then
    WinClose($hWnd)
    Exit
  EndIf
WEnd
 
Верх