Что нового

[Элементы GUI] Действие по нажатию клавиши Enter

freed21

Новичок
Сообщения
39
Репутация
1
Добрый день, уважаемые форумчане!
Передо мной встала задача следующего характера:
Имеется 4 элемента Edit и 4 кнопки, каждая из которых соответствует своему Edit-у.
Нужно сделать так чтобы по нажатию клавиши Enter выполнялось определенное действие, в зависимости от того в каком элементе Edit были произведены изменения, то есть так, чтобы можно было ввести строку в Edit и нажать на кнопку, либо на Enter.

Проблема возникла с определением Edita в котором были произведены изменения. Нужно что-то типа onFocus..
Если кто работал с подобной функцией, подскажите, пожалуйста :smile:
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
freed21
По "Ener" вот пример http://www.autoitscript.com/forum/topic/139260-autoit-snippets/?p=1022183
По кнопке фокус теряется, можно только сверять по предыдущему содержимому или вести лог последнего активного Edit в скрипте.
 
Автор
F

freed21

Новичок
Сообщения
39
Репутация
1
AZJIO, спасибо, вроде что-то похожее, сейчас буду разбираться :smile:


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

Реакция на Enter работает, но вот проблема...
Я поставил Enter как горячую клавишу, и теперь при работающем скрипте, когда он не в фокусе, даже если его свернуть, другие программы не откликаются на Enter. Как поступить с этим? :scratch:
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
freed21
Может быть так:
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
$Gui = GUICreate("", 249, 122)
$Input1 = GUICtrlCreateInput("Input1", 0, 0, 121, 21)
$Input2 = GUICtrlCreateInput("Input2", 0, 32, 121, 21)
$Input3 = GUICtrlCreateInput("Input3", 0, 64, 121, 21)
$Input4 = GUICtrlCreateInput("Input4", 0, 96, 121, 21)
$Exit = GUICtrlCreateButton("Exit", 128, 0, 75, 25)
Global $rTextE[4][2]
$rTextE[0][1]=GUICtrlRead($Input1)
$rTextE[1][1]=GUICtrlRead($Input2)
$rTextE[2][1]=GUICtrlRead($Input3)
$rTextE[3][1]=GUICtrlRead($Input4)
GUIRegisterMsg($wm_command,"__EditT")
$Dummy=GUICtrlCreateDummy()
Local $aCC[1][2]=[["{enter}",$Dummy]]
GUISetAccelerators($aCC,$Gui)
GUISetState(@SW_SHOW)
While 1
	$nMsg = GUIGetMsg()
	Switch $nMsg
		Case $Dummy
			__EnterSnd()
		Case $GUI_EVENT_CLOSE,$Exit
			Exit
	EndSwitch
WEnd
Func __EnterSnd()
	Local $aCtr[4]=[$Input1,$Input2,$Input3,$Input4],$sDe
	For $i=0 To 3
		If $rTextE[$i][0] Then
			$sDe&=$rTextE[$i][1]&@CRLF
		EndIf
	Next
	MsgBox(64,"","Были изменены элементы:"&@CRLF&$sDe)
EndFunc
Func __EditT($hWin,$Msg,$wPar,$lPar)
	If $hWin=$Gui Then
		Switch BitAND($wPar,0xFFFF)
			Case $Input1
				If BitShift($wPar,16)=768 Then
					If GUICtrlRead($Input1)<>$rTextE[0][1] Then $rTextE[0][0]=1
				EndIf
			Case $Input2
				If BitShift($wPar,16)=768 Then
					If GUICtrlRead($Input1)<>$rTextE[1][1] Then $rTextE[1][0]=1
				EndIf
			Case $Input3
				If BitShift($wPar,16)=768 Then
					If GUICtrlRead($Input1)<>$rTextE[2][1] Then $rTextE[2][0]=1
				EndIf
			Case $Input4
				If BitShift($wPar,16)=768 Then
					If GUICtrlRead($Input1)<>$rTextE[3][1] Then $rTextE[4][0]=1
				EndIf
		EndSwitch
	EndIf
EndFunc

Регистрация изменений в переменные, можно чуть сильнее сжать, но было бы каша на каше=)
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
freed21 [?]
Я поставил Enter как горячую клавишу
Как поступить с этим?
Вывод напрашивается: не делать этого.
Не может клавиша отвечать за два действия, так как не может компьютер уловить мысль человеческую, а значит искать способ разграничения. Какой наиболее вероятный? Тот что когда мы пользуемся текущим окном, тогда и применять в нему особые свойства, что и было сделано через быстрые клавиши.
То есть вывод напрашивался правильный, если только есть иные причины, которых я не уловил в вашем сообщении.
 

WSWR

AutoIT Гуру
Сообщения
941
Репутация
363
freed21
Про Enter
Здесь была такая же проблема
http://autoit-script.ru/index.php?topic=14467.msg92575#msg92575
Можно использовать HotKey.au3

AZJIO
Не может клавиша отвечать за два действия
Почему бы и нет? )
http://forum.script-coding.com/viewtopic.php?id=1205
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
WSWR [?]
Почему бы и нет? )
Это логически не возможно. Тут дело не в механизме. Ну если только рандом, но мы то подразумеваем последовательность всвязи с чем то. Если всвязи с нашими мыслями, то пока это ещё не придумали, а если всвязи с другими факторами, то наиглавнейший фактор это отличие окна в котором мы производим действие.
По ссылке много букав, мне достаточно одно слово.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
freed21 [?]
Я поставил Enter как горячую клавишу
Вариант с горячей клавишей
Код:
HotKeySet("{enter}", "test")

$gui = GUICreate("Input control", 320, 240, -1, -1)
$iInput1 = GUICtrlCreateInput("Input1", 14, 10, 290, 23)
$iInput2 = GUICtrlCreateInput("Input2", 14, 40, 290, 23)
$iInput3 = GUICtrlCreateInput("Input3", 14, 70, 290, 23)
$iInput4 = GUICtrlCreateInput("Input4", 14, 100, 290, 23)
GUISetState(@SW_SHOW)

Do
  Sleep(10)
Until GUIGetMsg() = -3

Func test()
  If WinActive($gui) Then
    ; своё окно активно
    Switch ControlGetHandle($gui, "", ControlGetFocus($gui))
      Case GUICtrlGetHandle($iInput1)
        ConsoleWrite("1" & @LF)
      Case GUICtrlGetHandle($iInput2)
        ConsoleWrite("2" & @LF)
      Case GUICtrlGetHandle($iInput3)
        ConsoleWrite("3" & @LF)
      Case GUICtrlGetHandle($iInput4)
        ConsoleWrite("4" & @LF)
    EndSwitch
  Else
    ; действия для других приложений
    MsgBox(0, "", "Окно не активно")
  EndIf
EndFunc
 
Верх