I think there is only one way to prevent Tab and Arrow, disable GUICtrlSetState($iButton_1, $GUI_DISABLE) and re-enable every time we use _GUIDisable function.
#AutoIt3Wrapper_Au3Check_Parameters=-d -w 1 -w 2 -w 3 -w 4 -w 5 -w 6
#include <WindowsConstants.au3>
#include "_GUIDisable.au3"
_Main()
Func _Main()
Local $hGUI, $iButton_1, $iButton_2, $iLabel, $iTimer
$hGUI = GUICreate("_GUIDisable_but_Tab_Enable", 300, 100, -1, -1, BitXOR($GUI_SS_DEFAULT_GUI, $WS_SIZEBOX, $WS_MINIMIZEBOX))
$iButton_1 = GUICtrlCreateButton("Effect 1", 190, 70, 100, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKSIZE + $GUI_DOCKTOP)
$iButton_2 = GUICtrlCreateButton("TAB Enabled :(", 10, 70, 100, 25)
GUICtrlSetResizing(-1, $GUI_DOCKLEFT + $GUI_DOCKSIZE + $GUI_DOCKTOP)
GUISetState(@SW_SHOW, $hGUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE, $iButton_2
Exit
Case $iButton_1
_GUIDisable(-1, 1, 25) ; Enable the dimmed effect on the current GUI with the animation turned on.
GUICtrlSetState($iButton_1, $GUI_DISABLE)
GUICtrlSetState($iButton_2, $GUI_DISABLE)
$iLabel = GUICtrlCreateLabel("SimpleText", 5, 5) ; Create a label with some text after calling _GUIDisable().
MsgBox(0, "Hello", "Now we can't use TAB and Arrow key to select controls.", 0, $hGUI)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$iTimer = TimerInit()
Do
If GUIGetMsg() = $GUI_EVENT_CLOSE Then ; Exit the loop if $GUI_EVENT_CLOSE is captured by GUIGetMsg().
ExitLoop
EndIf
Sleep(10)
Until TimerDiff($iTimer) > 3000
GUICtrlDelete($iLabel) ; Delete the control before closing _GUIDisable()
_GUIDisable(-1, 1) ; Disable the dimmed effect with the animation turned on and add focus to the current GUI.
GUICtrlSetState($iButton_1, $GUI_ENABLE)
GUICtrlSetState($iButton_2, $GUI_ENABLE)
EndSwitch
WEnd
EndFunc ;==>_Main