51

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

Пробовал... Только ненашел такого места где он так работает... Я не зареген в контакте.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

52

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

В Одноклассниках также.

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

53

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

В строках логин пароля также? Ато я и там незареген.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

54

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

Нет, в логине как раз нормально определяется.

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

55 (изменено: Alectric, 2011-11-03 22:12:49)

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

Сейчас взял пароль у брата, зашел... Щас посмотрю.


Да нет, все нормально работает.
Только после вставки текста каретка в начало строки уходит.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

56

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

А браузер какой?

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

57 (изменено: Alectric, 2011-11-03 22:14:29)

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

Opera
О программе
Информация о версии
Версия:
10.01
Сборка:
1844
Платформа:
Win32
Система:
Windows XP
Версия Java:
Java не установлен
Модуль XHTML+Voice:
Плагин не загружен

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

58

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

Немного оффтопика:
После включения обсуждаемого скрипта в мой основной перестали срабатывать хоткеи вида:

vkA5 & vk20::SendInput % GetKeyState("Shift","P") ? Chr(0x200B) : Chr(0x00A0)

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

59

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

В IE работает, в FF — нет.

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

60

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

creature.ws пишет:

Немного оффтопика:
После включения обсуждаемого скрипта в мой основной перестали срабатывать хоткеи вида:

vkA5 & vk20::SendInput % GetKeyState("Shift","P") ? Chr(0x200B) : Chr(0x00A0)

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

А что за символы Chr(0x200B) и Chr(0x00A0)? У меня такой код не работает ни в ANSI, ни в Unicode версии.

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

61 (изменено: Alectric, 2011-11-03 22:35:52)

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

Нажимай с зажатым шифтом, вместо символа знак вопроса появится.
Судя по хекс редактору отправляется 3F с шифтом и A0 без.

У меня работает в одном скрипте с обсуждаемым.

Win 7 x64
AHK v1.1.24.00
                       Справка тебе в помощь.

62 (изменено: creature.ws, 2011-11-03 22:44:51)

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

teadrinker пишет:

А что за символы Chr(0x200B) и Chr(0x00A0)? У меня такой код не работает ни в ANSI, ни в Unicode версии.

Chr(0x200B) - ZERO-WIDTH SPACE
Chr(0x00A0) - неразрывный пробел

Возможно пример неудачный
Использую подобие раскладки Бирмана:


; фрагмент
vkA5 & vkBC::SendInput % (GetKeyState("Shift", "P")) ? Chr(0xAB) : Chr(60)  ;< or <<
vkA5 & vkBE::SendInput % (GetKeyState("Shift", "P")) ? Chr(0xBB) : Chr(62)  ;>  or >>
vkA5 & vkDC::SendInput % (GetKeyState("Shift", "P")) ? Chr(0xA6) : Chr(124) ;|
vkA5 & vkBF::SendInput % (GetKeyState("Shift", "P")) ? Chr(191) : Chr(0x2026) ; ? or ...
vkA5 & vkBD::SendInput % (GetKeyState("Shift", "P")) ? Chr(0x2212) : Chr(0x2014) ; -
vkA5 & vkBB::SendInput % (GetKeyState("Shift", "P")) ? Chr(0xB1) : Chr(0x2260) ;± or notequal
vkA5 & vk20::SendInput % (GetKeyState("Shift", "P")) ? Chr(0x200B) : Chr(0xA0) ; space
; и т.д.

63

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

У меня работает это, если добавить в конец кода:

vkA5 & vkBC::SendInput % (GetKeyState("Shift", "P")) ? Chr(0xAB) : Chr(60)  ;< or <<

Какой вариант скрипта используешь?

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

64

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

Александр_ пишет:

и алгоритм я бы иной выбрал .

Да, алгоритм конвертации можно подсократить, я слегка перемудрил.

SetBatchLines, -1
SetKeyDelay, 0

