1

Тема: AHK: Вопросы по ListView

#SingleInstance force
Gui, Add, ListView, r20 w700 +Report +Grid vReplaceLV gLogin LV0x10 LV_DeleteCol(3) -Multi +Sort Count10, Login  | Password
Loop, read, %A_ScriptDir%\Passw.txt
LV_Add("", A_LoopReadLine, Password)
LV_ModifyCol()
LV_ModifyCol(2, "Integer")
Gui, Show,
return

GuiEscape:
GuiClose:
ExitApp
  return

Login:
return

Как последовательно вставить в столбцы из файла формата txt строки такого содержания?
login1:password1
login2:password2
login3:password3
login4:password4

2

Re: AHK: Вопросы по ListView

Т.е. как написать режим чтения строки "первое слово в первый столбец, пропустить ":" , второе слово во второй столбец"?

3

Re: AHK: Вопросы по ListView

Gui, Add, ListView, r20 w700 +Report +Grid vReplaceLV gLogin LV0x10 LV_DeleteCol(3) -Multi +Sort Count10, Login  | Password
Loop, Read, %A_ScriptDir%\Passw.txt
{
 D := StrSplit(A_LoopReadLine, ":")
 LV_Add("", D[1], D[2])
}
LV_ModifyCol()
LV_ModifyCol(2, "Integer")
Gui, Show
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

4

Re: AHK: Вопросы по ListView

Или так:

Loop, Read, %A_ScriptDir%\Passw.txt
   LV_Add("", StrSplit(A_LoopReadLine, ":")*)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

5

Re: AHK: Вопросы по ListView

Не знал о таком методе. Хотя вроде как очевидно - передать сразу весь массив данных.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

6

Re: AHK: Вопросы по ListView

__Михаил__, описано здесь.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7 (изменено: Lolykroly, 2021-02-06 00:20:55)

Re: AHK: Вопросы по ListView

Спасибо, оба варианта работают, но первый понятнее, а вот со звёздочкой мне трудно понять было.

А теперь как их обратно в файл записать в том же формате?
Уже редактированные данные

#SingleInstance force
Gui, Add, ListView, r10 w500 +Report +Grid vReplaceLV gLogin LV0x10 LV_DeleteCol(3) -Multi +Sort Count10, Login  | Password
Loop, Read, %A_ScriptDir%\Passw.txt
   LV_Add("", StrSplit(A_LoopReadLine, ":")*)
 LV_ModifyCol(1, 150)
 LV_ModifyCol(2, 150)
Gui, Add, Button, x100 y205 w80 h23 gAdd, Add
Gui, Add, Button, x200 y205 w80 h23 gSave, Save
;LV_ModifyCol()
;LV_ModifyCol(2, "Integer")
Gui, Show,
return

Add:

return

Save:

return

Login:
return

GuiEscape:
GuiClose:
ExitApp
  return

Т.е. по кнопке добавить должны открываться поля ввода нередактируемые и после набора текста + enter переходить ко второму столбцу, и после ввода текста туда + Enter предложить сохранить и поместить эти данные в тот же файл. А также при редактировании какой-либо уже заполненной строки + Save они должны заноситься тоже обновлённые данные туда.

8

Re: AHK: Вопросы по ListView

Получать в цикле каждый элемент в списке и записывать. В справке есть информация как это сделать. Не совсем может очевидно, но есть.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

9 (изменено: Lolykroly, 2021-02-06 03:44:06)

Re: AHK: Вопросы по ListView

__Михаил__ пишет:

Получать в цикле каждый элемент в списке и записывать.

Я имел ввиду что директивы A_LoopWriteLine нету, как загружать данные построчно?

Начнём с того, что нередактируемые поля данных у меня неинтерактивны и евенты по ним возвращают последнуюю заполненную строку. Как выделить пустую?
Заполнил пустые поля пробелами...

Login1:Passw1
Login2:Passw2
Login3:Passw3
Login4:Passw4
_____:______
_____:______
_____:______
_____:______
_____:______
_____:______

Похоже без этого костыля пока не обойтись.

Т.е. как я понял они просто отсутствуют, и вместе с теми из списка нужно добавлять пустые строки?

Строки второго столбца некликабельны. Что с ним делать?

10

Re: AHK: Вопросы по ListView

