51

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

Подскажите пожалуйста, каким образом эти команды
Код (AutoHotKey):
OnMessage(0x6, "WM_ACTIVATE")
 OnMessage(0x102, "WM_CHAR")

могут создавать такую проблему http://forum.script-coding.com/viewtopic.php?id=7563
Если их закомментировать, то всё в порядке.!?

удалил OnMessage(0x102, "WM_CHAR"), всё нормально стало. Правда так и непонял что это такое

Подскажите ещё пожалуйста, как мне добавить в ваш код, определение кнопок джойстика.

Gui, Add, Edit, vJoy w222
Gui, Show 
GetKeyState, joy_buttons, %JoystickNumber%JoyButtons
Loop
{
Loop, %joy_buttons%
{
GetKeyState, joy%a_index%, %JoystickNumber%joy%a_index%
if joy%a_index% = D
buttons_down = %JoystickNumber%Joy%a_index%
}
GuiControl, , Joy, %buttons_down%
Continue
}
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

52

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

Про джойстик не подскажу за неимением оного.

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

53

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

teadrinker пишет:

Про джойстик не подскажу за неимением оного.

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

54 (изменено: serzh82saratov, 2012-10-22 04:48:46)

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

Помогите пожалуйста нубу сообразить, как-бы мне тут сделать, чтоб при нажатиях Ctrl, Alt, Shift, Win ставились соответствующие чекбоксы?
Т.е. нажал Ctrl+Alt+1 - отметились чекбоксы и выплыл код единицы, нажал после этого просто 2 - чекбоксы опустели, выплыл код двойки.

	
#SingleInstance force
	Menu, Tray, Icon, Shell32.dll, 45
	KeysVK := "LButton,1|RButton,2|Ctrl+Break,3|MButton,4|XButton1,5|XButton2,6|"
			. "Clear,c|Shift,10|Ctrl,11|Alt,12|Browser_Back,a6"
	Gui, Color, B0C4DE
	Gui, Font, q5 s10, Verdana
	Gui, Add, Text, vKey Center x5 y5 w325
	Gui, Add, Edit, ReadOnly vVK -Background x5 yp+35 w260 h33 Center
	Gui, Add, Button, gCopyVK vCopyVK xp+265 h33 w60, Copy
	Gui, Add, CheckBox, xs+20 ys+182 w60 h40  vAlt, Alt
	Gui, Add, CheckBox, xp+60 yp w70 h40  vCtrl, Ctrl
	Gui, Add, CheckBox, xp+70 yp w80 h40  vShift, Shift
	Gui, Add, CheckBox, xp+80 yp w70 h40  vWIN, Win
	Gui, Show,  h225 w335, KeyCodeXBMC
	hHookKeybd := SetWindowsHookEx()
	OnExit, Exit
	OnMessage(0x6, "WM_ACTIVATE")
	Return

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
	}
}
SetWindowsHookEx()
{
   Return DllCall("SetWindowsHookEx"
            , Int, WH_KEYBOARD_LL := 13
            , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
            , UInt, DllCall("GetModuleHandle", UInt, 0)
            , UInt, 0)
}

LowLevelKeyboardProc(nCode, wParam, lParam)
{
   static once, WM_KEYDOWN = 0x100, WM_SYSKEYDOWN = 0x104

   Critical
   SetFormat, IntegerFast, H
   vk := NumGet(lParam+0)
   Extended := NumGet(lParam+0, 8) & 1
   StringReplace, vk2, vk, 0x, vk
   KeyName := GetKeyName(vk2)
   StringReplace, vk, vk, 0x

   if (wParam = WM_SYSKEYDOWN || wParam = WM_KEYDOWN)
   {
      GuiControl,, Key, %KeyName%
      GuiControl,, VK, %vk%
   }

   if !once
   {
      Controls := "Key|TextVK|VK|TextSC|SC|CopyVK|CopySC"
      Loop, parse, Controls, |
         GuiControl, Show, % A_LoopField   ;%
      once = 1
   }

   if Key Contains Ctrl,Alt,Shift,Tab
      Return CallNextHookEx(nCode, wParam, lParam)

   if (Key = "F4" && GetKeyState("Alt", "P"))  ; закрытие окна и выход по Alt + F4
      Return CallNextHookEx(nCode, wParam, lParam)

   Return nCode < 0 ? CallNextHookEx(nCode, wParam, lParam) : 1
}
   
