Что нового

[Элементы GUI] Поле для ввода пароля на несколько значений этого пароля.

gora

Знающий
Сообщения
315
Репутация
19
Есть окно в котором есть поле для ввода пароля (GuiCtrlCreateInput). Есть чекбокс для того, чтобы можно было не показывать пароль. Введенный пароль сохраняется в соответствующей строке ини файла.
При этом значение пароля (сохраняемое и показываемое в поле ввода) только одно. Все это есть и работает.
Можно ли сделать аналогичное для нескольких (2...5) значений пароля? Т.е., пользователь может водить до пяти разных паролей, они будут сохраняться и выбирать он их сможет из выпадающего списка или непосредственным вводом нового пароля. При этом возможность скрывать пароль нужно сохранить.
Пять отдельных полей ввода конечно же меня не устроят, может есть какой-то более компактный вариант для этого?
Спасибо.
 

AZJIO

Меценат
Меценат
Сообщения
2,879
Репутация
1,194
Использовать GUICtrlCreateCombo. При переключении скрыть/показать перезаполнять Combo соответствующими комбинациями (связь спаролем по индексу). GuiCtrlCreateInput придётся оставить для ввода пароля вручную, так как в UDF я не нашёл, чтобы Combo поддерживал стиль PASSWORD. Можно ещё попытаться получить дескриптор поля Edit от Combo и вместо него вставить туда GuiCtrlCreateInput и пытаться при выборе вставлять данные, но это мысли вслух.
 

running-frag

why me?
Сообщения
441
Репутация
60
Представим что логин один. Представим что на один логин допустимо 5 паролей. Выглядит это допустим так.
Код:
Local $_user[10][10]

$_user[1][1] = "user1" 	; login

$_user[2][1] = "pass1"	; passwords
$_user[2][2] = "pass2"
$_user[2][3] = "pass3"
$_user[2][4] = "pass4"
$_user[2][5] = "pass5"


$_user[3][1] = "description1"
$_user[3][2] = "с бухого дела"
$_user[3][3] = "trial"
...


Всё это дело лежит в ini файле само собой (либо где то ещё).

Можно использывать GUICtrlCreateCombo(). При чём отображать в нём, в виде... (код ниже). При чём звёздочки это наши "пароли".
Код:
1. description1 ****
2. с бухого дела ****
3. trial ****
...

Таким образом. Когда у нас "галочка" включена "показать пароль" (символами). Мы затираем весь комбобокс и перезаписует всё тоже только пароли "чистым". Если галочки нет - снова затираем и перезаписуем туда уже вместо "чистого пароля" - звёзды. При этом контрольное имя пароля (name1) не меняется, а только пароль меняется на звёздочки (путём создания отдельной строки для каждого пароля). name1 нужен хоть как то распозновать эти пароли. А то же получим список из "одних звёздочек". :smile:

Так же можно использывать ListBox. И там даже проще. Можно сразу сделать ссылки на функции. Т.е. создаём строку - "user - description1 - ****" для каждого пароля и вписуем туда. После чего по клику "выполняется функция логина", с учётом на что клацнули. Схема как менять звёзды на пароль такая же как и выше описание для ComboBox.




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

AZJIO [?]
GuiCtrlCreateInput придётся оставить для ввода пароля вручную
Можно ещё вывернутся. Сделать через WM_COMMAND () подсветку\выбор на input.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
AZJIO [?]
Использовать GUICtrlCreateCombo. При переключении скрыть/показать перезаполнять Combo соответствующими комбинациями (связь спаролем по индексу). GuiCtrlCreateInput придётся оставить для ввода пароля вручную, так как в UDF я не нашёл, чтобы Combo поддерживал стиль PASSWORD.
А если без стиля PASSWORD, то разве можно осуществлять ввод в GUICtrlCreateCombo?
Про два элемента GUICtrlCreateCombo и GuiCtrlCreateInput я думал, но этот вариант мне не нравится:
1 Два элемента вместо одного.
2 Будет путаница. Например я ввожу пароль в GuiCtrlCreateInput, он должен сразу попасть в список GUICtrlCreateCombo. Затем я просмотрел список в GUICtrlCreateCombo и выбрал другой пароль. Возникает вопрос, какой же из этих двух паролей должен применится при шифровании? Из поля ввода, или из списка?
running-frag [?]
Представим что логин один. Представим что на один логин допустимо 5 паролей.
Нет ни каких логинов, есть только пароли. Они будут использоваться для распаковки\упаковки архивов. И нет ни каких описаний к паролям, они не нужны.
running-frag [?]
Так же можно использывать ListBox. И там даже проще.
Этот список займет сразу 5 строк? В него непосредственно можно будет вводить пароль?
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
он должен сразу попасть в список GUICtrlCreateCombo
При каждом введённом символе вновь образованная строка заносится в список? Или есть какой-то критерий завершения ввода?

