Автор Тема: Нажатие Enter (не эмуляция)  (Прочитано 1471 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Эта тема содержит сообщение, помеченное как лучший ответ. Кликните здесь для перехода к этому сообщению.

Оффлайн kyi [?]

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

Русское сообщество AutoIt

Нажатие Enter (не эмуляция)
« Отправлен: Май 16, 2018, 08:49:26 »

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #1, Отправлен: Май 16, 2018, 09:20:07 »
Примерно вот так
Код: AutoIt [Выделить]
#include <Misc.au3>

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

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

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

WEnd

Is it future or is it past?

Оффлайн kyi [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #2, Отправлен: Май 16, 2018, 09:35:03 »
Хм....
Посмотрел справку, там пишут
HotKeySet
Устанавливает горячую клавишу для вызова пользовательской функции.

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

Оффлайн Tempo [?]

  • Продвинутый
  • ***
  • Сообщений: 401
  • Репутация: 92
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #3, Отправлен: Май 16, 2018, 09:42:50 »
kyi  [?]
Цитировать
хочу сделать что то похожее на окошко "Выполнить" в Win7

Если я правильно вас понял
Код: AutoIt [Выделить]

Русское сообщество AutoIt

Re: Нажатие Enter (не эмуляция)
« Ответ #3 Отправлен: Май 16, 2018, 09:42:50 »

Помечен как лучший ответ пользователем kyi Отправлен Май 16, 2018, 10:03:25

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #4, Отправлен: Май 16, 2018, 09:47:36 »
Тогда вот так
Код: AutoIt [Выделить]
#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


Оффлайн kyi [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #5, Отправлен: Май 16, 2018, 10:05:42 »
Да, спасибо, это именно то, что надо.
Но прошу пояснений
Что такое GUICtrlCreateDummy и для чего это надо?
Опять же справка как всегда очень информативна (Создаёт Dummy (элемент пустышка) в GUI.)
Пример который дан в справке, тоже непонятен, да и вообще расскажите про каждую строчку в коде, мне тоже не понятно, что за массив появился
(Local $aCC[1][2]=[["{enter}",$Dummy]])

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #6, Отправлен: Май 16, 2018, 10:12:07 »
Ну, насколько я понимаю, эта "пустышка" делает так, чтобы нажатия указанных клавиш могли быть пойманы функцией GUIGetMsg() для дальнейшей обработки. То есть, мы создаем пустышку, создаем массив чтобы указать на какие клавиши она будет реагировать, а потом добавляем этот массив в обработчик нашего GUI окна, после чего оно уже может реагировать на нажатия Enter

Оффлайн kyi [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #7, Отправлен: Май 16, 2018, 10:18:36 »
создаем массив чтобы указать на какие клавиши она будет реагировать,
Такс...
Тогда еще вопрос, а как понять какой именно массив надо создавать?
В данном случае [1][2], почему не [100][500]?

Русское сообщество AutoIt

Re: Нажатие Enter (не эмуляция)
« Ответ #7 Отправлен: Май 16, 2018, 10:18:36 »

Оффлайн gunter123 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #8, Отправлен: Май 16, 2018, 10:21:49 »
Массив должен быть величиной [n][2], где n - количество установленных клавиш
http://autoit-script.ru/autoit3_docs/functions/GUISetAccelerators.htm

Оффлайн kyi [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #9, Отправлен: Май 16, 2018, 21:13:28 »
Елки-палки, товарищи спасайте, весь мозг сломал, не понимаю я  :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]?

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

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1431
  • Репутация: 212
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Нажатие Enter (не эмуляция)
« Ответ #10, Отправлен: Май 17, 2018, 00:12:19 »
... это именно то, что надо...
Уф, как все сложно :whistle:

Код: AutoIt [Выделить]
#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



Добавлено: Май 17, 2018, 00:32:51
... в голове каша...
Это логично если начинать знакомство с языком сразу с раздела "Функции", а не с Самого Начала.

« Последнее редактирование: Май 17, 2018, 09:14:02 от Alofa »

Оффлайн kyi [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #11, Отправлен: Май 17, 2018, 11:44:33 »
Alofa, ну привели вы пример, спасибо конечно, однако я так и не получил ответы на свои вопросы.
Если вам все понятно, почему бы не объяснить другим?
Немного переделал ваш пример, попробуйте потыкать Enter.
Код: AutoIt [Выделить]
#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 [?]

  • Осваивающий
  • **
  • Сообщений: 109
  • Репутация: 40
  • Пол: Мужской
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #12, Отправлен: Май 17, 2018, 16:25:49 »
Похоже, что в варианте от Alofa GUI окно становится диалоговым и при нажатии Enter нажмется указанная кнопка с параметром $BS_DEFPUSHBUTTON, а при нажатии Esc это окно закроется. Этого достаточно чтобы сделать окошко, похожее на "Выполнить" в Windows. А вот если вам понадобится обрабатывать несколько разных Input`ов, и чтобы на другие клавиши реагировало, то попробуйте этот пример  :think:
(нажмите для показа/скрытия)

Оффлайн Alofa [?]

  • AutoIt Гуру
  • *****
  • Сообщений: 1431
  • Репутация: 212
  • Пол: Мужской
  • Windows 7 /10 [x64]
    • Награды
  • Версия AutoIt: 3.3.12.0
Re: Нажатие Enter (не эмуляция)
« Ответ #13, Отправлен: Май 17, 2018, 16:53:32 »
... не понимаю почему работает ESC
Код: AutoIt [Выделить]
Opt('GUICloseOnESC', 0)


Оффлайн kyi [?]

  • Новичок
  • *
  • Сообщений: 43

  • Автор темы
  • Репутация: 0
    • Награды
  • Версия AutoIt: 3.3.14.0
Re: Нажатие Enter (не эмуляция)
« Ответ #14, Отправлен: Май 17, 2018, 19:08:30 »
gunter123, добрый день!
К сожалению ваш пример не работает, не откликается ни одна из клавиш.

Русское сообщество AutoIt

Re: Нажатие Enter (не эмуляция)
« Ответ #14 Отправлен: Май 17, 2018, 19:08:30 »

 

Похожие темы

  Тема / Автор Ответов Последний ответ
4 Ответов
9904 Просмотров
Последний ответ Декабрь 04, 2009, 09:47:21
от ODIE
5 Ответов
4887 Просмотров
Последний ответ Декабрь 28, 2009, 10:59:29
от Kaster
8 Ответов
9298 Просмотров
Последний ответ Май 01, 2011, 17:17:11
от Yashied
5 Ответов
2508 Просмотров
Последний ответ Июнь 19, 2014, 21:05:48
от mr.Gbabak
4 Ответов
1438 Просмотров
Последний ответ Август 18, 2014, 15:19:28
от Core2Duo76
3 Ответов
2000 Просмотров
Последний ответ Сентябрь 22, 2014, 16:59:54
от inververs
10 Ответов
2390 Просмотров
Последний ответ Ноябрь 15, 2014, 01:52:28
от Jotun
8 Ответов
4961 Просмотров
Последний ответ Май 05, 2015, 13:35:48
от madmasles
0 Ответов
754 Просмотров
Последний ответ Май 04, 2015, 21:51:13
от madmasles
3 Ответов
1383 Просмотров
Последний ответ Октябрь 19, 2015, 20:12:35
от den23rus