Что нового

Оформление окна ввода капчи + отправка по Enter

pad0nak66

Новичок
Сообщения
23
Репутация
2
На данный момент есть такая функция (взятая здесь на форуме и немного переделанная) ...

Код:
Func _Preview()
  Local $CaptchaForm = GUICreate("Captcha", 150, 70, @DesktopWidth-150, @DesktopHeight-70-40, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
  GUISetBkColor(0xFFFFFF)
  $oIEPreview = ObjCreate("Shell.Explorer.2")
  $hIEPreviewCtrl = GUICtrlCreateObj($oIEPreview, 0, 0, 150, 40)
  $hInput = GUICtrlCreateInput('', 5, 45, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_UPPERCASE))
  $hButton = GUICtrlCreateButton("OK", 90, 45, 55, 20)
  $oIEPreview.Navigate('about:blank') ; создаем пустой документ
  $oIEPreview.document.write('<img src="' & @ScriptDir &'\captcha.png' & '" title="капча">') ; помещаем капчу
  $oIEPreview.document.body.style.margin = 0
  $oIEPreview.document.body.scroll = "no"
  GUISetState(@SW_SHOW, $CaptchaForm)
  GUICtrlSetState($hInput, $GUI_FOCUS)
  While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
      Case $hButton
        $sCaptcha = GUICtrlRead($hInput)
        If $sCaptcha <> '' Then
          GUIDelete($CaptchaForm)
          ExitLoop
        EndIf
    EndSwitch
  WEnd
  Return $sCaptcha
EndFunc


Хотелось бы доработать её, но пока не знаю как. Вот что необходимо реализовать:

[list type=decimal]
[*]Ориентация окна по высоте. Чтобы не перекрывало панель задач и было пямо над ним. В данный момент реализована жесткая привязка к нижнему краю экрана.
[*]Хотелось бы видеть чёрную рамку вокруг формы.
[*]Объект IE сделать не утопленным.
[*]Заменить кнопку "Ок" на банальный Enter в Input (поле для ввода капчи)
[*]Автоматическая смена раскладки клавиатуры при вводе на Английский, (но чтобы при закрытии формы раскладка возвращалась в прежнее значение)
[*]А уж совсем было бы прикольно, если бы окно плавно выезжало снизу экрана.
[/list]

Думаю данная функция много кому была бы полезна
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Пока что реализовал только 2 пункта:
  • Заменил кнопку Ок
  • Плавное вылезание снизу
Код:
#include<GUIconstantsex.au3>
#include<ie.au3>
#include<windowsconstants.au3>
#include <EditConstants.au3>
#include<xskinanimate.au3>;Прикрепил библиотеку
#include<WinAPI.au3>
Global $hInput,$CaptchaForm,$TextEdit
_Preview()
Func _Preview()
	HotKeySet("{enter}","__EnterSend");Хоткей на нажатие Enter
	Local $CaptchaForm = GUICreate("Captcha", 150, 70, @DesktopWidth-150, @DesktopHeight-70-40, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    GUISetBkColor(0xFFFFFF)
    $oIEPreview = ObjCreate("Shell.Explorer.2")
    $hIEPreviewCtrl = GUICtrlCreateObj($oIEPreview, 0, 0, 150, 40)
    $hInput = GUICtrlCreateInput('', 5, 45, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_UPPERCASE))
;~     $hButton = GUICtrlCreateButton("OK", 90, 45, 55, 20)
    $oIEPreview.Navigate('about:blank') ; создаем пустой документ
    $oIEPreview.document.write('<img src="' & @ScriptDir &'\captcha.png' & '" title="капча">') ; помещаем капчу
    $oIEPreview.document.body.style.margin = 0
    $oIEPreview.document.body.scroll = "no"
	xskinanimate($CaptchaForm,'',11);замена обычному guisetstate, будет выкатываться снизу
;~     GUISetState(@SW_SHOW, $CaptchaForm)
    GUICtrlSetState($hInput, $GUI_FOCUS)
    While 1
	    Sleep(200)
	    If Not ($TextEdit="") Then
			GUIDelete($CaptchaForm)
			ExitLoop
		EndIf
	  #cs
    $nMsg = GUIGetMsg()
    Switch $nMsg
      Case $hButton
        $sCaptcha = GUICtrlRead($hInput)
        If $sCaptcha <> '' Then
          GUIDelete($CaptchaForm)
          ExitLoop
        EndIf
    EndSwitch
	#ce
    WEnd
    Return $TextEdit