Всё-таки не пойму сути...
Выбираем из списка строку (например, "Пароль№1"). Эта строка подставляется в поле ввода пароля и выгладит, как "********". В чём смысл?
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
InnI [?]
есть какой-то критерий завершения ввода?
Нажатие кнопки ОК.InnI [?]
Всё-таки не пойму сути...
Выбираем из списка строку (например, "Пароль№1"). Эта строка подставляется в поле ввода пароля и выгладит, как "********". В чём смысл?
Я сам пока не представляю как будет выглядеть связка двух элементов GUICtrlCreateCombo и GuiCtrlCreateInput и написал, что мне это не нравится.
А смысл всего действа описан в первом посте.
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
Вот так может выглядеть.
Код:
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>

$Gui = GUICreate("Введите пароль", 240, 100)
$Input = GUICtrlCreateInput("", 10, 10, 220, 21, $ES_PASSWORD)
$Combo = GUICtrlCreateCombo("", 10, 10, 220, 20)
GUICtrlSetData($Combo, "password|пароль|12345|qwerty")
$Checkbox = GUICtrlCreateCheckbox("Показать пароль", 10, 40)
$Button = GUICtrlCreateButton("ОК", 160, 70, 70)
GUISetState()
GUICtrlSetState($Combo, $GUI_HIDE)

Do
  Switch GUIGetMsg()
    Case $Checkbox
      If BitAnd(GUICtrlRead($Checkbox), $GUI_CHECKED) Then
        $psw = GUICtrlRead($Input)
        GUICtrlSetState($Input, $GUI_HIDE)
        GUICtrlSetState($Combo, $GUI_SHOW)
        If $psw <> "" Then GUICtrlSetData($Combo, $psw, $psw)
      Else
        $psw = GUICtrlRead($Combo)
        GUICtrlSetState($Combo, $GUI_HIDE)
        GUICtrlSetState($Input, $GUI_SHOW)
        GUICtrlSetData($Input, $psw)
      EndIf
    Case $Button
      If BitAnd(GUICtrlRead($Checkbox), $GUI_CHECKED) Then
        $psw = GUICtrlRead($Combo)
        MsgBox(0, "", "Что-то делаем с паролем: " & $psw)
      Else
        $psw = GUICtrlRead($Input)
        MsgBox(0, "", "Что-то делаем с паролем: " & $psw)
      EndIf
    Case $GUI_EVENT_CLOSE
      Exit
  EndSwitch
Until 0
 

running-frag

why me?
Сообщения
441
Репутация
60
OffTopic:
Выглядит не так страшно как описание с первого поста. :blink:
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Как вам такой вариант:

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

Global $iPass_Combo_Edit_Changed = 0
Global $iPass_Combo_Sel_Changed = 0
Global $iShow_Password = 0
Global $iPasswords_Limit = 5
Global $sBuffer = ''
Global $aBuffer[1]

Global $sDefault_Pass_List = 'password|пароль|12345|qwerty'
Global $sDefault_Password = '12345'

$hGUI = GUICreate('Password ComboBox', 240, 100)

$iPass_Combo = GUICtrlCreateCombo('', 10, 10, 220, 50)
$hPass_Combo = GUICtrlGetHandle($iPass_Combo)

$aPassword_List = StringSplit($sDefault_Pass_List, '|')

For $i = 1 To $aPassword_List[0]
	_Combo_Add_Password($aPassword_List[$i])
Next

_GUICtrlComboBox_SetEditText($iPass_Combo, StringRegExpReplace($sDefault_Password, '.', '*'))
$sBuffer = $sDefault_Password

$iShowPass_CB = GUICtrlCreateCheckbox('Show passwords', 10, 40)
$iAddPass_Bttn = GUICtrlCreateButton('OK', 160, 70, 70, 20, $BS_DEFPUSHBUTTON)