CallNextHookEx(nCode, wp, lp)
{
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wp, UInt, lp)
}
	
CopyVK:
	Gui Submit, NoHide
	clipboard = %VK%
	GuiControl,, CopyVK, OK
	SLEEP 500
	GuiControl,, CopyVK, Copy
	Return
	
GuiClose:
   ExitApp

Exit:
   if hHookKeybd
      DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp

   
/* 
  if vk in A0,A1,A2,A3,A4,A5,5B

   GuiControl, , Shift, 0
   GuiControl, , Win, 0
   GuiControl, , Alt, 0
   GuiControl, , Ctrl, 0
   
   GuiControl, , Shift, 1
   GuiControl, , Win, 1
   GuiControl, , Alt, 1
   GuiControl, , Ctrl, 1
По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

55

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

Помогите пожалуйста нубу сообразить, как-бы мне тут сделать, чтоб при нажатиях Ctrl, Alt, Shift, Win ставились соответствующие чекбоксы?
Т.е. нажал Ctrl+Alt+1 - отметились чекбоксы и выплыл код единицы, нажал после этого просто 2 - чекбоксы опустели, выплыл код двойки.

Как вариант видимо надо как-то сделать, чтоб  при нажатии Ctrl, Alt, Shift, Win не было вызова LowLevelKeyboardProc, и просто установить хоткеи.
Вообщем полная каша, пните в нужном направлении, а то котелок не варит

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

56

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

serzh82saratov пишет:

Вообщем полная каша

Это точно. Моя функция LowLevelKeyboardProc() не является универсальной, она предназначена только для моего скрипта и не годится для того, чтобы её бездумно вставлять куда угодно. Для решения твоей не вполне для меня ясной задачи нужен какой-то другой вариант, и какой именно, не смогу подсказать за незнанием глобальной цели твоего скрипта. Предлагаю для начала разобраться с принципами работы клавиатурного хука, а уже затем использовать его в своих программах.

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

57 (изменено: serzh82saratov, 2012-10-23 01:25:11)

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

Для решения твоей не вполне для меня ясной задачи нужен какой-то другой вариант

Задачка распространённая,  скрипт "принимает" нажатия кнопок в том числе и вместе с нажатиями модификаторов, и записывает в память. Потом пользователь на записанные кнопки через GUI этого-же скрипта назначает выполнение нужных задач.

Предлагаю для начала разобраться с принципами работы клавиатурного хука

Да разобратся то очень хочется, но неможется.

а уже затем использовать его в своих программах

Такова печальная участь быдлокодера 

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

58

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

Предлагаю для начала разобраться с принципами работы клавиатурного хука

Так понимаю, что где-то здесь "оно" начинается...


SetWindowsHookEx()
{
   Return DllCall("SetWindowsHookEx"
            , Int, WH_KEYBOARD_LL := 13
            , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
            , UInt, DllCall("GetModuleHandle", UInt, 0)
            , UInt, 0)
}

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

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

59 (изменено: Александр_, 2012-10-23 02:40:04)

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

serzh82saratov пишет:

Но тут мне ни строки, не ясно. Конечно с десяток раз перечитал DllCall и RegisterCallback, но увы ничего не понял.

Это потому, что данный код использует не столько возможности AHK, сколько возможности WinAPI- вот её и нужно изучать. Про хуки написано очень много, но с наскока в них не разобраться. Я начинал с книги Румянцева "Азбука программирования в Win32 API" и всячески её рекомендую. Конкретно про хуки хорошая статья на RSDN, но скорее всего будет просто не понятно о чём речь.

60

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

Спасибо за совет. Т.е. после вдумчивого* прочтения, можно переходить к изучению статьи на RSDN?
Если выводы я сделать несмогу, то скорее всего и не дано?

* насколько это возможно неокрепшим мозгом дилетанта

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

61

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

Ну и с этой темой не помешает ознакомиться.

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

62

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

serzh82saratov пишет:

Т.е. после вдумчивого* прочтения, можно переходить к изучению статьи на RSDN?

Книга написана так, что особо вдумываться не придётся. БОльшая часть книги это перевод документации с последующим примером. Соответственно и всю книгу тоже читать не придётся, но она пригодится как справочник. На самом деле "критическая" часть это часть между "предисловием" и главой "UNICODE", не включая эти главы, в этих 20-ти страницах описана реальная структура Windows-программы. Нужно знать что понимают под "сообщением" или "потоком" и уметь вызывать API-функции по их описанию.

serzh82saratov пишет:

Если выводы я сделать несмогу, то скорее всего и не дано?

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

63 (изменено: serzh82saratov, 2012-10-23 14:24:37)

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

teadrinker пишет:

Ну и с этой темой не помешает ознакомиться.

То что надо.

   
#Persistent
   OnExit, Exit
   hHookKeybd := DllCall("SetWindowsHookEx"
      , Int, WH_KEYBOARD_LL := 13
      , UInt, RegisterCallback("LowLevelKeyboardProc", "Fast")
      , UInt, DllCall("GetModuleHandle", UInt, 0)
      , UInt, 0)
   Return
 
Exit:
   DllCall("UnhookWindowsHookEx", UInt, hHookKeybd)
   ExitApp
 
LowLevelKeyboardProc(nCode, wParam, lParam)
{
   Critical
   SetFormat, Integer, H
   ToolTip, % wParam . "| vkCode: " . NumGet(lParam+0, 0) . " scCode: " . NumGet(lParam+0, 4)
      . " Extended: " . NumGet(lParam+0, 8) & 1 . " Time: " . NumGet(lParam+0, 12)
   Return DllCall("CallNextHookEx", UInt, 0, Int, nCode, UInt, wParam, UInt, lParam)
}

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

Так понимаю что этот код можно использовать как базу, и к нему уже что то "лепить" если хочется что то добавить.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

64 (изменено: serzh82saratov, 2012-10-24 00:46:35)

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

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

Т.е. после вдумчивого* прочтения, можно переходить к изучению статьи на RSDN?

Книга написана так, что особо вдумываться не придётся. БОльшая часть книги это перевод документации с последующим примером. Соответственно и всю книгу тоже читать не придётся, но она пригодится как справочник. На самом деле "критическая" часть это часть между "предисловием" и главой "UNICODE", не включая эти главы, в этих 20-ти страницах описана реальная структура Windows-программы. Нужно знать что понимают под "сообщением" или "потоком" и уметь вызывать API-функции по их описанию.

Спасибо что по полочкам разложили. Статья на RSDN тоже очень познавательная, и хорошо переваримаемая.
-----------------
По сабжу так понял, что просто нужно внутри функции делать проверку нужных кнопок по GetKeyState или по VK и wParam. И при нажатии соответствующих выполнять отметку чекбоксов и далее рекурсию функции, или возврат...

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

65

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

serzh82saratov спасибо за скрипт, а то я купил себе клавиатурку для просмотра фильмов (аля пульт) и было очень сложно узнать скан-коды.
А то что проскакивает код в систему это верно, но после определения кода - всё ОК.
Это раньше запускало плеер -

#Persistent
vkB5::
send {s}
return

Вопрос - можно отловить нажатие на Fn и ей подобные клавиши или это клавиатурный аппаратный модификатор?

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

66 (изменено: serzh82saratov, 2012-12-16 23:35:41)

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

Indomito пишет:

serzh82saratov спасибо за скрипт, а то я купил себе клавиатурку для просмотра фильмов (аля пульт) и было очень сложно узнать скан-коды.
А то что проскакивает код в систему это верно, но после определения кода - всё ОК.

Думаю вы ошиблись, и вам к teadrinker.
По счёт кнопки Fn, сам бы хотел знать.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

67

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

У меня, к сожалению, нет на клавиатуре этой кнопки.

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

68

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

В вин7 есть на виртуальной. Коды остальных кнопок с неё определяются.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.26.01 (Unicode 32-bit).

69

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

teadrinker пишет:

У меня, к сожалению, нет на клавиатуре этой кнопки.

думаю не поможет и её наличие, т.к. она ни какой код не выдаёт, хотя всё бывает.....

"На каждое действие есть равная ему противодействующая критика." Постулат Харриссона
OS Windows 7 x64
AHK 1.1.25.05

70

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

serzh82saratov пишет:

В вин7 есть на виртуальной. Коды остальных кнопок с неё определяются.

А у меня она почему-то не работает.

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

71

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

Отзыв по скрипту опубликованному в первом посте:
1. Помимо перечисленных

teadrinker пишет:

Когда активно окно скрипта и открыта вкладка "Получить код", скрипт предотвращает системную обработку нажатий всех клавиш, кроме Alt, Ctrl, Shift и Tab

А также Sleep (у меня на клавиатуре среди мультимедийных кнопок есть и такая).

В коде я также увидел это:

; клавиши мыши и их vk, а также Ctrl+Break и Clear
   KeysVK := "LButton,1|RButton,2|Ctrl+Break,3|MButton,4|XButton1,5|XButton2,6|"
           . "Clear,c|Shift,10|Ctrl,11|Alt,12"

у меня скрипт никак не реагирует на нажатие любых клавиш на мышке.

teadrinker пишет:

Протестируйте, у всех ли хорошо работает. Конструктивная критика приветствуется.

А ещё при нажатии media клавиш на клавиатуре - у некоторых показываются латинские буквы (как иллюстрация только что нажатой кнопки), т.к. у них сканкоды состоят из 3-ёх символов (после 0x), и последние два - точно такие как у тех латинских букв (у них не 3 а 2 символа после 0х).

Ещё бы историю нажатий прикрутить и было бы вообще замечательно.

72

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

Drugoy пишет:

у меня скрипт никак не реагирует на нажатие любых клавиш на мышке.

Да, всё правильно. Там можно определить мышиные клавиши по коду, а наоборот нет. Не стал добавлять эту возможность, поскольку нет особого смысла указывать код вместо их реального названия.

Drugoy пишет:

А ещё при нажатии media клавиш на клавиатуре - у некоторых показываются латинские буквы

Будет время, попробую пофиксить эту проблему, но у меня, правда, клавиатура без медиа-клавиш.

Drugoy пишет:

Ещё бы историю нажатий прикрутить и было бы вообще замечательно.

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

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

73 (изменено: vlad1986, 2017-12-06 18:43:50)

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

Drugoy пишет:

А ещё при нажатии media клавиш на клавиатуре - у некоторых показываются латинские буквы

Подтверждаю. Некоторые определяются, как буквы. А есть мультимедийные клавиши, которые вообще никак не определяются.

74

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

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

vlad1986 пишет:

А есть мультимедийные клавиши, которые вообще никак не определяются.

Значит это чисто аппаратные клавиши, они не будут определяться. У меня из мультимедийных определяются только Volume_Mute, Volume_Up и  Volume_Down.

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

75 (изменено: vlad1986, 2017-12-06 23:30:26)

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

teadrinker пишет:

У меня из мультимедийных определяются только Volume_Mute, Volume_Up и  Volume_Down

Так же правильно определяются Media_Next, Media_Prev, Media_Play_Pause.

По поводу тех, что не определились вообще никак, на фотографии, это то, что находится на F4 (вкл\выкл микрофон) и F6 (запрашивает пароль для учетной записи).

http://i102.fastpic.ru/thumb/2017/1206/88/8d88e35553da736338ebff9046ee4c88.jpeg