EndFunc
Func __EnterSend()
	Local $Rinput=GUICtrlRead($hInput)
	If Not ($Rinput='') Then
		$TextEdit=$Rinput
	EndIf
EndFunc
Обдумываю рамку на этом примере
И думаю над предпоследним пунктом=)


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

Доделал рамку, но она красная(черная плохо смотрится)
Код:
#include<GUIconstantsex.au3>
#include<ie.au3>
#include<windowsconstants.au3>
#include <EditConstants.au3>
#include<xskinanimate.au3>
#include<WinAPI.au3>
Global $hInput,$CaptchaForm,$TextEdit
MsgBox(0,'Вывод капчи',_Preview())
Func _Preview()
	HotKeySet("{enter}","__EnterSend");Хоткей на нажатие Enter
	Local $CaptchaForm = GUICreate("Captcha", 150, 70, @DesktopWidth-150, @DesktopHeight-70-40, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
    GUISetBkColor(0xFFFFFF)
    $oIEPreview = ObjCreate("Shell.Explorer.2")
    $hIEPreviewCtrl = GUICtrlCreateObj($oIEPreview, 0, 0, 150, 40)
    $hInput = GUICtrlCreateInput('', 5, 45, 80, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_UPPERCASE))
;~     $hButton = GUICtrlCreateButton("OK", 90, 45, 55, 20)
    $oIEPreview.Navigate('about:blank') ; создаем пустой документ
    $oIEPreview.document.write('<img src="' & @ScriptDir &'\captcha.png' & '" title="капча">') ; помещаем капчу
    $oIEPreview.document.body.style.margin = 0
    $oIEPreview.document.body.scroll = "no"
	xskinanimate($CaptchaForm,'',11);замена обычному guisetstate, будет выкатываться снизу
;~     GUISetState(@SW_SHOW, $CaptchaForm)
    GUICtrlSetState($hInput, $GUI_FOCUS)
	Sleep(1500);пауза для анимации окна, чтобы потом его "обрисовать"
	$hDC=_WinAPI_GetDC($CaptchaForm)
	$hBrush = _WinAPI_CreateSolidBrush(0x0000FF);Чтобы исползовать черную рамку замените последние FF на 00(цифры)
    $tRect = DllStructCreate($tagRECT)
    DllStructSetData($tRect, "Left", 0)
    DllStructSetData($tRect, "Top", 0)
    DllStructSetData($tRect, "Right", 150)
    DllStructSetData($tRect, "Bottom", 70)
    $ptrRect = DllStructGetPtr($tRect)
    _WinAPI_FrameRect($hDC, $ptrRect, $hBrush)
    While 1
	    Sleep(200)
	    If Not ($TextEdit="") Then
			GUIDelete($CaptchaForm)
			ExitLoop
		EndIf
	  #cs
    $nMsg = GUIGetMsg()
    Switch $nMsg
      Case $hButton
        $sCaptcha = GUICtrlRead($hInput)
        If $sCaptcha <> '' Then
          GUIDelete($CaptchaForm)
          ExitLoop
        EndIf
    EndSwitch
	#ce
    WEnd
    Return $TextEdit
EndFunc
Func __EnterSend()
	Local $Rinput=GUICtrlRead($hInput)
	If Not ($Rinput='') Then
		$TextEdit=$Rinput
	EndIf
EndFunc
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
MnM, всё работает, но имеется несколько вопросов:
- нет ли другой альтернативы хоткею? А то, вдруг я ещё куда придумаю Enter задействовать вместо этой формы. Хотя можно сделать проверку в функции по фокусу.
- рамка рисуется только после появления окна, оно и понятно, эффекты и всё такое. Вот бы её изначально иметь и жирнее... Кстати, как вариант можно на форму скин повешать (фон из картинки с нарисованной рамкой)
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
нет ли другой альтернативы хоткею
Совсем недавно занимался хуками в системе=) можно через них отлавливать(Это только вариант моего мнения :smile:, и вряд ли может иметь место быть)

На счет скина, не знаю, можно конечно сложить стиль $WS_BORDER с $WS_POPUP - но это тоже тонкая линия.
Есть безумный план на счет скина - нарисовать его в Skin Builder
, отрисовать там рамочки.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
pad0nak66 [?]
Вот что необходимо реализовать:

  • Ориентация окна по высоте. Чтобы не перекрывало панель задач и было пямо над ним. В данный момент реализована жесткая привязка к нижнему краю экрана.
  • Хотелось бы видеть чёрную рамку вокруг формы.
  • Объект IE сделать не утопленным.
  • Заменить кнопку "Ок" на банальный Enter в Input (поле для ввода капчи)
  • Автоматическая смена раскладки клавиатуры при вводе на Английский, (но чтобы при закрытии формы раскладка возвращалась в прежнее значение)
  • А уж совсем было бы прикольно, если бы окно плавно выезжало снизу экрана.