GUIRegisterMsg($WM_COMMAND, 'WM_COMMAND')
GUISetState(@SW_SHOW, $hGUI)

While 1
	Switch GUIGetMsg()
		Case $GUI_EVENT_CLOSE
			Exit
		Case $iShowPass_CB
			_Combo_Toggle_Password()
		Case $iAddPass_Bttn
			_Combo_Add_Password()
	EndSwitch
	
	_Combo_Edit_Changed_Check()
	_Combo_Sel_Changed_Check()
WEnd

Func _Combo_Toggle_Password()
	$iPass_Combo_Edit_Changed = 1
	$iPass_Combo_Sel_Changed = 1
	
	$iShow_Password = BitAND(GUICtrlRead($iShowPass_CB), $GUI_CHECKED)
	$iCount = _GUICtrlComboBox_GetCount($iPass_Combo)
	
	$sData = ''
	$sSel_Item = $sBuffer
	
	For $i = 0 To $iCount-1
		$sIndex = ''
		_GUICtrlComboBoxEx_GetItemText($iPass_Combo, $i, $sIndex)
		$sIndex = Number(StringLeft($sIndex, 1))
		
		If $iShow_Password Then
			$sData &= $i + 1 & '. ' & $aBuffer[$sIndex] & '|'
		Else
			$sData &= $i + 1 & '. ' & StringRegExpReplace($aBuffer[$sIndex], '.', '*') & '|'
		EndIf
	Next
	
	GUICtrlSetData($iPass_Combo, '')
	GUICtrlSetData($iPass_Combo, $sData)
	
	If Not $iShow_Password Then
		$sSel_Item = StringRegExpReplace($sBuffer, '.', '*')
	EndIf
	
	_GUICtrlComboBox_SetEditText($iPass_Combo, $sSel_Item)
	
	$iPass_Combo_Edit_Changed = 0
	$iPass_Combo_Sel_Changed = 0
EndFunc

Func _Combo_Add_Password($sBuff = '')
	If _GUICtrlComboBox_GetCount($iPass_Combo) = $iPasswords_Limit Then
		MsgBox(48, 'Attention', StringFormat('Passwords limit (%i) is reached.', $iPasswords_Limit), 0, $hGUI)
		Return
	EndIf
	
	$iPass_Combo_Edit_Changed = 1
	$iPass_Combo_Sel_Changed = 1
	
	If $sBuff <> '' Then $sBuffer = $sBuff
	
	$aBuffer[0] += 1
	ReDim $aBuffer[$aBuffer[0]+1]
	$aBuffer[$aBuffer[0]] = $sBuffer
	
	If $iShow_Password Then
		GUICtrlSetData($iPass_Combo, $aBuffer[0] & '. ' & $sBuffer)
	Else
		GUICtrlSetData($iPass_Combo, $aBuffer[0] & '. ' & StringRegExpReplace($sBuffer, '.', '*'))
	EndIf
	
	_GUICtrlComboBox_SetEditText($iPass_Combo, '')
	GUICtrlSetState($iPass_Combo, $GUI_FOCUS)
	
	$sBuffer = ''
	
	$iPass_Combo_Edit_Changed = 0
	$iPass_Combo_Sel_Changed = 0
EndFunc

Func _Combo_Edit_Changed_Check()
	If $iPass_Combo_Edit_Changed = 0 Then Return
	
	$sData = GUICtrlRead($iPass_Combo)
	
	If StringLen($sData) < StringLen($sBuffer) Then 
		$sBuffer = StringTrimRight($sBuffer, 1)
	Else
		$sBuffer &= StringRight($sData, 1)
	EndIf
	
	If $iShow_Password Then
		_GUICtrlComboBox_SetEditText($iPass_Combo, $sData)
	Else
		_GUICtrlComboBox_SetEditText($iPass_Combo, StringRegExpReplace($sData, '.', '*'))
	EndIf
	
	$iPass_Combo_Edit_Changed = 0
EndFunc

Func _Combo_Sel_Changed_Check()
	If $iPass_Combo_Sel_Changed = 0 Then Return
	$iPass_Combo_Edit_Changed = 1
	
	$sIndex = Number(StringLeft(GUICtrlRead($iPass_Combo), 1))
	$sBuffer = $aBuffer[$sIndex]
	
	If $iShow_Password Then
		_GUICtrlComboBox_SetEditText($iPass_Combo, $sBuffer)
	Else
		_GUICtrlComboBox_SetEditText($iPass_Combo, StringRegExpReplace($sBuffer, '.', '*'))
	EndIf
	
	$iPass_Combo_Sel_Changed = 0
	$iPass_Combo_Edit_Changed = 0