F11::
   Critical
   TempClipboard := ClipboardAll
   Clipboard =
   SendInput, ^{vk43}
   ClipWait, 0

   SelText := ErrorLevel ? GetWord() : Clipboard
   pResult := ConvertText(SelText)

   Clipboard := StrGet(pResult + 4)
   SendInput, ^{vk56}

   Sleep, 200
   Clipboard := TempClipboard
   TempClipboard := SelText := ""

   SwitchLocale(NumGet(pResult+0))
   Return

GetWord()
{
   While A_Index < 100
   {
      Clipboard =
      SendInput, +{Left}
      SendInput, ^{vk43}
      ClipWait, 0
      if ErrorLevel
         Return

      Len := StrLen(Clipboard)
      if (Len = PrevLen)
         Return Clipboard

      PrevLen := Len
      s := SubStr(Clipboard, 1, 1)
      if s in %A_Space%,%A_Tab%,`n,`r
      {
         SendInput, +{Right}
         s := SubStr(Clipboard, 1, 2)
         Return SubStr(ClipBoard, RegExMatch(s, "[\n\r]{2}") ? 3 : 2)
      }
   }
}

ConvertText(Text)
{
   static Result

   Cyr = ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю
   Lat = ~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>``qwertyuiop[]asdfghjkl;'zxcvbnm,.

   Loop, parse, Text
   {
      found =
      if found := InStr(Lat, A_LoopField, 1)
         NewText .= SubStr(Cyr, found, 1), lastfound := 2

      if !found
         if found := InStr(Cyr, A_LoopField, 1)
            NewText .= SubStr(Lat, found, 1), lastfound := 1

      if !found
         NewText .= A_LoopField
   }
   VarSetCapacity(Result, 4 + StrPut(NewText))
   NumPut(lastfound, Result), StrPut(NewText, &Result + 4)
   Return &Result
}

