Что нового

Text Correction - исправление текста набранного в неправ. раскладке клавиатуры

XM

Знающий
Сообщения
70
Репутация
8
AZJIO сказал(а):
На счёт реестра я думал, другая половина бы сказала, а нельзя ли было, чтоб в реестр не гадила. ...
Многие из тех, кто бы высказал подобное, вряд ли себе представляют что значит "гадить в реестр" в прямом смысле этого слова...
При любом клике мышкой, открывания папки и пр. мелких действиях в реестр заносятся (и удаляются) столько всяких ключей и параметров, что ой-ой. Многие об этом и не знают даже... А сколько туда "гадят" различных программ, об этом даже говорить не стоит.
В тоже время, если "нужная" программа, например та, что сейчас обсуждаем занесет туда свои настройки, это врядли можно назвать засорением реестра; кроме всего прочего, это одна из основных(!) функций реестра.

С точки зрения выбора между INI и записями в реестр, по моему глубокому убеждению, предпочтительней хранить настройки в одном(!) "хранилище", таком как системный реестр, например, а не плодить множество INI файлов на HDD. Но это мое мнение, многие могут не согласится.

А 0.5 значит работает? Без залипания?

Версия 0.5 работает. А залипаний у меня и не было, ранние версии вообще не реагировали на HK.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Vendor
У многих на работе компы, на которых не должна быть никакая посторонняя инфа. Во вторых, если носишь софт на флешке, то разве гуд при старте каждый раз настраивать клавиши и твики. Третье, где ты будешь составлять таблицу языка, например украинского? Не полезешь в реестр, а в ini увидешь и чисто догадаешь (про себя говорю). Ну и последнее, это самое универсальное свойство иметь дополнительный ini, так как ты можешь пользоваться прогой при любых условиях.

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

И кстати, можно читать ini как файл в память, а там регулярными выражениями прочитать параметры, получится за один заход.

И в качестве примеров Тотал, KMPlayer, "Media Player Classic", SciTE, Notepad++, хранят настройки в ini. Или комбинируют, часть в ini, часть в реестре.
 

XM

Знающий
Сообщения
70
Репутация
8
Во вторых, если носишь софт на флешке, то разве гуд при старте каждый раз настраивать клавиши и твики.
Для портабельных версий согласен, но не *.ini а *.cfg, удобнее обрабатывать...

Третье, где ты будешь составлять таблицу языка, например украинского?
Можно написать соответствующие .au3 и вложить их в тело скрипта.

Ну и последнее, это самое универсальное свойство иметь дополнительный ini...
Vendor
...а не плодить множество INI файлов...

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

И кстати, можно читать ini как файл в память, а там регулярными выражениями прочитать параметры
Опять же, повторюсь - *.cfg в этом случае удобнее.

И в качестве примеров Тотал, KMPlayer, "Media Player Classic", SciTE, Notepad++, хранят настройки в ini. Или комбинируют, часть в ini, часть в реестре.
Хотя почти все перечисленные используются на локальных машинах(!).

А вообще:
Vendor:
Но это мое мнение, многие могут не согласится.
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
*.ini а *.cfg в этом ли проблема? Он вполне может быть txt-файлом, ты диктуешь расширение или формат? INI- содержит секции и ключи, по которым идентифицируются параметры. Формат cfg, тот что в игрушках там каждый сам себе формат загадывает. Расширание оно само по себе роли не играет, где ты видел, что с прогами были cfg-файлы? Не ну поиском найти можно, и каких разных форматов: xml, ini, бинарные... Функции IniRead, IniWrite работают с файлом как ini-формат, независимо от расширения.

Vendor
Опять же, повторюсь - *.cfg в этом случае удобнее.
красивыми буквами? аурой?
 

XM

Знающий
Сообщения
70
Репутация
8
...где ты видел, что с прогами были cfg-файлы?...
о_О!
Вообще cfg я привел в качестве ближайшей альтернативы ini, это не руководство к действию. А ini-файлы это скорее пережиток прошлого. Более-менее серьезные программы имеют свой собственный формат файлов настроек.

Vendor
*.cfg в этом случае удобнее.
AZJIO
красивыми буквами? аурой?
Структурой...

...можно читать ini как файл в память, а там регулярными выражениями прочитать параметры...
И где удобнее таким способом прочесть параметры??...


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

Чем не нравится допустим XML? Это достаточно прогрессивный формат, и в отличие от ИНИ имеет больше возможностей....