EndFunc

Func WM_COMMAND($hWnd, $nMsg, $wParam, $lParam)
	Local $nNotifyCode = BitShift($wParam, 16)
	Local $nID = BitAND($wParam, 0xFFFF)
	
	If $iPass_Combo_Edit_Changed Or $iPass_Combo_Sel_Changed Then Return $GUI_RUNDEFMSG
	
	Switch $nID
		Case $iPass_Combo
			Switch $nNotifyCode
				Case $CBN_EDITCHANGE, $CBN_EDITUPDATE
					$iPass_Combo_Edit_Changed = 1
				Case $CBN_SELCHANGE
					$iPass_Combo_Sel_Changed = 1
			EndSwitch
	EndSwitch
	
	Return $GUI_RUNDEFMSG
EndFunc


:whistle:
 

InnI

AutoIT Гуру
Сообщения
4,922
Репутация
1,432
OffTopic:
Как вам такой вариант:
Звёздочки в выпадающем списке - это бомба ! :laugh:
Осталось только запрашивать мастер-пароль при включении опции "Показать пароль" :smile:
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
CreatoR [?]
Как вам такой вариант:
Интересный вариант.
Только сразу наткнулся на некоторые недостатки:
1 Невозможно удалить старый, ненужный или введенный по ошибке пароль
2 Попытка стереть в поле ввода пароль и в пустом поле написать другой приводит к тому, что новый пароль дописывается справа к старому, стертому варианту.
3 Не увидел ограничения на максимальное\минимальное число паролей, например, мне надо от 1 до 5. Меньше одного не надо, но больше 5 тоже будет лишку, т.к, мне их потом еще в ини файл сохранять, а раздувать его без ограничений не есть хорошо.
4 Начальные условия у меня будут такими:
Код:
$listpass='|password|пароль|12345|qwerty|'
$pass='12345'
Имена переменных не важны, но начальный список считанных паролей ($listpass) и пароль, который должен быть выбран из списка при старте ($pass) я не нашел куда прикрутить. в Вашем варианте.

Можно это подправить.
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gora [?]
Невозможно удалить старый, ненужный или введенный по ошибке пароль
Что мешает?

Попытка стереть в поле ввода пароль и в пустом поле написать другой приводит к тому, что новый пароль дописывается справа к старому, стертому варианту
Поправил.

Не увидел ограничения на максимальное\минимальное число паролей, например, мне надо от 1 до 5
Добавил ограничение (переменная $iPasswords_Limit).

начальный список считанных паролей ($listpass) и пароль, который должен быть выбран из списка при старте ($pass) я не нашел куда прикрутить
Добавил эту возможность.


P.S.
Надо бы это в виде UDF организовать.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
CreatoR [?]
Невозможно удалить старый, ненужный или введенный по ошибке пароль
Что мешает?
Он не удаляется из списка.
Сейчас добавил еще один пароль и их стало пять. Добавляю шестой, не дает (и это правильно). Но стереть пароль тоже не дает, пишет про лимит, хотя я хочу удалить, а не добавить (поле ввода пароля пусто при нажатии ОК).
CreatoR [?]
Цитата
Попытка стереть в поле ввода пароль и в пустом поле написать другой приводит к тому, что новый пароль дописывается справа к старому, стертому варианту
Поправил.
Не поправлено. Продолжает дописывать к стертому паролю.

Я посчитал строку
Код:
$iShow_Password = 0

отвечающей за начальное состояние чекбокса, но изменение в ней значения на 1 не привели к нужному результату, то есть пароли остались скрыты. Управлять состоянием чекбокса при старте нельзя?
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
gora [?]
я хочу удалить, а не добавить (поле ввода пароля пусто при нажатии ОК).
Ну для удаления не достаточно просто опустошить поле :smile:
Для этого нужна отдельная кнопка.
Позже постараюсь это всё решить в виде UDF.
 
Автор
G

gora

Знающий
Сообщения
315
Репутация
19
На базе варианта от InnI сделал такое:
Код:
#include <GuiConstantsEx.au3>
#include <EditConstants.au3>
#include <APIConstants.au3>

