101

Re: AHK: Break и Shift+Break как в пунто свитчере

Тем не менее, им многие до сих пор пользуются, например.

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

102

Re: AHK: Break и Shift+Break как в пунто свитчере

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

103

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker пишет:

А вот RegExReplace() ничем не лучше, по-моему, перебора символов, вряд ли этот вариант лучше по производительности.

Хотя, выглядит всё же, вроде, логичнее, имеет смысл заменить.

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

104

Re: AHK: Break и Shift+Break как в пунто свитчере

serzh82saratov пишет:

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

Ну всё же разработчики от ANSI-версии пока не отказались, так что рано "бить по рукам" . Другое дело, когда упорно продолжают использовать basic-версию.

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

105

Re: AHK: Break и Shift+Break как в пунто свитчере

Отредактировал.

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

106

Re: AHK: Break и Shift+Break как в пунто свитчере

Только не очень понятно наличие стольких точек в строках, зачем они?

Вопрос ещё актуален?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

107

Re: AHK: Break и Shift+Break как в пунто свитчере

В общем-то да, почему не так:

ConvertRegistr(Text)
{
   static Chars := "ёйцукенгшщзхъфывапролджэячсмитьбюqwertyuiopasdfghjklzxcvbnm"
                 . "ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮQWERTYUIOPASDFGHJKLZXCVBNM" 

   Loop, parse, Text
      NewText .= (found := InStr(Chars, A_LoopField, 1)) 
         ? SubStr(Chars, found - 59, 1) : A_LoopField
   Return NewText
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

108

Re: AHK: Break и Shift+Break как в пунто свитчере

http://s019.radikal.ru/i606/1203/58/7b55e7d0f1c8.jpg

Баг головного мозга, надо поправить.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

109

Re: AHK: Break и Shift+Break как в пунто свитчере

А я подумал — для красоты.

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

110

Re: AHK: Break и Shift+Break как в пунто свитчере

К сожалению, нет http://xbmc.ru/forum/images/smilies/facepalm.gif

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

111

Re: AHK: Break и Shift+Break как в пунто свитчере

У меня тоже что-то с кодировкой стало. Скрипт сохранён как UTF-8 без BOM, но почему-то из анг. получаются кракозябры, а кирилица вообще не меняется.

ќР†ЎРС!

  Даже не знаю после чего изменилось. Может после обновления Windows?

112

Re: AHK: Break и Shift+Break как в пунто свитчере

Скрипты должны сохраняться только с BOM в любом формате из ANSI, UTF-8, UTF-16.

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

113

Re: AHK: Break и Shift+Break как в пунто свитчере

Foma пишет:

У меня тоже что-то с кодировкой стало. Скрипт сохранён как UTF-8 без BOM, но почему-то из анг. получаются кракозябры, а кирилица вообще не меняется.

ќР†ЎРС!

  Даже не знаю после чего изменилось. Может после обновления Windows?

Тоже самое. Слово "Windows" набранное русской раскладкой "Цштвщцы", скриптом переделывается в "??????".
Скрипт сохраняю в UTF-8 c галкой BOM. Windows 8.1 64bit.

114

Re: AHK: Break и Shift+Break как в пунто свитчере

У меня семёрка, с таким не сталкивался. Попробуйте это почитать. И ещё здесь вариант решения подобных проблем в прошлых версиях Windows правкой реестра (в последней трети страницы).
Только что проэкспериментировал, что при сохранении скрипта в UTF-8 без BOM действительно делает из латинских символов кракозябры, а с кириллицей ничего не делает. Советую сохранять скрипты в ANSI. Если в юникоде — то обязательно с BOM.

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

115 (изменено: mafckz, 2015-04-10 06:45:13)

Re: AHK: Break и Shift+Break как в пунто свитчере

В выложенном скрипте меня не устраивало, что когда после написанного слова ставится пробел, и нажимается клавиша изменения раскладки, то изменения не происходили (это так задумано или нет?) К примеру, punto switcher изменяет текст в данном случае.

Сильно в коде не разбирался, но не понял зачем такой усложненной код в функции GetWord начиная со 130 строки (цикл While A_Index < 10). Поэтому начиная с этой строки и до конца фунции я заменил код на

   
else 
   {
    Send ^+{left}
    SendInput, ^{vk43}
    ClipWait, 0
    if !ErrorLevel
      Return Clipboard
   } 

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

116

Re: AHK: Break и Shift+Break как в пунто свитчере

mafckz пишет:

когда после написанного слова ставится пробел... то изменения не происходили (это так задумано или нет?)

Да, так и задумано, после пробела скрипт сработает, если только выделить предыдущий текст.

не понял зачем такой усложненной код

Скрипт многократно тестировался на разных сайтах и текстовых редакторах, где разная реакция на отправку клавиш. Если у вас лучше работает ваш вариант, то почему нет. А я в данном случае предпочитаю пользоваться правилом «работает — не трогай».

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

117

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker пишет:

Да, так и задумано, после пробела скрипт сработает, если только выделить предыдущий текст

Все-таки это не совсем верный подход с точки зрения "юзер-френдли" интерфейса. Пользователь набрал слово, перевел его по хоткею в другую раскладку - работает. Снова набрал слово, отделил пробелом - жмет хоткей - а программа ему в ответ: "Извини,  я понимаю, что именно ты хочешь сделать, но у тебя предыдущее слово - ПРОБЕЛ, извини, такие правила."

+ -

Пример с пешеходами. В Советском Союзе делали для них дорожки по утвержденному плану, и ставили грозные таблички "По газону не ходить!!!". В Германии сначала смотрели, где люди протоптали дорожки наиболее удобными маршрутами, а потом их асфальтировали. У вас налицо склонность к 1му варианту. ))