Нет, нет, я не пытаюсь кого-то переубедить. Просто живу в ногу со временем... :smile:
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Vendor
Ладно, буду продвигать свой формат, расширение *.zyz, это будет супер формат, в одном байте данных вся информация о конфигурации... Струтура уплотнена по новой технологии, на одну букву приходится 5 ячеек данных...


Vendor
И где удобнее таким способом прочесть параметры??...
я подумал, что реально если экономить на обращении к харду это за одно обращение получить все данные. Как я понимаю с форматом ini приходится обращаться к харду столько, сколько параметров будут читаться из него. Торможение может быть заметно только на CD, когда на каждый запрос головка будет дёргаться к файлу.
 

XM

Знающий
Сообщения
70
Репутация
8
Как я понимаю с форматом ini приходится обращаться к харду столько, сколько параметров будут читаться из него.
Не всегда. Смотря какая структура кода программы, вызывающая список параметров из ini. По уму, так надо весь его отправлять в память (ну если конечно файл не 1.5 гб весит :smile:)
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Незнаю с чем связано, но у меня там функция _GuiHotKey() строка-440, которая создаёт временное окно для смены клавиш, и вроде код не сложный, и казалось бы чем он может заставить глючить. Ну в общем после закрытия окна безглючно работала только комбинация конвертирования строки. Для выхода из такой ситуации сделал в этом месте перезапуск программы, то есть при смене клавиш, происходит сохранение и запуск с новыми параметрами.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AZJIO сказал(а):
Незнаю с чем связано, но у меня там функция _GuiHotKey() строка-440, которая создаёт временное окно для смены клавиш, и вроде код не сложный, и казалось бы чем он может заставить глючить. Ну в общем после закрытия окна безглючно работала только комбинация конвертирования строки. Для выхода из такой ситуации сделал в этом месте перезапуск программы, то есть при смене клавиш, происходит сохранение и запуск с новыми параметрами.

Нужно все-таки читать документацию, тем более я ее специально для нашего форума перевел на русский язык.

...я подумал, что реально если экономить на обращении к харду это за одно обращение получить все данные. Как я понимаю с форматом ini приходится обращаться к харду столько, сколько параметров будут читаться из него. Торможение может быть заметно только на CD, когда на каждый запрос головка будет дёргаться к файлу.

У тебя параметры в .ini файле по пальцам пересчитать можно. Не заморачивайся насчет этого, ни на каких CD ничего дергаться не будет, для этого у любых устройств чтения/записи есть кэш...



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

А так, неплохая программа получилась.

+1


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

А еще, красивее будет, если вместо иконок "En" и "Ru" использовать флажки...

Flags.zip
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
Код:
Case 1033

Это из версии 0.4, в версии 0.5 заменено на переменные, для того, чтоб в ini вписать номер языка. Всё остальное буду пробовать...
Конечно по мере создания возникают следующие хотелки, например выбор языка En+Ru или En+украинский и т.д. Например по указанной раскладке в реестре создать соответствующий языку ini-файл. Но это уже зависит, если кто подгонит готовую таблицу соответствия языка-раскладки, у меня украинской или ещё какой нет.

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

Yashied
У тебя параметры в .ini файле по пальцам пересчитать можно. Не заморачивайся насчет этого, ни на каких CD ничего дергаться не будет, для этого у любых устройств чтения/записи есть кэш...
У меня есть скрипт автосоздания ярлыков в LiveCD, так вот он держа код в себе умудряется 10 сек создавать ярлыки, в то втремя как если код в памяти, то обрабатывается мгновенно.



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

Yashied
А еще, красивее будет, если вместо иконок "En" и "Ru" использовать флажки...
не, это моя фирменная фича, вы уж сами заменяйте на любые иконки, а мне эти нравятся, зелёный - писать можно, красный - писать нельзя. И краем глаза легко заметна.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Я не имел ввиду добавлять другие языки. Просто у тебя цикл организован так, что при последовательном переключении языков, если это будет не русский, то иконка в трее всегда будет показывать "En", в то время, как выбран, например, французский. Поэтому я и предложил добавить иконку для языков, которые не поддерживает программа (в данном случае для любого языка, кроме "En" и "Ru").


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

Вот так будет правильнее (получился простой индикатор раскладки клавиатуры):

Код:
Global $L1, $L2 = 0

...