Как то так:

Код:
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <EditConstants.au3>
#include <WinAPIEx.au3>
#include <GDIPlus.au3>

_Preview(@DesktopDir & '\captcha.png')

Func _Preview($sCaptchaFile)
	Local $sCaptcha = ''
	
	Local Const $SPI_GETWORKAREA  = 0x0030
	Local $stRect = DllStructCreate($tagRect)
	_WinAPI_SystemParametersInfo($SPI_GETWORKAREA, 0, DllStructGetPtr($stRect))
	
	Local $iScreen_Right = DllStructGetData($stRect, 'Right')
	Local $iScreen_Bottom = DllStructGetData($stRect, 'Bottom')
	Local $iGUI_Width = 150
	Local $iGUI_Height = 70
	
	Local $hForm = GUICreate("Captcha", $iGUI_Width, $iGUI_Height, $iScreen_Right - $iGUI_Width - 2, $iScreen_Bottom, $WS_POPUP, BitOR($WS_EX_TOOLWINDOW, $WS_EX_TOPMOST))
	GUISetBkColor(0xFFFFFF)
	
	$iT = GUICtrlCreateLabel('', 0, 0, $iGUI_Width, 3)
	$iL = GUICtrlCreateLabel('', 0, 0, 3, $iGUI_Height)
	$iB = GUICtrlCreateLabel('', 0, $iGUI_Height - 3, $iGUI_Width, 3)
	$iR = GUICtrlCreateLabel('', $iGUI_Width - 3, 0, 3, $iGUI_Height)
	
	GUISetState(@SW_SHOW, $hForm)
	
	_GDIPlus_Startup()
	Local $hImage = _GDIPlus_ImageLoadFromFile($sCaptchaFile)
	Local $hGraphic = _GDIPlus_GraphicsCreateFromHWND($hForm)
	
	For $i = $iScreen_Bottom To ($iScreen_Bottom - $iGUI_Height - 2) Step -4
		WinMove($hForm, '', Default, $i)
		
		_GDIPlus_GraphicsDrawImage($hGraphic, $hImage, 0, 0)
		
		GUICtrlSetBkColor($iT, 0x0)
		GUICtrlSetBkColor($iL, 0x0)
		GUICtrlSetBkColor($iB, 0x0)
		GUICtrlSetBkColor($iR, 0x0)
		
		Sleep(10)
	Next
	
	WinMove($hForm, '', Default, $iScreen_Bottom - $iGUI_Height - 2)
	
	$hInput = GUICtrlCreateInput('', 5, 45, $iGUI_Width - 10, 20, BitOR($GUI_SS_DEFAULT_INPUT, $ES_CENTER, $ES_UPPERCASE))
	GUICtrlSetState($hInput, $GUI_FOCUS)
	
	Local $iDummy = GUICtrlCreateDummy()
	Local $aAccellKeys[1][2] = [['{ENTER}', $iDummy]]
	GUISetAccelerators($aAccellKeys, $hForm)
	GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
	
	While 1
		$nMsg = GUIGetMsg()
		
		Switch $nMsg
			Case $GUI_EVENT_CLOSE
				ExitLoop
			Case $iDummy
				$sCaptcha = GUICtrlRead($hInput)
				
				If $sCaptcha <> '' Then
					ExitLoop
				EndIf
		EndSwitch
	WEnd
	
	_GDIPlus_GraphicsDispose($hGraphic)
	_GDIPlus_ImageDispose($hImage)
	_GDIPlus_Shutdown()
	
	GUIDelete($hForm)
	Return $sCaptcha
EndFunc

Func WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0xFFFF)
	Local $hCtrl = $lParam
	
	Switch $nNotifyCode
		Case $EN_UPDATE
			If _WinAPI_GetKeyboardLayout($hCtrl) <> 67699721 Then
				_WinAPI_SetKeyboardLayout($hCtrl, 0x0409)
				GUICtrlSetData($nID, StringRegExpReplace(GUICtrlRead($nID), '[^\w]', ''))
			EndIf
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc
 

MnM

Post-Hardcore
Сообщения
679
Репутация
90
Эхх, я про Dummy забыл, что его можно использовать=)
 
Автор
P

pad0nak66

Новичок
Сообщения
23
Репутация
2
MnM, CreatoR, благодарю за неоценимую помощь!
 
Верх