Так, как сделать появление меню с кнопками над текущим меню по координатам курсора? Подобно тому как по пкм кнопка вылазит.

11

Re: AHK: Вопросы по ListView

#SingleInstance force
Gui, Add, ListView, r10 w500 +Report +Grid vReplaceLV gLogin LV0x10 LV_DeleteCol(3) -Multi +Sort Count10, Login  | Password
Loop, Read, %A_ScriptDir%\Passw.txt
 LV_Add("", StrSplit(A_LoopReadLine, ":")*)
LV_ModifyCol(1, 150)
LV_ModifyCol(2, 150)
Gui, Add, Button, x100 y205 w80 h23 gAdd, Add
Gui, Add, Button, x200 y205 w80 h23 gSave, Save
;LV_ModifyCol()
;LV_ModifyCol(2, "Integer")
Gui, Show,
return

Add:
Return

Login:
Return


Save:
ControlGet, Hwnd, Hwnd,, SysListView321, A	; Получаем индикатор ListView текущего окна.
ControlGet, ListText, List,,, ahk_id %hwnd%	; Весь видимый текст.
Text =

Loop, Parse, ListText, `n	; Парсим строки.
{
 StringReplace, T, A_LoopField, % A_Tab, : , All	; Заменяем делитель 'Tab' на ':'.
 Text .= T "`n"
}

File := FileOpen(A_ScriptDir "\Passw.txt", "w")		; Сохраняем в файл настроек.
File.Write(Text)
File.Close()
Return


GuiEscape:
GuiClose:
ExitApp
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

12 (изменено: Lolykroly, 2021-02-06 22:44:08)

Re: AHK: Вопросы по ListView

Отлично!
А теперь как второй столбец то редактировать(Однократным щелчком или на кнопку разблокировать все поля для редактирования)? То как на евент выделенная строка, если она не в фокусе, даже на кнопку не реагирует, A_EventInfo содержит пустое значение. Он по прежнему нередактируем.

Если устанавливать на потерю фокуса ввода

if A_GuiEvent = f

То тоже не помогает.

А то я ничего более умного не придумал, кроме как на запустить файл с паролями развернуть на весь экран перед пользователями.

т.е. должно быть что-то типа

if A_GuiEvent = e ;Закончено редактирование первого поля строки
;то открывается для редактирования вторая

13

Re: AHK: Вопросы по ListView

Мне лично ListView не особо нравится, если нужно заполнять поля я лучше буду использовать обычный 'Edit'. С ним мороки меньше, легко получить / заменить данные. Но в текущем варианте ListView удобнее т.к. список может быть любой длины.

...развернуть на весь экран перед пользователями.

Вы пытаетесь программу для других создать? С вашим-то уровнем программирования?

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

14 (изменено: Lolykroly, 2021-02-06 23:12:13)

Re: AHK: Вопросы по ListView

__Михаил__ пишет:

Вы пытаетесь программу для других создать? С вашим-то уровнем программирования?

Я не исключаю что ей будут пользоваться другие, но и для себя пытаюсь сделать как удобнее, потому что это лишь часть её полезных функций, но не основная)

А пример на  'Edit' есть?

Вобщем так: Если строка была выделена, а потом ListView теряет фокус и при нажатии на Button

#SingleInstance force
Gui, Add, ListView, r10 w500 +Report +Grid vReplaceLV gLogin LV0x10 LV_DeleteCol(3) -Multi +Sort Count10, Login  | Password
Loop, Read, %A_ScriptDir%\Passw.txt
 LV_Add("", StrSplit(A_LoopReadLine, ":")*)
LV_ModifyCol(1, 150)
LV_ModifyCol(2, 150)
Gui, Add, Button, x100 y205 w80 h23 gAdd, Add
Gui, Add, Button, x200 y205 w80 h23 gОк, Ок
Gui, Add, Button, x300 y205 w80 h23 gSave, Save
;LV_ModifyCol()
;LV_ModifyCol(2, "Integer")
Gui, Show,
return

Add:
Return

Ок: ;gОк
{
IfWinExist, Блокнот
{
    WinActivate
}
else
{
MsgBox Запустите Блокнот
return
}
#IfWinActive Блокнот
WinTitle = ahk_class Notepad ahk_exe NOTEPAD.EXE
WinWait Passw.txt
    LV_GetText(Log, A_EventInfo, 1) ; Получаем текст строки из первого столбца.
	LV_GetText(Pass, A_EventInfo, 2)
	SendInput, %Log%
	SendInput, {Tab}
	SendInput, %Pass%
	SendInput, {Tab}
	SendInput, {Enter} ;Только вот на переменную enter почему-то не реагирует
	;goto, Lis
	;MsgBox %AutoIn%	
}
Return