While 1
    Sleep(100)
    $L1 = _WinAPI_GetKeyboardLayout(_WinAPI_GetForegroundWindow())
    If Not $L1 Then
		$L1 = DllCall('user32.dll', 'int', 'SystemParametersInfo', 'uint', 0x0059, 'uint', 0, 'long*', 0, 'uint', 0)
		$L1 = BitAND($L1[3], 0xFFFF)
    EndIf
    If $L1 <> $L2 Then
        Switch $L1
            Case 1033
                TraySetIcon(@ScriptFullPath, 3)
            Case 1049
                TraySetIcon(@ScriptFullPath, 4)
            Case Else
                ; Иконка для неподдерживаемого языка, например "?"
        EndSwitch
        $L2 = $L1
    EndIf
WEnd
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
Спасибо, всё применил, код стал компактнее и совершеннее...
Ну и поправил несколько ошибок. Кстати, теперь и у меня не залипает, после батника снятия процессов.
Файл exe обновил исходник в комплекте.

Попробовал _KeyLock, _KeyUnlock, не отключает клавиши, хотя функция приостановки мне практически не нужна.
На счёт иконок, наверно их лучше из памяти читать (как gif), если exe всё равно в памяти висит.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AZJIO сказал(а):
Попробовал _KeyLock, _KeyUnlock, не отключает клавиши, хотя функция приостановки мне практически не нужна.

Почему не отключает, все прекрасно работает (просто CTRL-ALT-DEL система не даст заблокировать). Смысл _KeyLock() в том, что бы не дать пользователю ввести ту или иную комбинацию клавиш, т.е. в поле ввода она не будет отображаться. В твоем случае, _KeyLock(0x062E) блокирует CTRL-ALT-DEL и после этого выбрать это сочетание уже не получится. Таким образом, можно еще добавить, например блокировку для ALT-TAB или еще чего-нибудь. _KeyLock() не блокирует клавиши, а просто не дает пользователю выбрать эти клавиши в поле ввода ("защита от дураков"). Попробуй.

AZJIO сказал(а):
На счёт иконок, наверно их лучше из памяти читать (как gif), если exe всё равно в памяти висит.

Не как gif, а как HICON. Вот хороший пример, как это можно сделать.


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

Немного смутила следующая запись:

Код:
$L2=''
$L2 = 0



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

Код:
$Old_bufer = ClipGet() ; для восстановления буфера
...
ClipPut($Old_bufer)


А если в буфере не текст, а, например, картинка?



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

Код:
; определение активного окна и проверка раскладки клавиатуры
$WinList = WinList()
For $i = 1 To $WinList[0][0]
	If $WinList[$i][0] <> "" And BitAND(WinGetState($WinList[$i][1]), 8) Then
		$hWnd = WinGetHandle($WinList[$i][1])
		ExitLoop
	EndIf
Next
$Lang = _WinAPI_GetKeyboardLayout($hWnd) ; 1033 1049


Лучше так (я уже писал выше):

Код:
$Lang = _WinAPI_GetKeyboardLayout(_WinAPI_GetForegroundWindow())



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

По поводу иконки, вот пример:

Код:
...

Global $hHz = _WinAPI_ShellExtractIcons(@ScriptFullPath, 0, 16, 16)
Global $hEn = _WinAPI_ShellExtractIcons(@ScriptFullPath, 1, 16, 16)
Global $hRu = _WinAPI_ShellExtractIcons(@ScriptFullPath, 2, 16, 16)

...

Switch $L1
    Case Int($LangN1)
        _TraySetIcon($hEn)
    Case Int($LangN2)
        _TraySetIcon($hRu)
    Case Else
        _TraySetIcon($hHz)
EndSwitch

...

Func _TraySetIcon($hIcon)

    Local $tData = DllStructCreate('dword Size;hwnd hWnd;uint ID;uint Flags;uint CallbackMessage;ptr hIcon')

    DllStructSetData($tData, 'Size', DllStructGetSize($tData))
    DllStructSetData($tData, 'hWnd', WinGetHandle($Unique))
    DllStructSetData($tData, 'ID', 1)
    DllStructSetData($tData, 'Flags', $NIF_ICON)
    DllStructSetData($tData, 'hIcon', $hIcon)
   
   Return _WinAPI_ShellNotifyIcon($NIM_MODIFY, $tData)
EndFunc   ;==>_TraySetIcon
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
Да примеры в хорошем виде, только вставляй в скрипт и работает.
при изменении добавил $hWnd=WinGetHandle(_WinAPI_GetForegroundWindow()), а то изменение раскладки при исправлении не срабатывала.


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