SwitchLocale(lastfound)
{
   SetFormat, IntegerFast, H
   VarSetCapacity(List, 8)
   DllCall("GetKeyboardLayoutList", Int, 2, UInt, &List)
   Locale1 := NumGet(List)
   b := SubStr(Locale2 := NumGet(List, 4), -3) = 0409
   En := b ? Locale2 : Locale1
   Ru := b ? Locale1 : Locale2
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, lastfound = 1 ? En : Ru,, A
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

65 (изменено: creature.ws, 2011-11-04 08:56:28)

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

Вопрос-оффтопик закрыт, скрипт конвертер в нестандартном поведении хоткеев не замешан.

Дело было в хитром взаимодействии скомпилированной «старой» ANSI-версии конвертера со скриптом запущенным в AHK_L обеспечивавшем работу хоткеев вида

vkA5 & vkBC::SendInput % (GetKeyState("Shift", "P")) ? Chr(0xAB) : Chr(60)  ;< or <<

Замена  SendInput на Send восстановила функции хоткеев.

66 (изменено: creature.ws, 2011-11-05 01:09:16)

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

Странно, но при попытке перекодирования текста > 40 символов происходит стабильное падение AHK

Faulting application name: AutoHotkey.exe, version: 1.1.5.1, time stamp: 0x4e9a4220
Faulting module name: AutoHotkey.exe, version: 1.1.5.1, time stamp: 0x4e9a4220
Exception code: 0xc0000005
Fault offset: 0x00000000000cdfb9

Win7 x64, ahk_l x64 unicode

//add
А иногда в конец перекодированной фразы добавляется некое число вида: 3636176096

67

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

Так попробуй:

SetBatchLines, -1
SetKeyDelay, 0

F11::
   Critical
   TempClipboard := ClipboardAll
   Clipboard =
   SendInput, ^{vk43}
   ClipWait, 0

   SelText := ErrorLevel ? GetWord() : Clipboard
   pResult := ConvertText(SelText)

   Clipboard := StrGet(pResult + A_PtrSize)
   SendInput, ^{vk56}

   Sleep, 200
   Clipboard := TempClipboard
   TempClipboard := SelText := ""
   SwitchLocale(NumGet(pResult+0))
   Return

GetWord()
{
   While A_Index < 100
   {
      Clipboard =
      SendInput, +{Left}
      SendInput, ^{vk43}
      ClipWait, 0
      if ErrorLevel
         Return

      Len := StrLen(Clipboard)
      if (Len = PrevLen)
         Return Clipboard

      PrevLen := Len
      s := SubStr(Clipboard, 1, 1)
      if s in %A_Space%,%A_Tab%,`n,`r
      {
         SendInput, +{Right}
         s := SubStr(Clipboard, 1, 2)
         Return SubStr(ClipBoard, RegExMatch(s, "[\n\r]{2}") ? 3 : 2)
      }
   }
}

ConvertText(Text)
{
   static Result

   Cyr = ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю
   Lat = ~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>``qwertyuiop[]asdfghjkl;'zxcvbnm,.

   Loop, parse, Text
   {
      found =
      if found := InStr(Lat, A_LoopField, 1)
         NewText .= SubStr(Cyr, found, 1), lastfound := 2

      if !found
         if found := InStr(Cyr, A_LoopField, 1)
            NewText .= SubStr(Lat, found, 1), lastfound := 1

      if !found
         NewText .= A_LoopField
   }
   VarSetCapacity(Result, A_PtrSize + StrPut(NewText))
   NumPut(lastfound, &Result), StrPut(NewText, &Result + A_PtrSize)
   Return &Result
}

SwitchLocale(lastfound)
{
   SetFormat, IntegerFast, H
   VarSetCapacity(List, 8)
   DllCall("GetKeyboardLayoutList", Int, 2, UInt, &List)
   Locale1 := NumGet(List)
   b := SubStr(Locale2 := NumGet(List, 4), -3) = 0409
   En := b ? Locale2 : Locale1
   Ru := b ? Locale1 : Locale2
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, lastfound = 1 ? En : Ru,, A
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

68

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

Попробовал, явных изменений не заметил

Faulting application name: AutoHotkey.exe, version: 1.1.5.1, time stamp: 0x4e9a4220
Faulting module name: ntdll.dll, version: 6.1.7601.17514, time stamp: 0x4ce7c8f9
Exception code: 0xc0000374
Fault offset: 0x00000000000c40f2

69

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

А текст где написан? Выделял ли перед конвертацией?

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

70 (изменено: creature.ws, 2011-11-05 01:36:42)

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

Текст написан во всех доступных EditBox'ах, winword, akelpad, firefox etc.
Да, текст выделяется перед конвертацией, GetWord() не используется.
Вот образец: (в этом виде и используется)

SetBatchLines, -1
SetKeyDelay, 0

CapsLock::
!Capslock::
+CapsLock::

  KeyWait, CapsLock
  
  If (A_ThisHotkey = "CapsLock") {
    SendInput {LAlt Down}{Shift Down}{LAlt Up}{Shift Up}
    Sleep 50
    ToolTip, % InputLayout(), % A_CaretX + 10, % A_CaretY - 20
    SetTimer,REMOVE_TOOLTIP, 500
    Return
    }
  if (A_ThisHotkey = "!Capslock" )
    SendInput {Shift Down}{Home}{Shift Up}

  Critical
  TempClipboard := ClipboardAll
  Clipboard =
  SendInput, ^{vk43}
  ClipWait, 0
  If (ErrorLevel)
    Return
  SelText := Clipboard
  pResult := ConvertText(SelText)
  Clipboard := StrGet(pResult + A_PtrSize)
  SendInput, ^{vk56}
  Sleep, 200
  Clipboard := TempClipboard
  TempClipboard := SelText := ""
  SwitchLocale(NumGet(pResult+0))
  Critical, Off
  Sleep 50
  ToolTip, % InputLayout(), % A_CaretX + 10, % A_CaretY - 20
  SetTimer,REMOVE_TOOLTIP, 500
Return

REMOVE_TOOLTIP:
  SetTimer,REMOVE_TOOLTIP,off
  ToolTip
Return

InputLayout() {
  SetFormat, Integer, H
  WinGet, WinID,, A
  ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", "0")
  HKL:=DllCall("GetKeyboardLayout", "uint", ThreadID, "uint")
  VarSetCapacity( sKbd, 260, 0 )
  DllCall("GetLocaleInfo","uint",HKL>>16,"uint",0x1001, "str",sKbd, "uint",260)
  Return %sKbd%
}

ConvertText(Text)
{
   static Result

   Cyr = ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю
   Lat = ~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>``qwertyuiop[]asdfghjkl;'zxcvbnm,.

   Loop, parse, Text
   {
      found =
      if found := InStr(Lat, A_LoopField, 1)
         NewText .= SubStr(Cyr, found, 1), lastfound := 2

      if !found
         if found := InStr(Cyr, A_LoopField, 1)
            NewText .= SubStr(Lat, found, 1), lastfound := 1

      if !found
         NewText .= A_LoopField
   }
   VarSetCapacity(Result, A_PtrSize + StrPut(NewText))
   NumPut(lastfound, &Result), StrPut(NewText, &Result + 4)
   Return &Result
}

SwitchLocale(lastfound)
{
   SetFormat, IntegerFast, H
   VarSetCapacity(List, 8)
   DllCall("GetKeyboardLayoutList", Int, 2, UInt, &List)
   Locale1 := NumGet(List)
   b := SubStr(Locale2 := NumGet(List, 4), -3) = 0409
   En := b ? Locale2 : Locale1
   Ru := b ? Locale1 : Locale2
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, lastfound = 1 ? En : Ru,, A
}

71

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

Не, это я вначале не совсем правильно написал, теперь исправлено.
Там вместо

NumPut(lastfound, &Result), StrPut(NewText, &Result + 4)

теперь

NumPut(lastfound, &Result), StrPut(NewText, &Result + A_PtrSize)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

72

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

Исправлено, падает.

SetBatchLines, -1
SetKeyDelay, 0

CapsLock::
!Capslock::
+CapsLock::

  KeyWait, CapsLock
  
  If (A_ThisHotkey = "CapsLock") {
    SendInput {LAlt Down}{Shift Down}{LAlt Up}{Shift Up}
    Sleep 50
    ToolTip, % InputLayout(), % A_CaretX + 10, % A_CaretY - 20
    SetTimer,REMOVE_TOOLTIP, 500
    Return
    }
  if (A_ThisHotkey = "!Capslock" )
    SendInput {Shift Down}{Home}{Shift Up}

  Critical
  TempClipboard := ClipboardAll
  Clipboard =
  SendInput, ^{vk43}
  ClipWait, 0
  If (ErrorLevel)
    Return
  SelText := Clipboard
  pResult := ConvertText(SelText)
  Clipboard := StrGet(pResult + A_PtrSize)
  SendInput, ^{vk56}
  Sleep, 200
  Clipboard := TempClipboard
  TempClipboard := SelText := ""
  SwitchLocale(NumGet(pResult+0))
  Critical, Off
  Sleep 50
  ToolTip, % InputLayout(), % A_CaretX + 10, % A_CaretY - 20
  SetTimer,REMOVE_TOOLTIP, 500
Return

REMOVE_TOOLTIP:
  SetTimer,REMOVE_TOOLTIP,off
  ToolTip
return

InputLayout() {
  SetFormat, Integer, H
  WinGet, WinID,, A
  ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", "0")
  HKL:=DllCall("GetKeyboardLayout", "uint", ThreadID, "uint")
  VarSetCapacity( sKbd, 260, 0 )
  DllCall("GetLocaleInfo","uint",HKL>>16,"uint",0x1001, "str",sKbd, "uint",260)
  Return %sKbd%
}

ConvertText(Text)
{
   static Result

   Cyr = ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю
   Lat = ~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>``qwertyuiop[]asdfghjkl;'zxcvbnm,.

   Loop, parse, Text
   {
      found =
      if found := InStr(Lat, A_LoopField, 1)
         NewText .= SubStr(Cyr, found, 1), lastfound := 2

      if !found
         if found := InStr(Cyr, A_LoopField, 1)
            NewText .= SubStr(Lat, found, 1), lastfound := 1

      if !found
         NewText .= A_LoopField
   }
   VarSetCapacity(Result, A_PtrSize + StrPut(NewText))
   NumPut(lastfound, &Result), StrPut(NewText, &Result + A_PtrSize)
   Return &Result
}

SwitchLocale(lastfound)
{
   SetFormat, IntegerFast, H
   VarSetCapacity(List, 8)
   DllCall("GetKeyboardLayoutList", Int, 2, UInt, &List)
   Locale1 := NumGet(List)
   b := SubStr(Locale2 := NumGet(List, 4), -3) = 0409
   En := b ? Locale2 : Locale1
   Ru := b ? Locale1 : Locale2
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, lastfound = 1 ? En : Ru,, A
}

73

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

Попробуй исправить строчку

VarSetCapacity(Result, A_PtrSize + StrPut(NewText))

на

VarSetCapacity(Result, A_PtrSize + StrPut(NewText)*2)
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

74

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

А так не падает Большое спасибо!

Для отчётности:

SetBatchLines, -1
SetKeyDelay, 0

CapsLock::
!Capslock::
+CapsLock::

  KeyWait, CapsLock
  
  If (A_ThisHotkey = "CapsLock") {
    SendInput {LAlt Down}{Shift Down}{LAlt Up}{Shift Up}
    Sleep 50
    ToolTip, % InputLayout(), % A_CaretX + 10, % A_CaretY - 20
    SetTimer,REMOVE_TOOLTIP, 500
    Return
    }
  if (A_ThisHotkey = "!Capslock" )
    SendInput {Shift Down}{Home}{Shift Up}

  Critical
  TempClipboard := ClipboardAll
  Clipboard =
  SendInput, ^{vk43}
  ClipWait, 0
  If (ErrorLevel)
    Return
  SelText := Clipboard
  pResult := ConvertText(SelText)
  Clipboard := StrGet(pResult + A_PtrSize)
  SendInput, ^{vk56}
  Sleep, 200
  Clipboard := TempClipboard
  TempClipboard := SelText := ""
  SwitchLocale(NumGet(pResult+0))
  Critical, Off
  Sleep 50
  ToolTip, % InputLayout(), % A_CaretX + 10, % A_CaretY - 20
  SetTimer,REMOVE_TOOLTIP, 500
Return

REMOVE_TOOLTIP:
  SetTimer,REMOVE_TOOLTIP,off
  ToolTip
return

InputLayout() {
  SetFormat, Integer, H
  WinGet, WinID,, A
  ThreadID:=DllCall("GetWindowThreadProcessId", "Int", WinID, "Int", "0")
  HKL:=DllCall("GetKeyboardLayout", "uint", ThreadID, "uint")
  VarSetCapacity( sKbd, 260, 0 )
  DllCall("GetLocaleInfo","uint",HKL>>16,"uint",0x1001, "str",sKbd, "uint",260)
  Return %sKbd%
}

ConvertText(Text)
{
   static Result

   Cyr = ЁЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮёйцукенгшщзхъфывапролджэячсмитьбю
   Lat = ~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>``qwertyuiop[]asdfghjkl;'zxcvbnm,.

   Loop, parse, Text
   {
      found =
      if found := InStr(Lat, A_LoopField, 1)
         NewText .= SubStr(Cyr, found, 1), lastfound := 2

      if !found
         if found := InStr(Cyr, A_LoopField, 1)
            NewText .= SubStr(Lat, found, 1), lastfound := 1

      if !found
         NewText .= A_LoopField
   }
   VarSetCapacity(Result, A_PtrSize + StrPut(NewText)*2)
   NumPut(lastfound, &Result), StrPut(NewText, &Result + A_PtrSize)
   Return &Result
}

SwitchLocale(lastfound)
{
   SetFormat, IntegerFast, H
   VarSetCapacity(List, 8)
   DllCall("GetKeyboardLayoutList", Int, 2, UInt, &List)
   Locale1 := NumGet(List)
   b := SubStr(Locale2 := NumGet(List, 4), -3) = 0409
   En := b ? Locale2 : Locale1
   Ru := b ? Locale1 : Locale2
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, lastfound = 1 ? En : Ru,, A
}

75

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

Да, мой недосмотр. В Unicode версии для строки требуется больший буфер.

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