Save:
ControlGet, Hwnd, Hwnd,, SysListView321, A	; Получаем индикатор ListView текущего окна.
ControlGet, ListText, List,,, ahk_id %hwnd%	; Весь видимый текст.
Text =

Loop, Parse, ListText, `n	; Парсим строки.
{
 StringReplace, T, A_LoopField, % A_Tab, : , All	; Заменяем делитель 'Tab' на ':'.
 Text .= T "`n"
}

File := FileOpen(A_ScriptDir "\Passw.txt", "w")		; Сохраняем в файл настроек.
File.Write(Text)
File.Close()
Return


GuiEscape:
GuiClose:
ExitApp
Return

Он возвращает названия столбцов, а не данные той строки. Как это обойти? Т.е. ПОЛУЧИТЬ ДАННЫЕ СТРОКИ НЕ В ФОКУСЕ?
Сохранять строки в отдельную переменную при выделении для отдельной кнопки?

15 (изменено: Lolykroly, 2021-02-06 23:46:41)

Re: AHK: Вопросы по ListView

Пачиму эта кнопка не открывается более одного раза?

AddLogin: ;gAddLogin
IfWinExist, Passw.txt
{
    WinActivate
}
else ;окно не существует
{
Run %A_ScriptDir%\Passw.txt,, UseErrorLevel

if ErrorLevel
	 Msgbox Невозможно открыть файл
     else
#IfWinActive Passw.txt
	 WinTitle = ahk_class  Notepad ahk_exe NOTEPAD.EXE
     WinWait Passw.txt
	 WinActivate Passw.txt
}
	;Passw.txt - развернуть, на передний план
Return

16

Re: AHK: Вопросы по ListView

Криво написанный код - залог неверной работы скрипта.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

17

Re: AHK: Вопросы по ListView

Пример с использованием 'Edit'. Не самый лучший вариант.

#SingleInstance Force
#NoEnv
SetWorkingDir %A_ScriptDir%
SetBatchLines -1

Name = Логин-Пароль
Settings = Passw.txt

Load:
Gui, Destroy
Gui Add, Text, x8 y8 w120 h23 +0x200, Логин:
Gui Add, Text, x136 y8 w120 h23 +0x200, Пароль:
I = 5	; Начальная позиция Y.
All =
Loop, Read, % Settings
{
 All++	; Кол-во полей.
 I += 24	; Смещение для позиции по вертикали.
 D := StrSplit(A_LoopReadLine, ":")
 Gui Add, Edit, HwndhL%All% x8 y%I% w120 h21, % D[1]
 Gui Add, Edit, HwndhE%All% x136 y%I% w120 h21, % D[2]
}
Gui Add, Button, gSave x264 y8 w80 h23, Сохранить
Gui Add, Button, gAdd x264 y32 w80 h23, Добавить

Gui Show,, % Name
Return

GuiEscape:
GuiClose:
ExitApp


Save:
Text=
I=
Loop, % All
{
 I++
 ControlGetText, L, % "Edit" I, % Name
 ControlGetText, E, % "Edit" I+1, % Name
 I++
 Text .= L ":" E "`n"
}

File := FileOpen(Settings, "w")		; Сохраняем в файл настроек.
File.Write(Text)
File.Close()
Return


Add:
GoSub, Save	; Сохранить текущий список.
FileAppend, % "Логин:Пароль`n" , % Settings
GoSub, Load	; Пересоздать окно.
Return
Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

18 (изменено: Lolykroly, 2021-02-07 00:55:49)

Re: AHK: Вопросы по ListView

__Михаил__ пишет:

Пример с использованием 'Edit'. Не самый лучший вариант.

Слушай а это лучший вариант чем у меня,
Только
̮䩭:Р
//Кракозябры
вот такие добавляет, не могу сообщение написать тут после них, кракозябры весь текст после себя "съедают")

19

Re: AHK: Вопросы по ListView

Кодировку нужно менять. У меня по умолчанию скрипт создаёт нужную (Анси).

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

