26

Re: AHK: Определение виртуальных и сканкодов клавиатуры

После замены на

TabH := NumGet(RECT, 12, "UInt")

TabH вычисляется верно.

27

Re: AHK: Определение виртуальных и сканкодов клавиатуры

А, раньше просто "UInt" было по умолчанию, теперь "UPtr", в Win64 UPtr равно 32 битам, а UInt — 16.

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

28

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Ой, то есть в Win64 UPtr равно 64 битам, а UInt — 32.

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

29

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Смысл этой программы в том, что она определяет коды даже для тех клавиш, которые не всегда верно определяются с помощью клавиатурного хука, а кроме того, "гасит" существующие в данный момент в системе горячие клавиши, чтобы вместо определения их кодов не выполнялись их обработчики. Для того, чтобы определять названия клавиш по уже имеющемуся виртуальному коду, данная программа не нужна, достаточно воспользоваться GetKeyName(Key).

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

30 (изменено: Irbis, 2012-08-08 17:00:20)

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Почему-то GetKeyVK() возвращает вирт.код только букв, которые есть в текущей  раскладке клавиатуры. В данном примере это видно, если переключить раскладку, а потом нажать "OK":

SetFormat, IntegerFast, h
MsgBox % "En - " GetKeyVK("W") "`n" "Ru - " GetKeyVK("Ц")
MsgBox % "En - " GetKeyVK("W") "`n" "Ru - " GetKeyVK("Ц")

GetKeySC() ведет себя точно так же. И как получить вирт. или скан-код для буквы "Q", к примеру, если текущая раскладка - русская?
(Имеется в виду, штатными средствами, не изобретая велосипед)

31

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Определить раскладку, если русская — переключить.

SetFormat, IntegerFast, H
VarSetCapacity(List, A_PtrSize*2)
DllCall("GetKeyboardLayoutList", Int, 2, Ptr, &List)
Locale1 := NumGet(List)
b := SubStr(Locale2 := NumGet(List, A_PtrSize), -3) = 0409
En := b ? Locale2 : Locale1
Ru := b ? Locale1 : Locale2

ThreadID := DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), UInt, 0, Ptr)
if DllCall("GetKeyboardLayout", Ptr, ThreadID, Ptr) = Ru
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, En,, A

MsgBox, % GetKeyVK("Q")

Потом можно переключить обратно.

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

32

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Результат нулевой, к сожалению. (В прямом смысле - MsgBox выдает 0x0, замена на "Q" на "Й" - работает...)

33

Re: AHK: Определение виртуальных и сканкодов клавиатуры

К сожалению, не могу протестировать данный код — у меня при любой раскладке "Q" определяется, а "Й" — нет. Возможно, следует добавить небольшую паузу:

SetFormat, IntegerFast, H
VarSetCapacity(List, A_PtrSize*2)
DllCall("GetKeyboardLayoutList", Int, 2, Ptr, &List)
Locale1 := NumGet(List)
b := SubStr(Locale2 := NumGet(List, A_PtrSize), -3) = 0409
En := b ? Locale2 : Locale1
Ru := b ? Locale1 : Locale2

ThreadID := DllCall("GetWindowThreadProcessId", Ptr, WinExist("A"), UInt, 0, Ptr)
if DllCall("GetKeyboardLayout", Ptr, ThreadID, Ptr) = Ru
{
   SendMessage, WM_INPUTLANGCHANGEREQUEST := 0x50,, En,, A
   Sleep, 100
}

MsgBox, % GetKeyVK("Q")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

34

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Irbis пишет:

И как получить вирт. или скан-код для буквы "Q", к примеру, если текущая раскладка - русская?

Текущая раскладка чего? Здесь имеет значение раскладка окна скрипта, а не активного окна на экране. В вашем примере с MsgBox переключение работает, потому что MsgBox — тоже окно скрипта.

35

Re: AHK: Определение виртуальных и сканкодов клавиатуры

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

36 (изменено: YMP, 2012-08-09 09:45:16)

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Можно проверять, что возвращает GetKeyVK() и переключать раскладку при необходимости. Если раскладки две, то так, например:

MsgBox, % GetVK("Q") "`n" GetVK("Й")

GetVK(Name)
{
    Prev := A_FormatInteger
    SetFormat, Integer, H
    if !(vk := GetKeyVK(Name)) {
        DetectHiddenWindows, On
        hWnd := WinExist(A_ScriptFullPath " - AutoHotkey")
        PostMessage, 0x50, 2,,, ahk_id %hWnd%
        Sleep, -1
        vk := GetKeyVK(Name)
        PostMessage, 0x50, 2,,, ahk_id %hWnd%
        Sleep, -1
        DetectHiddenWindows, Off
    }
    SetFormat, Integer, %Prev%
    return vk
}

37 (изменено: Irbis, 2012-08-09 16:30:10)

Re: AHK: Определение виртуальных и сканкодов клавиатуры

DetectHiddenWindows, On !
Вот чего мне не хватило, чтоб практически аналогичный скрипт выдал такой же результат. Правда, я посчитал, что получение id скрипта таким способом излишне, раз есть встроенные переменные.
Но, как ни странно, даже A_ScriptHwnd не работает без DetectHiddenWindows. В общем, вместо

        hWnd := WinExist(A_ScriptFullPath " - AutoHotkey")
        PostMessage, 0x50, 2,,, ahk_id %hWnd%
        Sleep, -1

у меня просто

SendMessage, 0x50, 2,,, ahk_id %A_ScriptHwnd%

И еще, мне не совсем понятен смысл расчетов в процедуре GetVK() в HEX формате, ведь MsBox выводит десятичное значение (81, а не 0x51)?
Тогда уж SetFormat лучше поставить перед MsgBox в основном коде.

