Что нового

Нажатие Enter (не эмуляция)

kyi

Чайник
Сообщения
43
Репутация
0
Добрый день!
Подскажите пожалуйста как выполнить действие при нажатии на кнопку Enter?
Для примера хочу сделать что то похожее на окошко "Выполнить" в Win7
В поле Input ввести, например Notepad и при нажатии на на кнопку "Выполнить" или Enter на клавиатуре, должен запуститься блокнот.
При нажатии на кнопку "Выполнить" у меня все работает, но не могу понять как запустить блокнот при нажатии на Enter
В справке нашел что есть Send, но это эмуляция и мне это не подходит.
 

gunter123

Осваивающий
Сообщения
121
Репутация
47
Примерно вот так
Код:
#include <Misc.au3>

HotKeySet('{ENTER}', '_Run')        ; регистрируем функцию запуска на клавишу Enter

Func _Run()
   Run(@WindowsDir & '\system32\' & $sEdit & '.exe')
EndFunc

$sEdit = 'notepad'                        ; содержимое вашего Edit`а
While Sleep(100)

WEnd
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
Хм....
Посмотрел справку, там пишут
HotKeySet
Устанавливает горячую клавишу для вызова пользовательской функции.

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

gunter123

Осваивающий
Сообщения
121
Репутация
47
Тогда вот так
Код:
#include <GUIConstantsEx.au3>

$hGUI = GUICreate("", 120, 20)
$hInput = GUICtrlCreateInput("notepad", 0, 0, 120, 20)

$Dummy = GUICtrlCreateDummy()
Local $aCC[1][2]=[["{enter}",$Dummy]]
GUISetAccelerators($aCC,$hGUI)
GUISetState(@SW_SHOW)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
	  Case $Dummy
		 _Run(GUICtrlRead($hInput))
	  Case $GUI_EVENT_CLOSE
		 Exit
    EndSwitch
 WEnd

Func _Run($sText)
   Run(@WindowsDir & '\system32\' & $sText & '.exe')
EndFunc
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
Да, спасибо, это именно то, что надо.
Но прошу пояснений
Что такое GUICtrlCreateDummy и для чего это надо?
Опять же справка как всегда очень информативна (Создаёт Dummy (элемент пустышка) в GUI.)
Пример который дан в справке, тоже непонятен, да и вообще расскажите про каждую строчку в коде, мне тоже не понятно, что за массив появился
(Local $aCC[1][2]=[["{enter}",$Dummy]])
 

gunter123

Осваивающий
Сообщения
121
Репутация
47
Ну, насколько я понимаю, эта "пустышка" делает так, чтобы нажатия указанных клавиш могли быть пойманы функцией GUIGetMsg() для дальнейшей обработки. То есть, мы создаем пустышку, создаем массив чтобы указать на какие клавиши она будет реагировать, а потом добавляем этот массив в обработчик нашего GUI окна, после чего оно уже может реагировать на нажатия Enter
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
gunter123 сказал(а):
создаем массив чтобы указать на какие клавиши она будет реагировать,
Такс...
Тогда еще вопрос, а как понять какой именно массив надо создавать?
В данном случае [1][2], почему не [100][500]?
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
Елки-палки, товарищи спасайте, весь мозг сломал, не понимаю я :stars:

Все же почему массив именно такой - Local $aCC[1][2]=[["{enter}",$Dummy]]
В справке нефига не понятно

Массив, переданный этой функции, содержит горячие клавиши и присвоенные им идентификаторы элементов управления. Массив должен определён как Dim $array[n][2] - где n -количество установленных быстрых клавиш:
$array[0][0] = Первая горячая клавиша (в формате HotKeySet())
$array[0][1] = Первый идентификатор элемента управления, возвращённый функцией GUICtrlCreate...()
$array[1][0] = Вторая горячая клавиша
$array[1][1] = Второй идентификатор элемента управления
...
$array[n][0] = n-ая горячая клавиша
$array[n][1] = n-ый идентификатор элемента управления


Хорошо, n -количество установленных быстрых клавиш
Я понимаю, что если в моем окне мне потребуется получить ответ не только от нажатия на Enter, но и от ESC, то должно получиться так
Local $aCC[2][2]=[["{enter}",{esc},$Dummy]]

А если я хочу получать ответ от трех клавиш, то так
Local $aCC[3][2]=[["{enter}",{esc},{f7},$Dummy]]
Поправьте меня если я не правильно понял.

А почему вторым значением в массиве стоит 2 [-][2] ?
Как понять что там должно быть в том или ином случае?

$array[0][1] = Первый идентификатор элемента управления, возвращённый функцией GUICtrlCreate...()
$array[1][0] = Вторая горячая клавиша

О каком идентификаторе идет речь, что это такое ?
Почему вторая горячая клавиша имеет значение 1 ?
Почему второе значение массива 0, а не 2, хотя в начале справки говорилось Массив должен определён как Dim $array[n][2]?

Люди, объясните пожалуйста, в голове каша.
Направьте меня на нормальный учебник (на русском) где про это все рассказано подробно, справка никаких знаний не дает, только путает.
 
A

Alofa

Гость
kyi сказал(а):
... это именно то, что надо...
Уф, как все сложно :whistle:

Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

$hGUI = GUICreate("", 230, 60)
$iInput = GUICtrlCreateInput("notepad", 20, 20, 120, 20)
$Button = GUICtrlCreateButton("Run", 150, 20, 60, 20, $BS_DEFPUSHBUTTON) ; http://autoit-script.ru/autoit3_docs/appendix/GUIStyles.htm#Button
GUISetState(@SW_SHOW)

While 1
	Switch GUIGetMsg()
		Case $Button
			Run(GUICtrlRead($iInput))
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
WEnd



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

kyi сказал(а):
... в голове каша...
Это логично если начинать знакомство с языком сразу с раздела "Функции", а не с Самого Начала.
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
Alofa, ну привели вы пример, спасибо конечно, однако я так и не получил ответы на свои вопросы.
Если вам все понятно, почему бы не объяснить другим?
Немного переделал ваш пример, попробуйте потыкать Enter.
Код:
#include <GUIConstantsEx.au3>
#include <ButtonConstants.au3>

$hGUI = GUICreate("", 230, 100)
$iInput1 = GUICtrlCreateInput("notepad", 20, 20, 120, 20)
$iInput2 = GUICtrlCreateInput("calc", 20, 50, 120, 20)
$Button1 = GUICtrlCreateButton("Run1", 150, 20, 60, 20, $BS_DEFPUSHBUTTON)
$Button2 = GUICtrlCreateButton("Run2", 150, 50, 60, 20, $BS_DEFPUSHBUTTON)
GUISetState(@SW_SHOW)

While 1
    Switch GUIGetMsg()
        Case $Button1
            Run(GUICtrlRead($iInput1))
        Case $Button2
            Run(GUICtrlRead($iInput2))   
        Case $GUI_EVENT_CLOSE
            Exit
    EndSwitch
WEnd

Из приведенной вами ссылки я понял почему в примере работает Enter (благодаря $BS_DEFPUSHBUTTON), но я не понимаю почему работает ESC
 

gunter123

Осваивающий
Сообщения
121
Репутация
47
Похоже, что в варианте от Alofa GUI окно становится диалоговым и при нажатии Enter нажмется указанная кнопка с параметром $BS_DEFPUSHBUTTON, а при нажатии Esc это окно закроется. Этого достаточно чтобы сделать окошко, похожее на "Выполнить" в Windows. А вот если вам понадобится обрабатывать несколько разных Input`ов, и чтобы на другие клавиши реагировало, то попробуйте этот пример :scratch:
Код:
#include <GUIConstantsEx.au3>
#include <GuiEdit.au3>

$hGUI = GUICreate("", 200, 40)
$hInput1 = GUICtrlCreateInput("notepad", 0, 0, 200, 20)
$hInput2 = GUICtrlCreateInput("notepad", 0, 20, 200, 20)

$hDummy1 = GUICtrlCreateDummy()	; Создадим несколько пустышек
$hDummy2 = GUICtrlCreateDummy()
Local $aCC[3][2]=[["{ENTER}", $hDummy1], ["{TAB}", $hDummy1], ["{ESC}", $hDummy2]] ; первая реагирует на Enter и Tab, вторая на Esc
GUISetAccelerators($aCC,$hGUI)	; Добавляем обработчики в GUI
GUISetState(@SW_SHOW)

While True
    $nMsg = GUIGetMsg()
    Switch $nMsg
      Case $hDummy1
		 ConsoleWrite("Сработала пустышка 1, текст в активном элементе - " & ControlGetText($hGUI, "", ControlGetFocus($hGUI)) & @CRLF)
      Case $hDummy2
		 ConsoleWrite("Сработала пустышка 2, текст в активном элементе - " & ControlGetText($hGUI, "", ControlGetFocus($hGUI)) & @CRLF)
      Case $GUI_EVENT_CLOSE
         Exit
    EndSwitch
 WEnd
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
gunter123, добрый день!
К сожалению ваш пример не работает, не откликается ни одна из клавиш.
 
A

Alofa

Гость
kyi сказал(а):
... попробуйте потыкать Enter...
Код:
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>

Local $iFlag = 0, $hGUI = GUICreate("", 230, 100)
$iInput1 = GUICtrlCreateInput("notepad", 20, 20, 120, 20)
$hInput1 = GUICtrlGetHandle($iInput1)
$iInput2 = GUICtrlCreateInput("calc", 20, 50, 120, 20)
$hInput2 = GUICtrlGetHandle($iInput2)
$Button1 = GUICtrlCreateButton("Run1", 150, 20, 60, 20)
$Button2 = GUICtrlCreateButton("Run2", 150, 50, 60, 20)
GUISetState()
GUIRegisterMsg($WM_COMMAND, '_WM_COMMAND')

While 1
	Switch GUIGetMsg()
		Case $Button1
			$iFlag = $iInput1
		Case $Button2
			$iFlag = $iInput2
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
	If $iFlag Then
		Run(GUICtrlRead($iFlag))
		$iFlag = 0
	EndIf
WEnd

Func _WM_COMMAND($hWnd, $Msg, $wParam, $lParam)
	; Смотрите пример (http://autoit-script.ru/autoit3_docs/userfunctions/WM_COMMAND.htm) в справке
	; по каким признакам можно определить нажатие Enter
	If $wParam = 1 And $lParam = 0 Then
		Switch ControlGetHandle($hGUI, '', '') ; http://autoit-script.ru/index.php?topic=21382.msg125880#msg125880
			Case $hInput1
				$iFlag = $iInput1
			Case $hInput2
				$iFlag = $iInput2
		EndSwitch
	EndIf
	Return $GUI_RUNDEFMSG
EndFunc   ;==>_WM_COMMAND
 
Автор
K

kyi

Чайник
Сообщения
43
Репутация
0
Alofa, спасибо
Работает как задумано, сейчас буду разбираться
 
A

Alofa

Гость
OffTopic:
kyi сказал(а):
... буду разбираться
Для того чтобы разбираться вам нужно понять как взаимодействуют элементы управления окна с самим окном, что такое WM-события
... и как они обрабатываются. Что в GUI Autoit есть свой штатный обработчик таких событий (с двумя режимами работы), но если его функционала не хватает, то можно установить свой обработчик (смотри GUIRegisterMsg()).
Так вот, а для всего этого вам необходимо познать Концепцию GUI. Одно "цепляется" за другое, вот я и говорю: прежде чем писать готовые скрипты нужно прочитать и понять основы языка и то как он работает с ОС.
 
Верх