Попробовал в качестве горячей клавиши назначить 0, чтоб удалить горячую клавишу, не сработало, только в ini сохранилось и при следующей загрузке уже не работала горячая клавиша.

Завтра попробую добавить возможность добавления разделителей текста и твик автозагрузки.

Определил, что при старте PrKiller.exe у меня исчезает проблема с залипанием.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AZJIO сказал(а):
...при изменении добавил $hWnd=WinGetHandle(_WinAPI_GetForegroundWindow()), а то изменение раскладки при исправлении не срабатывала.

Это как масло масляное... _WinAPI_GetForegroundWindow() уже возвращает хендл окна, зачем еще прикручивать сюда WinGetHandle()? :wacko: Вообще, исправлять ошибки методом тыка не самая хорошая идея.


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

Кстати, _WinAPI_GetForegroundWindow() можно заменить на WinGetHandle('[ACTIVE]') или просто WinGetHandle('').

;)
 
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
Не методом тыка, я увидел, что раскладка не переключается при исправлении языка, и нужен был хэнд в функцию.

Вобщем качаем новую версию 0.6

Обновления
1. Добавлена автозагрузка в настройках
2. Добавлен выбор разделителей слова для режима 3
3. Добавлена возможность убрать горячую клавишу (с авто-перезапуском TextCorrection)
4. Небольшие улучшения кода, удален пункт "Приостановить", иконки читаются из памяти при смене раскладки.
Для TextCorrection.ini добавлены новые параметры, удалены ненужные, удалить старый TextCorrection.ini, для генерации нового.

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


Для украинской раскладки, проверте.
[General]
Lang1=`qwertyuiop[]asdfghjkl;'zxcvbnm,./~QWERTYUIOP{}ASDFGHJKL:"|ZXCVBNM<>?@#$^&
Lang2=ёйцукенгшщзхїфівапролджєячсмитьбю.ЁЙЦУКЕНГШЩЗХЇФІВАПРОЛДЖЄ/ЯЧСМИТЬБЮ,""№;:?
LangT1=qwertyuiopasdfghjklzxcvbnm
LangT2=ёйцукенгшщзхїфівапролджєячсмитьбю
LangR1=00000409
LangR2=00000422
Pattern=\()=+%!
AutoStart=0
CapsLock=1

[HotKey]
HotKey1=732
HotKey2=734
HotKey3=698
HotKey4=588
HotKey5=703
HotKey6=731
HotKey7=733
HotKey8=539
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
Автор
A

AZJIO

Меценат
Меценат
Сообщения
2,894
Репутация
1,196
Yashied
А зачем перезапускать?
А у меня клавиша не снимается, только перезапуском.

Я сейчас исправил, в украинской раскладке некоторые буквы хоть и выглядят правильно, но у меня при конвертировании нераспознавались, это как буква "а" есть в трёх алфавитах, но разный код. В общем скоро выложу новую весию, в которой можно переключаться между режимами En-Ru и En-Uk. Во первых это позволяет выбирать язык без подсовывания ini, во вторых можно Ru в Uk конвертировать способом сначала в En далее переключаем режим и далее в Uk, ну и наоборот.

_______________________________

Пробуйте версию 0.7
1. Добавлена поддержка трёх языков, с неудобством переключения режима.
2. Добавлен украинский язык

В общем у кого два языка, всё остаётся также, никаких проблем. Только ini заново создать.
У кого три языка (себе временно добавил) назначайте клавишу переключения режима. Это позволит конвертировать между тремя языками, хотя приходится следить, например если конвертировать украинский в англ. при режиме En-Ru получаем неприятности, например i не конвертируется, хотя и выглядит по английски.

Сравнил коды раскладок Ru и Uk, разница только в трёх буквах - їіє - ъыэ, если делать без переключения режима, то пока никаких идей, если только выполнить замену для этих трёх букв, но тогда другие языки поддерживаться не будут, поэтому оставлю пока текущий вариант переключения режимов.
 

Yashied

Модератор
Команда форума
Глобальный модератор
Сообщения
5,379
Репутация
2,724
AZJIO сказал(а):
А у меня клавиша не снимается, только перезапуском.

Что значит не снимается? Приведи пример, как ты ее пытаешься снять.

OffTopic:
И все-таки флажки в трее смотрелись бы намного красивее...
 
Верх