38

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Я просто был не в курсе, что уже есть A_ScriptHwnd.
WM_INPUTLANGCHANGEREQUEST, согласно MSDN, положено постить, а не сендить, так что я просто сделал, как положено.

MsgBox в моём коде у меня выводит в хексе, т.е. 0x51, так что не совсем понял ваш вопрос.

39

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Копирую и запускаю скрипт "As Is", вот что выдает AHK_L:
http://savepic.org/2450817.jpg

40

Re: AHK: Определение виртуальных и сканкодов клавиатуры

А у меня вот что:

---------------------------
DC08090E0801025B.AHK
---------------------------
0x51
0x51
---------------------------
ОК   
---------------------------

Одинаково на ANSI, Unicode, x64. Версия 1.1.08.00.

41

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Подозреваю, что дело может быть в этом:

1.1.08.00 - July 14, 2012

Breaking changes:

Changed return x to preserve formatting of numeric strings; it is now equivalent to return (x).

42 (изменено: Irbis, 2012-08-09 23:34:27)

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Действительно, на "испытательной" машине была версия AHK_L 1.1.07.00. После обновления показания стали идентичны.
Хотя я тут прикинул... Ведь мне всего-то надо, чтобы из хоткея, полученного по команде Gui, Add, Hotkey, vHotkeyName получить его вирт.код, с сохранением модификаторов, разумеется.
Такое сужение поля (минус кириллица, минус строчные буквы ) не могло не сказаться на коде:

SetFormat, Integer, H
MsgBox % GetVK("^!Q") "`n" GetVK("+#Numpad9")
return

GetVK(HK)
{
   return RegExReplace(HK, "\w") "vk" Substr(StrLen(Name := RegExReplace(HK, "\W")) = 1 ? Asc(Name) : GetKeyVK(Name),3)
}

43

Re: AHK: Определение виртуальных и сканкодов клавиатуры

А как быть с такими комбинациями, как "^+-" или "^+]"?

44 (изменено: Irbis, 2012-08-10 23:46:44)

Re: AHK: Определение виртуальных и сканкодов клавиатуры

YMP пишет:

А как быть с такими комбинациями, как "^+-" или "^+]"?

Легко

SetFormat, Integer, H
No_No_No_mr_YMP := True
Gui, Add, Hotkey, vChosenHotkey, ^+A
Gui, Show
return

#IF No_No_No_mr_YMP
*vkC0::
*vkDB::
*vkDD::
*vkBD::
*vkBB::
*vkBC::
*vkBE::
*vkBF::
*vkDC:: return
#IF

GuiClose:
No_No_No_mr_YMP := False
Gui, Submit
MsgBox % GetVK(ChosenHotkey)
ExitApp
 
GetVK(HK)
{
   return RegExReplace(HK, "\w") "vk" Substr(StrLen(Name := RegExReplace(HK, "\W")) = 1 ? Asc(Name) : GetKeyVK(Name),3)
}

Конечно, это шутка. А вот корректный (я надеюсь) код:

SetFormat, Integer, H
Gui, Add, Hotkey, vChosenHotkey, ^[
Gui, Add, CheckBox, gWin, WIN
Gui, Show
return

Win:
Win := !Win ? "#" : ""
return

GuiClose:
Gui, Submit
ChosenHotkey := Win ChosenHotkey
MsgBox % GetVK(ChosenHotkey)
ExitApp
 
return
 
GetVK(HK)
{
   return RegExReplace(HK, "[^+!\^#]") "vk" Substr(StrLen(Name := RegExReplace(HK, "[\^+!#]")) = 1 
                       && Asc(Name) > 0x40 && Asc(Name) < 0x5B ? Asc(Name) : GetKeyVK(Name),3)
}

45

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Irbis
Работает.

Кстати, ведь есть кнопки, у которых вирткоды совпадают — стрелки, Page Up/Down и иже с ними: обычные и их двойники на цифровой клавиатурке.

46

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Действительно, при выключенном NumLock'е такой эффект имеет место быть.
К счастью, меня это пока не очень волнует; как вариант - можно работать со сканкодами.

47

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Прикрутил Ваш код к своему скрипту, но вот есть вопрос. Надо чтоб при активации окна хук (перехват) включался только если он был включен непосредственно перед деактивацией, потому как по текущему табу не получится в моём случае. Может в какой то переменной содержится включен перехват или нет?

WM_ACTIVATE(wp)
{
global
if (wp & 0xFFFF = 0 && hHookKeybd)
    DllCall("UnhookWindowsHookEx", UInt, hHookKeybd), hHookKeybd := ""
   if (wp & 0xFFFF && Tab = 2 && !hHookKeybd)
    hHookKeybd := SetWindowsHookEx()
GuiControl,, Action, % wp & 0xFFFF = 0 ? "..." : "Кнопка"                 ;  %
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

48

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Не очень понял суть задачи, но в моём скрипте можно судить о том, включен ли перехват, по содержанию переменной hHookKeybd. Если она не пуста — перехват включен.

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

49

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Вот спасибо! Сделал так


WM_ACTIVATE(wp)
{
global
if (wp & 0xFFFF = 0 && hHookKeybd)
{
PrevHookKeybd = %hHookKeybd%
DllCall("UnhookWindowsHookEx", UInt, hHookKeybd), hHookKeybd := ""
Return	
}
if PrevHookKeybd > 0
{
PrevHookKeybd = 0
hHookKeybd := SetWindowsHookEx()
Return
}
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

50

Re: AHK: Определение виртуальных и сканкодов клавиатуры

Оффтоп, кросспостинг, расстрелять.