Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Передалать стандартный "InputBox" в анологичное "GUI-окно" (http://forum.oszone.net/showthread.php?t=136775)

sashadeg 04-04-2009 13:33 1083895

Передалать стандартный "InputBox" в анологичное "GUI-окно"
 
В стандартное окно "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)


Creat0R 04-04-2009 14:07 1083920

См. Custom_InputBox(), вставить там картинку, думаю будет несложно? :)

sashadeg 04-04-2009 14:18 1083927

Creat0R, там столько МНОГО всего!!!! И я по английски не понимаю :( Можешь дать конкретный код?
В окошке примерно вот что:
1. Немного текста (любого :) )
2. Полоска ввода текста ( типа как в InputBox)
3. Кнопка "Oк"
4. После нажатия "Ок" переменной $text присваивается текс который ввели в окошечке :)

Простите, но я нубик в AutoIt :)

Я скачал пример из ссылки которую ты дал, но он ошибку выкидывает на 5 строке :(

proxy 04-04-2009 14:42 1083947

ручной пример:
Код:

#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 1083985

Это всё конечно хорошо... но вот такая команда у меня не работает: Send ($text)

proxy 04-04-2009 20:10 1084181

Цитата:

Это всё конечно хорошо... но вот такая команда у меня не работает: 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 1084222

А что Send($text) вообще ни как??? Просто мне это надо для Полноэкранного приложения... А там ID то не узнать... Да я и с этой командой привык работать...

proxy 04-04-2009 21:14 1084234

Цитата:

Полноэкранного приложения
если там обычное окно, от можно и у полноэкранного ))

Цитата:

Цитата sashadeg
А что 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 1084257

Спасибо тебе за всё... но ты пишешь такие коды 0_о я же писал что я нубик :) Можешь конкретно написать код чтобы был точный прототип стандартного INPUTBOX'a ??? Просто у меня прога полностью готова, я хотел бы вставить пару картинок... А вы мне тут ТАКИЕ коды пишите :)

proxy 04-04-2009 22:50 1084305

Код:

#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


proxy 04-04-2009 23:23 1084325

Вставте в ваш код скрипта регион:
Код:

#region: - _MsgBox
  ...
#endregion

Вызов функции в примерах..)

Enjoy =)

Creat0R 04-04-2009 23:42 1084343

Цитата:

Цитата sashadeg
я по английски не понимаю »

В кодинге без этого почти невозможно :(.

Цитата:

Цитата sashadeg
он ошибку выкидывает на 5 строке »

Нужно в начало добавить это:

Код:

#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>


beve 04-04-2009 23:56 1084359

Цитата:

Цитата sashadeg
Можешь конкретно написать код чтобы был точный прототип стандартного 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 1084709

Спасибо всем ответившим!!! beve, твоё сообщение - ТО ЧТО доХтор ПРОПИСАЛ :)

У меня ещё вопросик, а можно ещё несколько полосочек для ввода текста вставить в ОДНО окно? Допустим на примере кода beve?

beve 05-04-2009 15:38 1084739

Цитата:

Цитата sashadeg
можно ещё несколько полосочек для ввода текста вставить в ОДНО окно? »

Код:

#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/...ormdesign.html можеш загрузить программу KODA FormDesigner, написанную на автоите, и с её помощью нарисовать такое Gui-окно с инпутами кнопками, как тебе подходит, а названия переменных, можеш сделать хоть и как в примере выше...В программе есть Русский язык, на который можно переключится в настройках программы.

sashadeg 05-04-2009 16:47 1084781

beve, ты просто... ты... ты просто ЗОЛОТО!!!!

Я удивляюсь, как у тебя благодарностей меньше чем сообщений :) спасибо, всё просто и понтно :)


Время: 00:58.

Время: 00:58.
© OSzone.net 2001-