$listpass='|password|пароль|12345|qwerty|'
$pass='12345'
$show=1

$last=$pass

$Gui = GUICreate("Введите пароль", 270, 100,-1,-1,$WS_SYSMENU)
$Input = GUICtrlCreateInput($pass, 10, 10, 220, 20, $ES_PASSWORD)
$Combo = GUICtrlCreateCombo('', 10, 10, 220, 20)
$change = GUICtrlCreateButton("@", 235, 10, 20,20)
$Button = GUICtrlCreateButton("ОК", 186, 40, 70)

$Checkbox = GUICtrlCreateCheckbox("Показать пароль", 10, 40)
GUICtrlSetState($Checkbox,BitAND($show,$GUI_CHECKED))
If BitAnd(GUICtrlRead($Checkbox),$GUI_CHECKED) Then
	GUICtrlSetData($Combo,$listpass,$pass)
	GUICtrlSetState($Input,$GUI_HIDE)
Else
	GUICtrlSetData($Input,$pass)
	GUICtrlSetState($Combo,$GUI_HIDE)
EndIf
GUISetState()

Do
	Switch GUIGetMsg()
		Case $change
			_ChangePassword()
		Case $Button
			If _ChangePassword() Then ContinueLoop
			$preskey=MsgBox(1+256,'Якорь', _
				'$pass='&$pass&@LF& _
				'$last='&$last&@LF& _
				'$listpass='&$listpass&@LF& _
				@LF)
			If $preskey=2 Then Exit
		Case $Checkbox
			If BitAnd(GUICtrlRead($Checkbox),$GUI_CHECKED) Then
				$pass = GUICtrlRead($Input)
				GUICtrlSetState($Input,$GUI_HIDE)
				GUICtrlSetState($Combo,$GUI_SHOW)
				GUICtrlSetData($Combo,'')
				GUICtrlSetData($Combo,$listpass,$last)
			Else
				$pass = GUICtrlRead($Combo)
				GUICtrlSetState($Combo,$GUI_HIDE)
				GUICtrlSetState($Input,$GUI_SHOW)
				GUICtrlSetData($Input,$last)
			EndIf
		Case $GUI_EVENT_CLOSE
			Exit
	EndSwitch
Until 0

; ----------------------------------------------------------------------------------------------------------
Func _ChangePassword()
	$array=StringSplit($listpass,'|')
	If Not BitAnd(GUICtrlRead($Checkbox),$GUI_CHECKED) Then
		$pass = GUICtrlRead($Input)
		If $pass = "" Then
			If $array[0] > 3 Then $listpass=StringReplace($listpass,'|'&$last&'|','|')
			$array=StringSplit($listpass,'|')
			GUICtrlSetData($Input,$array[2])
			$last=$array[2]
		Else
			If StringInStr($listpass,'|'&$pass&'|')=0 Then
				If $array[0] < 7 Then
					$listpass &=$pass&'|'
					GUICtrlSetData($Input,$pass)
					$last=$pass
				Else
					MsgBox(256,'Ошибка','Много паролей')
					GUICtrlSetData($Input,$last)
					Return 1
				EndIf
			Else
				$last=$pass	
			EndIf
		EndIf
	Else
		$pass = GUICtrlRead($Combo)
		If $pass = "" Then
			If $array[0] > 3 Then $listpass=StringReplace($listpass,'|'&$last&'|','|')
			$array=StringSplit($listpass,'|')
			GUICtrlSetData($Combo,'')
			GUICtrlSetData($Combo,$listpass,$array[2])
			$last=$array[2]
		Else
			If StringInStr($listpass,'|'&$pass&'|')=0 Then
				If $array[0] < 7 Then
					$listpass &=$pass&'|'
					GUICtrlSetData($Combo,'')
					GUICtrlSetData($Combo,$listpass,$pass)
					$last=$pass
				Else
					MsgBox(256,'Ошибка','Много паролей')
					GUICtrlSetData($Combo,'')
					GUICtrlSetData($Combo,$listpass,$last)
					Return 1
				EndIf
			Else
				$last=$pass
			EndIf
		EndIf
	EndIf
	Return 0
EndFunc	;==> _ChangePassword()


С благодарностью выслушаю любые замечания, предложения по улучшению
 
Верх