Показать полную графическую версию : [решено] Передалать стандартный "InputBox" в анологичное "GUI-окно"
sashadeg
04-04-2009, 13:33
В стандартное окно "InputBox" нельзя вставить картинку...
Помогите пожалуйтста переделать обычный "InputBox" в анологичное "GUI-окно"...
На примере вот этого кода... Как вставить картинку я разобрался а как вставить полоску ввода информании понять не могу :)
$1 = InputBox ("1234", "")
If @Error = 1 Then
MsgBox(4096, "1234", "OK. Bye!",1)
Exit
EndIf
; функции
run("notepad.exe")
Sleep(1000)
Send($1)
См. Custom_InputBox() (http://www.autoitscript.com/forum/index.php?showtopic=41403), вставить там картинку, думаю будет несложно? :)
sashadeg
04-04-2009, 14:18
Creat0R, там столько МНОГО всего!!!! И я по английски не понимаю :( Можешь дать конкретный код?
В окошке примерно вот что:
1. Немного текста (любого :) )
2. Полоска ввода текста ( типа как в InputBox)
3. Кнопка "Oк"
4. После нажатия "Ок" переменной $text присваивается текс который ввели в окошечке :)
Простите, но я нубик в AutoIt :)
Я скачал пример из ссылки которую ты дал, но он ошибку выкидывает на 5 строке :(
ручной пример:
#region: - Option
Opt('GUIOnEventMode', 1)
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
#region: - Include
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#endregion
#region: - Win Msg Global
Global $hMsgWin
;~ Title, Width, Height, X, Y, Style, ExStyle
Global $sMsgWinTitle = '1234'
Global $iMsgWinWidth = 200
Global $iMsgWinHeight = 93
Global $iMsgWinX = -1
Global $iMsgWinY = -1
Global $iMsgWinStyle = $WS_CAPTION+$WS_SYSMENU
Global $iMsgWinExStyle = -1
;~ Settings
Global $fMsgWinOnTop = 0
;~ GUI Ctrl
Global $hsWinMsgText
#endregion
#region: - Win Msg Function
Func _WinMsg_Create()
$hMsgWin = GUICreate($sMsgWinTitle, $iMsgWinWidth, $iMsgWinHeight, $iMsgWinX, $iMsgWinY, $iMsgWinStyle, $iMsgWinExStyle)
GUISetIcon('shell32.dll', -10)
GUISetOnEvent($GUI_EVENT_CLOSE, '_Pro_Exit')
GUICtrlCreateGroup(' Введите текст: ', 5, 5, $iMsgWinWidth-10, $iMsgWinHeight-10)
$hsWinMsgText = GUICtrlCreateInput('', 15, 25, $iMsgWinWidth-30, 20)
GUICtrlCreateButton('OK', 14, 53, ($iMsgWinWidth-28-2)/2, 24)
GUICtrlSetOnEvent(-1, '_WinMsg_OK')
GUICtrlCreateButton('Отмена', 14+($iMsgWinWidth-28-2)/2+2, 53, ($iMsgWinWidth-28-2)/2, 24)
GUICtrlSetOnEvent(-1, '_Pro_Exit')
If $fMsgWinOnTop Then WinSetOnTop($hMsgWin, '', 1)
GUISetState(@SW_SHOW, $hMsgWin)
EndFunc
Func _WinMsg_Close()
;~ GUIDelete($hMsgWin)
_Pro_Exit()
EndFunc
Func _WinMsg_OK()
Local $sText = GUICtrlRead($hsWinMsgText)
If StringStripWS($sText, 8) == '' Then
MsgBox(48, 'Ошибка!', 'Пожалуйста, введите текст')
GUICtrlSetData($hsWinMsgText, '')
GUICtrlSetState($hsWinMsgText, $GUI_FOCUS)
Else
;~ MsgBox(64, 'OK', 'Отлично')
_PutTextToNotepad($sText)
_WinMsg_Close()
EndIf
EndFunc
#endregion
#region: - After creating all GUI
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
_WinMsg_Create()
#endregion
#region: - Sleep, Exit
While 1
Sleep(10)
WEnd
Func _Pro_Exit()
Exit
EndFunc
#endregion
Func _PutTextToNotepad($sText)
Local $iPid, $iHwd
$iPid = Run('notepad.exe')
While 1
$iHwd = _ProcessGetWindow($iPid)
If IsHWnd($iHwd) Then ExitLoop
WEnd
WinWait($iHwd)
ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sText)
EndFunc
Func _ProcessGetWindow($iPID, $iRet=1)
Local $aWinList = WinList()
Local $aRet[2]
If IsString($iPID) Then $iPID = ProcessExists($iPID)
For $i = 1 To UBound($aWinList)-1
If WinGetProcess($aWinList[$i][1]) = $iPID Then
$aRet[0] = $aWinList[$i][0] ;Title
$aRet[1] = $aWinList[$i][1] ;WinHandle
If $iRet = 0 Then Return $aRet[0]
If $iRet = 1 Then Return $aRet[1]
Return $aRet
EndIf
Next
Return SetError(1, 0, $aRet)
EndFunc
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
Return $GUI_RUNDEFMSG
EndFunc
sashadeg
04-04-2009, 15:37
Это всё конечно хорошо... но вот такая команда у меня не работает: Send ($text)
Это всё конечно хорошо... но вот такая команда у меня не работает: Send ($text)
попробуйте ControlSetText($iHwd, '', '[CLASS:Edit; INSTANCE:1]', $sText)
- точно не промахнетесь с окном / полем ввода
- текст вставляется почти мнгновенно )
$iHwd - хэндл (указатель) окно / либо текст заголовка окна
Далее указывается текст, который присутствует в окне. Если $iHwd это хэндл окна, то с текстом можно не заморачиваться
[CLASS:Edit; INSTANCE:1] - id элемента, которому высылается текст. Можно узнать с помощью "..<папка установки>\AutoIt3\Au3Info.exe". Строчки Advanced (Class) или ClassnameNN
$sText - высылаемый текст элементу
sashadeg
04-04-2009, 20:58
А что Send($text) вообще ни как??? Просто мне это надо для Полноэкранного приложения... А там ID то не узнать... Да я и с этой командой привык работать...
Полноэкранного приложения
если там обычное окно, от можно и у полноэкранного ))
А что Send($text) вообще ни как??? »
почему же - можно. Проверьте, что высылаите имеено текст в этой переменной, а не ControlId элемента. Т.е.:
;~ Если запись такая:
$hsWinMsgText = GUICtrlCreateInput('', 15, 25, $iMsgWinWidth-30, 20)
;~ То высылать нужно так:
Send(GUICtrlRead($hsWinMsgText))
+ есть полезности:
Opt('SendKeyDelay', 1)
и флаги в Send:
Send ( "keys", [flag] )
flag: (опциональный) Режим обработки "клавиш клавиатуры":
flag = 0 (стандартный), текст содержит специальные символы (например +, или ! указывающие на совместное нажатие клавиш SHIFT, или ALT), которые следует симулировать.
flag = 1, выслать "неразобранный" набор нажатий.
sashadeg
04-04-2009, 21:40
Спасибо тебе за всё... но ты пишешь такие коды 0_о я же писал что я нубик :) Можешь конкретно написать код чтобы был точный прототип стандартного INPUTBOX'a ??? Просто у меня прога полностью готова, я хотел бы вставить пару картинок... А вы мне тут ТАКИЕ коды пишите :)
#region: - Option
Opt('MustDeclareVars', 1)
Opt('TrayIconDebug', 1)
Opt('TrayIconHide', 0)
#endregion
#region: - Include
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#endregion
Local $sInputText
$sInputText = _MsgBox('Название окна #1 ', ' Введите текст: ', 200, 93, -1, -1, -1)
Switch @error
Case -1
MsgBox(48, 'Выход #1 ', 'Выход без ввода текст' & @CRLF & 'Код выхода: ' & @error)
Case 0
MsgBox(64, 'Введенный текст #1 ', $sInputText)
EndSwitch
;~ Или так: окно поверх всех
$sInputText = _MsgBox('Название окна #2 ', ' Введите текст: ', 200, 93, -1, -1, -1, -1, 1)
If @error == -1 Then
MsgBox(48, 'Выход #2 ', 'Выход без ввода текст' & @CRLF & 'Код выхода: ' & @error)
Else
MsgBox(64, 'Введенный текст #2 ', $sInputText)
EndIf
;~ Или так: окно поверх всех + другая иконка окна
$sInputText = _MsgBox('Название окна #3 ', ' Введите текст: ', 200, 93, -1, -1, -1, -1, 1, -1, -45)
If @error == 0 Then MsgBox(64, 'Введенный текст #3 ', $sInputText)
#region: - _MsgBox
; #FUNCTION# ==================================================================================================== ================
; Name...........: _MsgBox
; Description ...: Окно типа MsgBox со строкой ввода текса и кнопками Ok, Отмена
; Syntax.........: _MsgBox($sTitle, $sText, $iWidth, $iHeight, $iX, $iY [, $iStyle=13107200] [, $iExStyle=-1] [, $fOnTop=0] [, $sIconPath='shell32.dll'] [, $iIconId=-1])
; Parameters ....: $sTitle - Название кона
;~ $sText - Текст сообщения
;~ $iWidth - Ширна окна
;~ $iHeight - Высота окна
;~ $iX - Позиция окна по Х
;~ $iY - Позиция окна по У
;~ $iStyle - Стиль окна
;~ $iExStyle - Расширенный стиль окна
;~ $fOnTop - Установка окна поверех всех окон
;~ $sIconPath - Путь к файлу/dll иконки окна
;~ $iIconId - Id иконки
; Return values .: Success - Введенный текст. @error = 0
; Failure - -1 закрытие окна без ввода текста. @error = -1
; Author ........: `p r o x y (icq 729406)
; ==================================================================================================== ===========================
Func _MsgBox($sTitle, $sText, $iWidth, $iHeight, $iX, $iY, $iStyle=13107200, $iExStyle=-1, $fOnTop=0, $sIconPath='shell32.dll', $iIconId=-222)
Local $fGUIOnEventMode = Opt('GUIOnEventMode')
Opt('GUIOnEventMode', 0)
If $iStyle == -1 Then $iStyle = 13107200
Local $hMsgBox = GUICreate($sTitle, $iWidth, $iHeight, $iX, $iY, $iStyle, $iExStyle)
If $sIconPath = -1 Then $sIconPath = 'shell32.dll'
GUISetIcon($sIconPath, $iIconId)
GUICtrlCreateGroup($sText, 5, 5, $iWidth-10, $iHeight-10)
Local $hsMsgBoxText = GUICtrlCreateInput('', 15, 25, $iWidth-30, 20)
Local $hMsgBoxOK = GUICtrlCreateButton('OK', 14, 53, ($iWidth-28-2)/2, 24)
Local $hMsgBoxCancel = GUICtrlCreateButton('Отмена', 14+($iWidth-28-2)/2+2, 53, ($iWidth-28-2)/2, 24)
If $fOnTop Then WinSetOnTop($hMsgBox, '', 1)
GUIRegisterMsg($WM_NCHITTEST, 'WM_NCHITTEST')
GUISetState(@SW_SHOW, $hMsgBox)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
GUIDelete($hMsgBox)
Opt('GUIOnEventMode', $fGUIOnEventMode)
GUIRegisterMsg($WM_NCHITTEST, '')
Return SetError(-1)
Case $hMsgBoxCancel
GUIDelete($hMsgBox)
Opt('GUIOnEventMode', $fGUIOnEventMode)
GUIRegisterMsg($WM_NCHITTEST, '')
Return SetError(-1)
Case $hMsgBoxOK
Local $sMsgBoxText = GUICtrlRead($hsMsgBoxText)
If StringStripWS($sMsgBoxText, 8) == '' Then
MsgBox(48, 'Ошибка!', 'Пожалуйста, введите текст')
GUICtrlSetData($hsMsgBoxText, '')
GUICtrlSetState($hsMsgBoxText, $GUI_FOCUS)
Else
GUIDelete($hMsgBox)
SetError(0)
Opt('GUIOnEventMode', $fGUIOnEventMode)
GUIRegisterMsg($WM_NCHITTEST, '')
Return $sMsgBoxText
EndIf
EndSwitch
WEnd
EndFunc
Func WM_NCHITTEST($hWnd, $Msg, $wParam, $lParam)
Local $iProc = DllCall('user32.dll', 'int', 'DefWindowProc', 'hwnd', $hWnd, 'int', $Msg, 'wparam', $wParam, 'lparam', $lParam)
If $iProc[0] = $HTCLIENT Then Return $HTCAPTION
Return $GUI_RUNDEFMSG
EndFunc;==>_MsgBox
#endregion
Вставте в ваш код скрипта регион:
#region: - _MsgBox
...
#endregion
Вызов функции в примерах..)
Enjoy =)
я по английски не понимаю »
В кодинге без этого почти невозможно :(.
он ошибку выкидывает на 5 строке »
Нужно в начало добавить это:
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
Можешь конкретно написать код чтобы был точный прототип стандартного INPUTBOX'a ??? »
Может тебе нужно просто вот это?:#include <GUIConstants.au3>
$hForm = GUICreate("Test", 221, 170)
$sInput=GUICtrlCreateInput("", 8, 100, 201, 21)
GUICtrlCreateLabel("Введите какой-то текст:", 8, 16, 127, 17)
$Ok_Button = GUICtrlCreateButton("Ок", 8, 135, 81, 25, 0)
$Cancel_Button = GUICtrlCreateButton("Отмена", 128, 135, 81, 25, 0)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
GUIDelete($hForm) ;удаляем gui, так как уже не надобно
Exitloop ;выход только из текущего цикла While 1 ---- Wend а не закрытие всего нашего скрипта
Case $Cancel_Button
GUIDelete($hForm) ;удаляем gui, так как уже не надобно
MsgBox(0,"Внимание","Была нажата кнопка отмена поэтому будет выход из цикла")
ExitLoop
Case $Ok_Button
$sText = GUICtrlRead($sInput)
if $sText=="" then
MsgBox(0,'Внимание','Вы не ввели никакого текста')
else
GUIDelete($hForm) ;удаляем gui, так как уже не надобно
MsgBox(0,"",$sText) ;можно обойтись без этого сообщения, оно нужно лишь чтобы показать что в переменной $sText уже хранится текст введенный ранее в инпут
Exitloop
endif
EndSwitch
WEnd
;дальше может быть любой набор команд...
Сомневаюсь, ибо это просто начало, на autoite, но всетаки...
sashadeg
05-04-2009, 14:49
Спасибо всем ответившим!!! beve, твоё сообщение - ТО ЧТО доХтор ПРОПИСАЛ :)
У меня ещё вопросик, а можно ещё несколько полосочек для ввода текста вставить в ОДНО окно? Допустим на примере кода beve?
можно ещё несколько полосочек для ввода текста вставить в ОДНО окно? »
#include <GUIConstantsEx.au3>
$GUI = GUICreate("AutoIt Example", 300, 160)
GUICtrlCreateLabel("Введите нужный текст во все поля:", 20, 10, 260, 20)
$Input_1 = GUICtrlCreateInput("", 20, 40, 260, 20)
$Input_2 = GUICtrlCreateInput("", 20, 70, 260, 20)
$Input_3 = GUICtrlCreateInput("", 20, 100, 260, 20)
$Ok_Button = GUICtrlCreateButton("OK", 40, 130, 60, 20)
$Cancel_Button = GUICtrlCreateButton("Отмена", 200, 130, 60, 20)
GUISetState(@SW_SHOW, $GUI)
While 1
Switch GUIGetMsg()
Case $GUI_EVENT_CLOSE
Exit ;тут выход вобще из скрыпта при закрытии Gui окна
Case $Cancel_Button
GUIDelete($GUI) ;удаляем gui, так как уже не надобно
MsgBox(0,"Внимание","Была нажата кнопка Отмена поэтому будет выход из цикла")
ExitLoop
Case $Ok_Button
$sText1 = GUICtrlRead($Input_1)
$sText2 = GUICtrlRead($Input_2)
$sText3 = GUICtrlRead($Input_3)
if $sText1=="" Or $sText2=="" Or $sText3=="" then
MsgBox(0,'Внимание','Вы не ввели текст во всех полях')
else
GUIDelete($GUI) ;удаляем gui, так как уже не надобно
MsgBox(0,"Результат",$sText1 & @CRLF &$sText2 & @CRLF & $sText3) ;можно обойтись без этого сообщения, оно нужно лишь чтобы показать что в переменных $sText1, $sText2, $sText3 уже хранится текст введенный ранее в инпуты
Exitloop
endif
EndSwitch
WEnd
;дальше может быть любой набор команд...
P.S. Вот по этой ссылке http://www.autoitscript.com/fileman/users/lookfar/formdesign.html можеш загрузить программу KODA FormDesigner, написанную на автоите, и с её помощью нарисовать такое Gui-окно с инпутами кнопками, как тебе подходит, а названия переменных, можеш сделать хоть и как в примере выше...В программе есть Русский язык, на который можно переключится в настройках программы.
sashadeg
05-04-2009, 16:47
beve, ты просто... ты... ты просто ЗОЛОТО!!!!
Я удивляюсь, как у тебя благодарностей меньше чем сообщений :) спасибо, всё просто и понтно :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.