118

Re: AHK: Break и Shift+Break как в пунто свитчере

+ дорожки

Дорожки так проложили в каком-то советском институте. А про Германию не очень верится. Там же орднунг. Айн-цвай-драй-полицай.

119 (изменено: serzh82saratov, 2015-11-18 03:32:28)

Re: AHK: Break и Shift+Break как в пунто свитчере

Может кто то сочтёт полезным переводить начало слов в верхний регистр:


ConvertTitle(delimiters = " ")
{ 
	SelText := GetWord(TempClipboard)
	SelText := RegExReplace(SelText, "(.)", Format("{:Ts}", SubStr(SelText, 1, 1)), , 1), pos := 1
	While (pos := RegExMatch(SelText, "S)[\Q" delimiters "\E][a-zа-яё]", M, pos))
		SelText := RegExReplace(SelText, ".", Format("{:Ts}", SubStr(M, 2, 1)), , 1, ++pos)
	Clipboard := SelText
	SendInput, ^{vk56}   ; Ctrl + V
	Sleep, 200
	Clipboard := TempClipboard
}

Например в кодинге можно использовать свои разделители:

ConvertTitle(" {[._""`n")
ab_ab ab{ab.ab"ab[ab`nab

Заменит здесь все "a" на титульные.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

120 (изменено: serzh82saratov, 2015-11-18 16:15:05)

Re: AHK: Break и Shift+Break как в пунто свитчере

Собственно изначальный вопрос и не задал:

delimiters := "`n {([,._"""

SelText = абв_абв абв{абв.абв"абв[абв`nабв,абв

SelText := RegExReplace(SelText, "(.)", Format("{:Ts}", SubStr(SelText, 1, 1)), , 1), pos := 1
While (pos := RegExMatch(SelText, "S)[\Q" delimiters "\E][a-zа-яё]", M, pos))
	SelText := RegExReplace(SelText, ".", Format("{:Ts}", SubStr(M, 2, 1)), , 1, ++pos)
	; или   SelText := SubStr(SelText, 1, pos) Format("{:Ts}", SubStr(M, 2, 1)) SubStr(SelText, ++pos+1)
MsgBox % SelText

Можно ли упростить?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

121

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker
В последней версии строку из символов /// или {{{ не переводит, хотя например [[[ или /{[ переводит.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

122

Re: AHK: Break и Shift+Break как в пунто свитчере

Фигурные скобки добавлю, а по поводу слешей — так они могут быть и в русской, и в английской раскладке, если текст состоит только из них — непонятно, куда переводить. Можно ориентироваться на текущую раскладку, конечно, но не стопроцентный вариант — вдруг юзер уже сам перевёл в другую.

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

123

Re: AHK: Break и Shift+Break как в пунто свитчере

Добавил недостающие символы. Если невозможно определить раскладку языка, исходя из анализа напечатанных символов, скрипт ориентируется на текущую раскладку окна.

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

124

Re: AHK: Break и Shift+Break как в пунто свитчере

Как исправить следующие ошибки:
1. :^ (шифт-6) не перекодируется.
2. (iban-6) перекодируется на (iban-(шифт-6)
3. http://ф перекодируется на реезЖ..ф - хотя я набрал только "ф" и, по логике, должно получиться http://a

И как сделать:
4. Мне нужна перекодировка СТРОГО на раскладку, противоположную текущей (например, если смесь тех и этих букв, я именно раскладкой укажу нужное направление).
5. Без учёта пробелов и переводов строк, а то перекодируется лишнее, а в текстовых полях на некоторых сайтах делается лишний перевод строки.
По-моему, если от набранного слова отошёл - нечего мудрить, перекодируешь его через выделение.

Спасибо, вообще очень классный и нужный скрипт. Я сам писал такой, но там не было смены регистра, и он не работает с AHK_L.

125

Re: AHK: Break и Shift+Break как в пунто свитчере

PS. Посмотрел и разобрался. Спасибо.

126

Re: AHK: Break и Shift+Break как в пунто свитчере

AlanCast пишет:

1. :^ (шифт-6) не перекодируется.

Почему-то забыл эти символы добавить в набор, отредактировал в Коллекции.

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

127 (изменено: stealzy, 2016-09-02 16:38:21)

Re: AHK: Break и Shift+Break как в пунто свитчере

Кстати, велосипед ConvertRegistr() можно заменить на StringUpper/StringLower.

128

Re: AHK: Break и Shift+Break как в пунто свитчере

stealzy, поясните.

пРИВЕТ => Привет

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

129

Re: AHK: Break и Shift+Break как в пунто свитчере

Наверное можно подсократить:

text := "пРИВЕТ"
msgbox % RegExReplace(text, "([А-ЯЁA-Z])|([а-яёa-z])", "$L1$U2")

130

Re: AHK: Break и Shift+Break как в пунто свитчере

Да, так работает, интересное решение.

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

131 (изменено: stealzy, 2016-09-03 11:09:00)

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker, упустил момент с разнорегистровым текстом.
А по-польски слабо список символов составить? :trollface

MsgBox % StringInvertCase("cZEŚĆ W jĘZYKU pOLSKIM")

StringInvertCase(str) {
	Loop, Parse, str
	{
		StringUpper charUpper , A_LoopField
		StringLower charLower , A_LoopField
		charInvert := (charUpper == A_LoopField) ? charLower : charUpper 
		strInvert .= charInvert
	}
	Return strInvert
}

132

Re: AHK: Break и Shift+Break как в пунто свитчере

stealzy пишет:

А по-польски слабо список символов составить?

Ну, это вряд ли пригодится. Хотя универсальность, конечно, приятна. Если бы ещё это как-то эффектно решить. Стал думать, можно ли как-то определить регистр символа? Ничего в голову не приходит.

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

133 (изменено: stealzy, 2016-09-03 11:09:53)

Re: AHK: Break и Shift+Break как в пунто свитчере

Можно глянуть как устроена StringUpper в коде. Наверняка не списком перечисляют весь юникод :-).

134

Re: AHK: Break и Shift+Break как в пунто свитчере

Можно ещё Translit добавить, полезно например вставить в путь к файлу.

Translit() {
	Static RU := "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
	, ENG := ["A","B","V","G","D","E","Yo","Zh","Z","I","Y","K","L","M","N","O"
	,"P","R","S","T","U","F","Kh","Ts","Ch","Sh","Sch","'","I","","E","Yu","Ya"]
	
	If (SelText := GetWord(TempClipboard)) = ""
		Return Clipboard := TempClipboard
	Loop, Parse, SelText
		If p := (RU ~= "Si)\Q" A_LoopField "\E")
			Translit .= (A_LoopField ~= "S)[А-ЯЁ]") ? ENG[p] : Format("{:L}", ENG[p])
		Else
			Translit .= A_LoopField
	Clipboard := Translit
	SendInput, ^{vk56}   ; Ctrl + V
	Sleep, 200
	Clipboard := TempClipboard
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

135 (изменено: mar9i, 2017-09-24 19:45:40)

Re: AHK: Break и Shift+Break как в пунто свитчере

Было б не плохо обновить в теме http://forum.script-coding.com/viewtopic.php?id=7186 полностью код, со всеми изменениями. Мне лично не хватает конвертирование "Заглавные Буквы" и "Первая заглавная". Пока чайник, не выходит написать код самому, помогите плиз.

136 (изменено: Nerv0z, 2019-09-30 10:03:33)

Re: AHK: Break и Shift+Break как в пунто свитчере

Не асилил читать всю тему, извините, если повторюсь.
Не работает последний вариант вашего скрипта у меня.. нажимаю перевод и получаю вместо слова привет из английской раскладки:
ghbdtn
вот это :
§РРЇћ‘

может кодировка  поехала в скрипте ??

137

Re: AHK: Break и Shift+Break как в пунто свитчере

Убедитесь, что установлена актуальная версия AHK, и что скрипт сохранен в кодировке UTF-8 c BOM.

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

138

Re: AHK: Break и Shift+Break как в пунто свитчере

stealzy пишет:

А по-польски слабо список символов составить? :trollface

Оказалось не слабо:

MsgBox % StringInvertCase("cZEŚĆ W jĘZYKU pOLSKIM", langID := 0x415)

StringInvertCase(str, langID) {
   VarSetCapacity(buff, 256, 0), VarSetCapacity(key, 2)
   layout := DllCall("LoadKeyboardLayout", "Str", "0000" . Format("{:04X}", langID), "UInt", 0)
   Loop, Parse, str
   {
      res := DllCall("VkKeyScanEx", UShort, Ord(A_LoopField), UInt, layout, UShort)
      vk := res & 0xFF, shift := res >> 8
      NumPut(shift ? 0 : 128, buff, 16, "Char")
      DllCall("ToUnicodeEx", UInt, vk, UInt, 0, Ptr, &buff, Str, key, Int, 2, UInt, 0, Ptr, layout)
      invertedStr .= key
   }
   Return invertedStr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

139

Re: AHK: Break и Shift+Break как в пунто свитчере

stealzy, а у вас польская раскладка установлена?

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

140

Re: AHK: Break и Shift+Break как в пунто свитчере

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

141

Re: AHK: Break и Shift+Break как в пунто свитчере

Ну да, я предполагаю. Сейчас код выше у меня работает, но символами из английской раскладки. Установил в языковой панели польскую — ничего не изменилось, наверное ещё языковой пакет нужен, но пока не устанавливал.

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

142 (изменено: serzh82saratov, 2019-11-13 00:52:48)

Re: AHK: Break и Shift+Break как в пунто свитчере

Обычный польский показывает латиницу, попробуй в нём азербайджан.
https://i.imgur.com/Hn1Pv0t.png












Например "E" латинская.








https://i.imgur.com/oM5sQuH.png

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

143

Re: AHK: Break и Shift+Break как в пунто свитчере

Нет, а что?

stealzy пишет:

устроена StringUpper в коде. Наверняка не списком перечисляют

А может и списком перечисляют для восточноевропейских языков через таблицы трансляции. В любом случае я за стандартную библиотеку.

teadrinker пишет:

StringInvertCase(str, langID)

Раз у вас не юникод, то второй параметр наверно нужен, но логичнее тогда передавать encoding.

144

Re: AHK: Break и Shift+Break как в пунто свитчере

Используется стандартная функция CharLower/CharUpper.

145 (изменено: stealzy, 2019-11-13 03:02:10)

Re: AHK: Break и Shift+Break как в пунто свитчере

Malcev пишет:

стандартная функция

Я и не сомневался. Под ее капотом вполне вероятно таблицы трансляции.

P.S. 8 лет теме, 5 лет комменту с ConvertRegistr(Text), 3 года комменту с StringInvertCase.
Может лет через пять кому-то снова будет не слабо и мы увидим новый виток обсуждения преобразования регистра, если все это еще будет существовать.

146

Re: AHK: Break и Shift+Break как в пунто свитчере

Вроде мой код корректно работает, конкретно с польским что-то непонятное, но например с немецким, если установить немецкую раскладку, получается. öÄü —> ÖäÜ

stealzy пишет:

Может лет через пять кому-то снова будет не слабо и мы увидим новый виток обсуждения преобразования регистра

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

stealzy пишет:

Раз у вас не юникод, то второй параметр наверно нужен, но логичнее тогда передавать encoding.

Можете пояснить эту мысль?

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

147

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker пишет:

конкретно с польским что-то непонятное

Я установил польский и скачал пакет. Но если печатать на польском, то все символы один в один как инглиш. У тебя как?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

148

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker, не понял что значит преобразование раскладки?
Encoding - кодировка, как единственная нужная информация для однозначной идентификации текста.
serzh82saratov, а там вся фишка в диакритических знаках - сочетания с Alt.

149

Re: AHK: Break и Shift+Break как в пунто свитчере

В общем поляков в *опу со своими "фишками", ну и китаёз. Делаем для нормальных (адекватных) национальностей. А эти пускай с китайского на польский сами пишут, одним разом, чтобы потом ни в коем случае, темы не поднимать, а то блин всякие привыкли через 5 лет отвечать, позор то какой, ой-ой-ой.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

150 (изменено: teadrinker, 2019-11-13 21:06:06)

Re: AHK: Break и Shift+Break как в пунто свитчере

serzh82saratov пишет:

Но если печатать на польском, то все символы один в один как инглиш. У тебя как?

Я на Win 7 пробовал, там если так выбрать

https://i.imgur.com/VkDB92O.png

тогда все латинские, а если отметить чекбокс Дополнительно, ещё ветка разворачивается, и если там выбрать

https://i.imgur.com/yMEkgYT.png

тогда диакритические знаки появляются. Но при нажатии Shift + [клавиша с диакритическим знаком] вместо того же знака в верхнем регистре появляется другой знак.

Поставил немецкую — там всё нормально.

stealzy пишет:

Encoding - кодировка, как единственная нужная информация для однозначной идентификации текста.

Путаете, это не тот случай. Кодировка нужна, когда символы задаются цифровым кодом, а в данном случае они однозначно задаются графически.

stealzy пишет:

не понял что значит преобразование раскладки?

А весь топик-то о чём? Изначально задача была изменить раскладку текста, написанного в неправильной раскладке: ghbdtn —> привет.

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

151 (изменено: serzh82saratov, 2019-11-17 10:53:55)

Re: AHK: Break и Shift+Break как в пунто свитчере

Удалено.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru
Win10x64, AutoHotkey_L v1.1.30.03 (Unicode 32-bit). AhkSpy, Hotkey, ClockGui

152

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker пишет:

А весь топик-то о чём?

Просто думал раз написали функцию StringInvertCase(str, langID) про регистр продолжаем, конкретно в ней без раскладок и языков проще обойтись.

153 (изменено: Malcev, 2019-11-14 00:57:44)

Re: AHK: Break и Shift+Break как в пунто свитчере

teadrinker пишет:

Вроде мой код корректно работает, конкретно с польским что-то непонятное

Просто в твоём коде не учтены все модификаторы:

StringInvertCase("nNńŃ", langID := 0x415)

StringInvertCase(str, langID) {
   VarSetCapacity(buff, 256, 0), VarSetCapacity(key, 2)
   layout := DllCall("LoadKeyboardLayout", "Str", "0000" . Format("{:04X}", langID), "UInt", 0)
   Loop, Parse, str
   {
      res := DllCall("VkKeyScanEx", UShort, Ord(A_LoopField), UInt, layout, UShort)
      vk := res & 0xFF, shift := res >> 8
      msgbox % shift
      NumPut(shift ? 0 : 128, buff, 16, "Char")
      DllCall("ToUnicodeEx", UInt, vk, UInt, 0, Ptr, &buff, Str, key, Int, 2, UInt, 0, Ptr, layout)
      invertedStr .= key
   }
   Return invertedStr
}

1

Either SHIFT key is pressed.

2

Either CTRL key is pressed.

4

Either ALT key is pressed.

8

The Hankaku key is pressed

16

Reserved (defined by the keyboard layout driver).

32

Reserved (defined by the keyboard layout driver).

https://docs.microsoft.com/en-us/window … keyscanexw

154

Re: AHK: Break и Shift+Break как в пунто свитчере

Ага, точно, правильно так:

shift := (res >> 8)&1

Но всё равно у меня с польской диакритикой не работает.

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

155

Re: AHK: Break и Shift+Break как в пунто свитчере

Еще надо ALT, Ctrl и Hankaku добавлять в NumPut.

156 (изменено: teadrinker, 2019-11-14 02:24:15)

Re: AHK: Break и Shift+Break как в пунто свитчере

Вроде вышло:

MsgBox, % StringInvertCase("nNńŃ", langID := 0x415)

StringInvertCase(str, langID) {
   VarSetCapacity(buff, 256, 0), VarSetCapacity(key, 2)
   layout := DllCall("LoadKeyboardLayout", "Str", "0000" . Format("{:04X}", langID), "UInt", 0)
   Loop, Parse, str
   {
      res := DllCall("VkKeyScanEx", "UShort", Ord(A_LoopField), "UInt", layout, "UShort")
      vk := res & 0xFF, modifiers := res >> 8
      shift := modifiers & 1, ctrl := modifiers & 2, alt := modifiers & 4, hankaku := modifiers & 8
      for k, v in {ctrl: 0x11, alt: 0x12, hankaku: 0xF3}
         NumPut(%k% ? 128 : 0, buff, v, "Char")
      NumPut(shift ? 0 : 128, buff, 0x10, "Char")
      DllCall("ToUnicodeEx", "UInt", vk, "UInt", 0, "Ptr", &buff, "Str", key, "Int", 2, "UInt", 0, "Ptr", layout)
      invertedStr .= key
   }
   Return invertedStr
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

157

Re: AHK: Break и Shift+Break как в пунто свитчере

Теперь ещё вопрос остался, как первые четыре цифры в названии раскладки определять, они не всегда "0000".

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

158

Re: AHK: Break и Shift+Break как в пунто свитчере

Через список из реестра?

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts

159 (изменено: teadrinker, 2019-11-14 12:16:31)

Re: AHK: Break и Shift+Break как в пунто свитчере

Есть 00000415 и 00010415. Как понять, какая нужна? Мне нужно как-то соотнести значения вида 0x04150415 и "00000415".
Можно, конечно, запускать LoadKeyboardLayout, перебирая "0000", "0001" ... до тех пор, пока не получим в результате существующую раскладку, но, кроме того, что это не элегантное решение, оно ещё и много времени занимает.

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

160

Re: AHK: Break и Shift+Break как в пунто свитчере

Как я понимаю, надо загружать дефолтную раскладку:

An application can and will typically load the default input locale identifier or IME for a language and can do so by specifying only a string version of the language identifier.

https://docs.microsoft.com/en-us/window … ardlayouta
Cписок дефолтных раскладок тут:
https://docs.microsoft.com/en-us/window … uage-packs

161

Re: AHK: Break и Shift+Break как в пунто свитчере

Нет, дефолтная не пойдет для задачи смены раскладки.

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

162 (изменено: Malcev, 2019-11-16 17:58:05)

Re: AHK: Break и Shift+Break как в пунто свитчере

А как по-другому?
Например с польской 00000415 и 00010415 - это не названия раскладок, а их значения.
Названия же у 00000415 будет такое же, а у 00010415 - d0010415.
Названия, после установки, можно посмотреть здесь:

HKEY_CURRENT_USER\Keyboard Layout\Preload

Но с такой раскладкой данный код уже не работает

MsgBox, % StringInvertCase("nNńŃ", langID := 0x415)

StringInvertCase(str, langID) {
   VarSetCapacity(buff, 256, 0), VarSetCapacity(key, 2)
   msgbox % layout := DllCall("LoadKeyboardLayout", "Str", "d0010415", "UInt", 0)
   Loop, Parse, str
   {
      msgbox % res := DllCall("VkKeyScanEx", "UShort", Ord(A_LoopField), "UInt", layout, "UShort")
      vk := res & 0xFF, modifiers := res >> 8
      shift := modifiers & 1, ctrl := modifiers & 2, alt := modifiers & 4, hankaku := modifiers & 8
      for k, v in {ctrl: 0x11, alt: 0x12, hankaku: 0xF3}
         NumPut(%k% ? 128 : 0, buff, v, "Char")
      NumPut(shift ? 0 : 128, buff, 0x10, "Char")
      DllCall("ToUnicodeEx", "UInt", vk, "UInt", 0, "Ptr", &buff, "Str", key, "Int", 2, "UInt", 0, "Ptr", layout)
      invertedStr .= key
   }
   Return invertedStr
}

163

Re: AHK: Break и Shift+Break как в пунто свитчере

Malcev пишет:

Например с польской 00000415 и 00010415 - это не названия раскладок, а их значения.

Не знаю насчёт понятия "значение", у раскладки есть layout name, которое можно получить функцией GetKeyboardLayoutName, это как раз значение вида "00000415", и есть locale id, которое выдаёт функция GetKeyboardLayout. С layout name по моему текущему опыту функция LoadKeyboardLayout всегда работает. Проблема только в том, что GetKeyboardLayoutName работает только со своей веткой, поэтому приходится сначала сменить раскладку своей ветки, другого способа получить layout name я пока не нашёл.

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

164

Re: AHK: Break и Shift+Break как в пунто свитчере

Да, действительно, проверил - с названиями раскладок я ошибся.
Но так не работает:

MsgBox, % StringInvertCase("nNńŃ", langID := 0x415)

StringInvertCase(str, langID) {
   VarSetCapacity(buff, 256, 0), VarSetCapacity(key, 2)
   msgbox % layout := DllCall("LoadKeyboardLayout", "Str", "00010415", "UInt", 0)
   Loop, Parse, str
   {
      msgbox % res := DllCall("VkKeyScanEx", "UShort", Ord(A_LoopField), "UInt", layout, "UShort")
      vk := res & 0xFF, modifiers := res >> 8
      shift := modifiers & 1, ctrl := modifiers & 2, alt := modifiers & 4, hankaku := modifiers & 8
      for k, v in {ctrl: 0x11, alt: 0x12, hankaku: 0xF3}
         NumPut(%k% ? 128 : 0, buff, v, "Char")
      NumPut(shift ? 0 : 128, buff, 0x10, "Char")
      DllCall("ToUnicodeEx", "UInt", vk, "UInt", 0, "Ptr", &buff, "Str", key, "Int", 2, "UInt", 0, "Ptr", layout)
      invertedStr .= key
   }
   Return invertedStr
}

165

Re: AHK: Break и Shift+Break как в пунто свитчере

А почему ты именно "00010415" подставляешь, а не "00000415"? Может, у тебя и нету первой. Раскладка должна быть установлена.

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

166

Re: AHK: Break и Shift+Break как в пунто свитчере

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

167

Re: AHK: Break и Shift+Break как в пунто свитчере

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

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

168

Re: AHK: Break и Shift+Break как в пунто свитчере

С русской mnemonic, например с буквой ё тоже не сработает.

169

Re: AHK: Break и Shift+Break как в пунто свитчере

Тут всё расписано:

Further proof that VkKeyScanEx sucks

http://archives.miloush.net/michkap/arc … 48742.html

170

Re: AHK: Break и Shift+Break как в пунто свитчере

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

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

171

Re: AHK: Break и Shift+Break как в пунто свитчере

А чем массивы не устраивают?

172

Re: AHK: Break и Shift+Break как в пунто свитчере

А как на все раскладки массивы сделаешь?

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

173

Re: AHK: Break и Shift+Break как в пунто свитчере

Ну если много свободного времени и желания, то можно сделать.
Только зачем на все?

174

Re: AHK: Break и Shift+Break как в пунто свитчере

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

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

175

Re: AHK: Break и Shift+Break как в пунто свитчере

Ну тогда задача невыполнима.

176

Re: AHK: Break и Shift+Break как в пунто свитчере

Почему, выполнима на 90%.

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

177 (изменено: Malcev, 2019-11-19 22:23:12)

Re: AHK: Break и Shift+Break как в пунто свитчере

Можно попробовать увеличить процент, подгружая dll раскладки и анализируя его алгоритм, по типу Microsoft Keyboard Layout Creator.
https://www.codeproject.com/Articles/43 … or-in-32-6
http://archives.miloush.net/michkap/arc … 81107.html

178

Re: AHK: Break и Shift+Break как в пунто свитчере

Спасибо, попробую разобраться.

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