20

Re: AHK: Вопросы по ListView

Да, он не лучший вариант, потому что в нём нет прокрутки, ну и как заходить, придётся к каждой строке лепить отдельную кнопку

21

Re: AHK: Вопросы по ListView

Я так понимаю задача сделать Gui окошко в котором будет выводится логины-пароли.
Далее сохранятся в один файл для удобства. Автоматический ввод не предусмотрен? Я например на F1 в разных окнах добавил авто-ввод логина-пароля.
Сама идея может и хороша, но нужно и обезопасить саму базу данных. Например шифровать, иначе любой доступ к этому файлу несёт потенциальную опасность для взлома.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

22 (изменено: Lolykroly, 2021-02-07 15:52:56)

Re: AHK: Вопросы по ListView

__Михаил__ пишет:

сделать Gui окошко

Само GUI есть, это просто дополнительная вкладка
Но я бы не против узнать как "надокно" создавать - над ним еще одно гуи без закрытия старого

__Михаил__ пишет:

Автоматический ввод не предусмотрен?

Автоматический ввод предусмотрен только если стоит галочка, но сколько я не вводил зависимость от переменных от неё, она срабатывать не хочет.

__Михаил__ пишет:

но нужно и обезопасить саму базу данных. Например шифровать

Я тоже об этом думал, и даже бы вторую колонку в самом листвью зашифровать для отображения чтобы при скринах или съёмке видео эта информация случано не попала

__Михаил__ пишет:

Например шифровать

Сам ключ шифр можно хранить и в ini файле, т.к. он смежным файлом предусмотрен

Но также актуальным и остаётся вопрос: Как сделать доступной для редактирования вторую колонку из гуи?

23

Re: AHK: Вопросы по ListView

1) Если есть задача скрыть пароль - так зачем его тогда отображать в списке?
2) Добавить новое Gui с названием, вот и будет ещё одно без закрытия старого.
3) Переменные нужно сначала заполнить данными, затем делать их сравнение.
4) Шифровать файл думаю можно как угодно, главная задача сделать текст нечитабельным.
5) Ключ не должен храниться в самом файле, если потенциальному взломщику это будет известно - о безопасности можно забыть.

На форуме есть темы на каждый  вопрос - поиск в помощь.

Win10x64, AHK v1.1.37.01 (Unicode 64-bit) | AHK-Wiki | Переменные и выражения | RegEx101

24

Re: AHK: Вопросы по ListView

__Михаил__ пишет:

1) Если есть задача скрыть пароль - так зачем его тогда отображать в списке?

Чтобы видеть что оно вобще есть?

__Михаил__ пишет:

2) Добавить новое Gui с названием, вот и будет ещё одно без закрытия старого.

попробуйю

__Михаил__ пишет:

3) Переменные нужно сначала заполнить данными, затем делать их сравнение.

Нет, я сначала присваивал переменной некое значение при начале работы, а затем она менялась в процессе, но это сложно объяснить.

__Михаил__ пишет:

4) Шифровать файл думаю можно как угодно, главная задача сделать текст нечитабельным.

Знать бы еще о методах шифрования

__Михаил__ пишет:

5) Ключ не должен храниться в самом файле, если потенциальному взломщику это будет известно - о безопасности можно забыть.

Куда бы я его не поместил, потенциальный взломщик всё равно найдёт его если у него будет задача найти пароли, а если не будет он этого и не увидит.

25 (изменено: Lolykroly, 2021-02-09 05:25:43)

Re: AHK: Вопросы по ListView

__Михаил__ пишет:

2) Добавить новое Gui с названием, вот и будет ещё одно без закрытия старого.

Не получается

GuiContextMenu: ; Запускается в ответ на щелчок правой клавишей мыши или на нажатие клавиши Apps.
; Эта проверка производится по желанию и отображает меню
; только в результате щелчка в пределах элемента управления  ListView.
if A_GuiControl <> MyListView 

Gui Add, Button, x390 y705 w80 h23 gButtonClose, Закрыть

return

; Отображает меню согласно заданным координатам, A_GuiX и A_GuiY.
; Необходимость использования этих переменных объясняется тем,
; что меню появится в заданном месте даже при нажатии клавиши Apps:
Menu, MyContextMenu, Show, %A_GuiX%, %A_GuiY%
return
ButtonClose:
return