Тема: AHK: Переназначение клавиш DOLLAR и EURO
Замена клавиш [Acer E1-772G] EURO=PgUp, DOLLAR=PgDn | Fn+EURO=Home, Fn+DOLLAR
Добрый день всем. Cпасибо что заглянули...
-Есть новый ноутбук Acer E1-772G Win8.1 x64, который специально покупался с учетом того, что на клавиатуре есть две кнопочки € и $ возле курсорчиков (arrows) up/down/left/right и что потом (точней уже сейчас) их можно будет заменить на вышеозвученные комбинации (EURO=PgUp DOLLAR=PgDn Fn+EURO=Home Fn+DOLLAR=End).
но оказывается все тут не так уж и просто для простого смертного. Поковырялся я с простыми решениями типа "SharpKeys", "KeyExtender". Но они типа определяют, что при нажатии на эти кнопки (€ и $) нажимаются num8/num6 соответственно. но похоже это не так ))). Вобщем я тут поискал, подумал и понял, что тут какаято софтина мне помогает (сначала была предположительно Acer Launch Manager). типа по этому поводу написано на этой странице http://www.emtek.net.nz/blog/2008/06/29 … -euro-key/ , где говорится что надобно поискать файл "C:\Program Files\Launch Manager\MMKEYBD.CFG" и там закомментировать пару строчек и все будет пучком и больше небудет махинаций со стороны медведя...
Так вот собственно почему я здесь вопрошаю.
-У меня ситуация чуток другая:
1) Нет такого файла, тк нет такой папки на диске и вообще все по другому, потомучто походу уменя более новая версия этого "Launch Manager", но и не в этом дело.
2) Я недолго думая удалил это чудо, но всеравно не решилось дело, тк последовательность Alt+xxxx (чуток ниже есть немного об этом) все еще выполняется.
3) Я даже позакрывал кучу процессов и поостанавливал все сервисы и сирамно не помогло. Думаю эта зараза гдето в драйверах сидит.
-также вспомнилось мне что есть такое дело как Alt+0128 (непомню как оно называется), но таким образом можно вбивать символы зная их unicode коды. Здесь по видимуму и зарыта собака... Т.е. нажимая на кнопку со скан-кодом E033 и E034, какойто шпион запускает вышеозвученную последовательность (для $ я не помню вательности и неохота даже ее искать, главное, что она явно заканчивается на 6).
Кстати, я именно убедился, что нажимается последовательность Alt +xxxx, потомучто провел эксперимент в простом блокноте и там даже видно что когда нажимаю эти кнопки, то на мгновение подчеркиваются буквы вызова в главном меню (это когда мыши нет и надо там в менюшках побыстрей шариться, то можно использовать Alt+подчеркнутая_буква. Надеюсь, то что я только что написал итак все тут знают
) и это подчеркивание подтверждает тот факт, что зажимается Alt.
++++++++++++++++++++++++++++++++
Ну вот теперь моя задача для "AutoHotkey".
Думаю надо просто наблюдать, когда пролетают скан-коды клавиш (E033 и E034) и после них эта последовательность Alt+xxxx, после чего просто удалять незамедлительно выпавший символ (или вообще блокировать его выплевывание, ато поди чего может неладное где-то происходить в каких-то программах. Например, у меня Мозилла начинает искать в странице текст, когда я просто начинаю набирать необходимую фразу) и делать вышеуказаннае подстановки...
ЗЫ. Спасибо за внимание и понимание.
Очень жду, что кто-то поможет с задачкой.
++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++
ДОБАВЛЕННО 20140410 20:14
Если Вы верно указали скан-коды, такой скрипт должен заработать:
scE033:: Msgbox, Нажата кнопка € scE034:: Msgbox, Нажата конопка $Кстати, эти кнопки работают сами по себе или только при удержании Fn?
-Кнопки работают, как, сами по себе, так и при удержании. Т.е. символы вылетают после нажатия )))
-попробовал скрипт и как и ожидал, он не сработал.
наверное получается так, что может раньше в других версиях UEFI/BIOS (на других более старых компьютерах) виндовс получал скан-коды, то уменя винда даже не догадывается, что была нажата клавиши со скан-кодами E033/E034.
поэтому задача ныньче заключается не в:
Ну вот теперь моя задача для "AutoHotkey".
Думаю надо просто наблюдать, когда пролетают скан-коды клавиш (E033 и E034) и после них эта последовательность Alt+xxxx, после чего просто удалять незамедлительно выпавший символ (или вообще блокировать его выплевывание...) и делать подстановки...
Теперь задача немного изменилася:
Надо наблюдать, когда пролетают только скан-коды зажатой клавиши Alt -> 0 1 2 8 (€)/Alt -> 0 0 3 6 ($) (те накопить в стек 4 прошлые кнопки и если были именнно они, то после чего просто незамедлительно улалять выпавший символ (или вообще блокировать его выплевывание...) и делать подстановки EURO=PgUp, DOLLAR=PgDn | Fn+EURO=Home, Fn+DOLLAR...
++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++
ДОБАВЛЕННО 20140414 01:07
Замена клавиш [Acer E1-772G] EURO=PgUp, DOLLAR=PgDn | Fn+EURO=Home, Fn+DOLLAR
Добрый день всем. Cпасибо что заглянули...
-Есть новый ноутбук Acer E1-772G Win8.1 x64, который специально покупался с учетом того, что на клавиатуре есть две кнопочки € и $ возле курсорчиков (arrows) up/down/left/right и что потом (точней уже сейчас) их можно будет заменить на вышеозвученные комбинации (EURO=PgUp DOLLAR=PgDn Fn+EURO=Home Fn+DOLLAR=End).
но оказывается все тут не так уж и просто для простого смертного. Поковырялся я с простыми решениями типа "SharpKeys", "KeyExtender". Но они типа определяют, что при нажатии на эти кнопки (€ и $) нажимаются num8/num6 соответственно. но похоже это не так ))). Вобщем я тут поискал, подумал и понял, что тут какаято софтина мне помогает (сначала была предположительно Acer Launch Manager). типа по этому поводу написано на этой странице http://www.emtek.net.nz/blog/2008/06/29 … -euro-key/ , где говорится что надобно поискать файл "C:\Program Files\Launch Manager\MMKEYBD.CFG" и там закомментировать пару строчек и все будет пучком и больше небудет махинаций со стороны медведя...
Так вот собственно почему я здесь вопрошаю.
-У меня ситуация чуток другая:
1) Нет такого файла, тк нет такой папки на диске и вообще все по другому, потомучто походу уменя более новая версия этого "Launch Manager", но и не в этом дело.
2) Я недолго думая удалил это чудо, но всеравно не решилось дело, тк последовательность Alt+xxxx (чуток ниже есть немного об этом) все еще выполняется.
3) Я даже позакрывал кучу процессов и поостанавливал все сервисы и сирамно не помогло. Думаю эта зараза гдето в драйверах сидит.
-также вспомнилось мне что есть такое дело как Alt+0128 (непомню как оно называется), но таким образом можно вбивать символы зная их unicode коды. Здесь по видимуму и зарыта собака... Т.е. нажимая на кнопку со скан-кодом E033 и E034, какойто шпион запускает вышеозвученную последовательность (для $ я не помню вательности и неохота даже ее искать, главное, что она явно заканчивается на 6).
Кстати, я именно убедился, что нажимается последовательность Alt +xxxx, потомучто провел эксперимент в простом блокноте и там даже видно что когда нажимаю эти кнопки, то на мгновение подчеркиваются буквы вызова в главном меню (это когда мыши нет и надо там в менюшках побыстрей шариться, то можно использовать Alt+подчеркнутая_буква. Надеюсь, то что я только что написал итак все тут знают
) и это подчеркивание подтверждает тот факт, что зажимается Alt.
++++++++++++++++++++++++++++++++
Ну вот теперь моя задача для "AutoHotkey".
Думаю надо просто наблюдать, когда пролетают скан-коды клавиш (E033 и E034) и после них эта последовательность Alt+xxxx, после чего просто удалять незамедлительно выпавший символ (или вообще блокировать его выплевывание, ато поди чего может неладное где-то происходить в каких-то программах. Например, у меня Мозилла начинает искать в странице текст, когда я просто начинаю набирать необходимую фразу) и делать вышеуказаннае подстановки...
ЗЫ. Спасибо за внимание и понимание.
Очень жду, что кто-то поможет с задачкой.
++++++++++++++++++++++
++++++++++++++++++++++
++++++++++++++++++++++
ДОБАВЛЕННО 20140410 20:14
Если Вы верно указали скан-коды, такой скрипт должен заработать:
scE033:: Msgbox, Нажата кнопка € scE034:: Msgbox, Нажата конопка $Кстати, эти кнопки работают сами по себе или только при удержании Fn?
-Кнопки работают, как, сами по себе, так и при удержании. Т.е. символы вылетают после нажатия )))
-попробовал скрипт и как и ожидал, он не сработал.
наверное получается так, что может раньше в других версиях UEFI/BIOS (на других более старых компьютерах) виндовс получал скан-коды, то уменя винда даже не догадывается, что была нажата клавиши со скан-кодами E033/E034.
поэтому задача ныньче заключается не в:
Ну вот теперь моя задача для "AutoHotkey".
Думаю надо просто наблюдать, когда пролетают скан-коды клавиш (E033 и E034) и после них эта последовательность Alt+xxxx, после чего просто удалять незамедлительно выпавший символ (или вообще блокировать его выплевывание...) и делать подстановки...
Теперь задача немного изменилася:
Надо наблюдать, когда пролетают только скан-коды зажатой клавиши Alt -> 0 1 2 8 (€)/Alt -> 0 0 3 6 ($) (те накопить в стек 4 прошлые кнопки и если были именнно они, то после чего просто незамедлительно улалять выпавший символ (или вообще блокировать его выплевывание...) и делать подстановки EURO=PgUp, DOLLAR=PgDn | Fn+EURO=Home, Fn+DOLLAR...
++++++++++++++++++++++
++++++++++++++++++++++
++++++++++++++++++++++
ДОБАВЛЕННО 20140412 01:38
http://forum.script-coding.com/viewtopi … 650#p81650
У меня корректно работает только так:Global Combo := {0128:"euro",0036:"dollar"} SetFormat, IntegerFast, h OnExit, Exit hHookKeybd := DllCall("SetWindowsHookEx" . (A_IsUnicode ? "W" : "A") , Int, WH_KEYBOARD_LL := 13 , Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast") , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr) , UInt, 0, Ptr) Return 1::SendInput {LAlt Down}{Numpad0}{Numpad0}{Numpad3}{Numpad6}{LAlt Up} 2::SendInput {LAlt Down}{Numpad0}{Numpad1}{Numpad2}{Numpad8}{LAlt Up} euro() { ToolTip % A_ThisFunc } dollar() { ToolTip % A_ThisFunc } Exit: DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd) ExitApp LowLevelKeyboardProc(nCode, wParam, lParam) { Critical Static AltDown, NumKeys vkCode := SubStr(NumGet(lParam+0, 0, "UInt"), 3) If (wParam = 0x100 || wParam = 0x104) { If vkCode = A4 AltDown := 1 Else If (AltDown && vkCode > 59 && vkCode < 70) { NumKeys .= SubStr(vkCode, 0) Return 1 } NumKeys := "" } Else { If (vkCode = "A4" && NumKeys != "") { AltDown := 0 If Func := Combo[NumKeys] %Func%() NumKeys := "" } } Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam) }также можно сделать, чтобы символы которых нет в Combo, всё же посылались при отпускании LAlt.
В силу того, что нельзя отловить зажатие Fn+... и пока еще не совсем поздно можно ли доделать задачу по другому, чтоб не терять всетаки такие удобные функции, как PgUp, PgDn, Home, End. Можно поменять логику так:
1) Нажимаем кнопки € или $ и если в течении например половины секунды не происходит повторного нажатия, то делаем Home или End (соответственно).
2) А если происходит ОДНО ДОПОЛНИТЕЛЬНОЕ (или больше) повторное нажатие, то тогда рассцениваем это как нужду перелистнуть страницу(ы) вверх/вниз и задерживаем на этом логику (на несколько секунд) в контексте PgUp, PgDn.
3) И когда в течении нескольких секунд кнопки не тычутся, то и отпускаем скрипт на новый виток (1-3 пункты)
++++++++++++++++++++++
++++++++++++++++++++++
++++++++++++++++++++++
ДОБАВЛЕННО 20140414 05:00
Теперь не вылетают € $ но возле курсора появляются тултипы "euro" "dollar" и остаются там на вечно
Как туда поставить PgUp, PgDn?Предлагаю решить самостоятельно.
Можно поменять логику так:+ открыть спойлерGlobal Combo := {0128:"euro",0036:"dollar"}, timeeuro := A_TickCount, timedollar := A_TickCount SetFormat, IntegerFast, h OnExit, Exit hHookKeybd := DllCall("SetWindowsHookEx" . (A_IsUnicode ? "W" : "A") , Int, WH_KEYBOARD_LL := 13 , Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast") , Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr) , UInt, 0, Ptr) Return ^1::SendInput {LAlt Down}{Numpad0}{Numpad0}{Numpad3}{Numpad6}{LAlt Up} ^2::SendInput {LAlt Down}{Numpad0}{Numpad1}{Numpad2}{Numpad8}{LAlt Up} euro() { if (A_TickCount-timeeuro > 500) SetTimer, sendeuro, -500 else { SetTimer, sendeuro, off ToolTip PgUp } timeeuro := A_TickCount Return sendeuro: ToolTip Home Return } dollar() { if (A_TickCount-timedollar > 500) SetTimer, senddollar, -500 else { SetTimer, senddollar, off ToolTip PgDn } timedollar := A_TickCount Return senddollar: ToolTip End Return } Exit: DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd) ExitApp LowLevelKeyboardProc(nCode, wParam, lParam) { Critical Static AltDown, NumKeys vkCode := SubStr(NumGet(lParam+0, 0, "UInt"), 3) If (wParam = 0x100 || wParam = 0x104) { If vkCode = A4 AltDown := 1 Else If (AltDown && vkCode > 59 && vkCode < 70) { NumKeys .= SubStr(vkCode, 0) Return 1 } NumKeys := "" } Else { If (vkCode = "A4" && NumKeys != "") { AltDown := 0 If Func := Combo[NumKeys] %Func%() NumKeys := "" } } Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam) }
Строчки ToolTip PgUp/ToolTip PgDn/... заменил на SendInput {PgUp}/...
Global Combo := {0128:"euro",0036:"dollar"}, timeeuro := A_TickCount, timedollar := A_TickCount
SetFormat, IntegerFast, h
OnExit, Exit
hHookKeybd := DllCall("SetWindowsHookEx" . (A_IsUnicode ? "W" : "A")
, Int, WH_KEYBOARD_LL := 13
, Ptr, RegisterCallback("LowLevelKeyboardProc", "Fast")
, Ptr, DllCall("GetModuleHandle", UInt, 0, Ptr)
, UInt, 0, Ptr)
Return
^1::SendInput {LAlt Down}{Numpad0}{Numpad0}{Numpad3}{Numpad6}{LAlt Up}
^2::SendInput {LAlt Down}{Numpad0}{Numpad1}{Numpad2}{Numpad8}{LAlt Up}
euro() {
if (A_TickCount-timeeuro > 500)
SetTimer, sendeuro, -500
else
{
SetTimer, sendeuro, off
SendInput {PgUp} ; Заменил тут
}
timeeuro := A_TickCount
Return
sendeuro:
SendInput {Home} ; Заменил тут
Return
}
dollar() {
if (A_TickCount-timedollar > 500)
SetTimer, senddollar, -500
else
{
SetTimer, senddollar, off
SendInput {PgDn} ; Заменил тут
}
timedollar := A_TickCount
Return
senddollar:
SendInput {End} ; Заменил тут
Return
}
Exit:
DllCall("UnhookWindowsHookEx", Ptr, hHookKeybd)
ExitApp
LowLevelKeyboardProc(nCode, wParam, lParam) {
Critical
Static AltDown, NumKeys
vkCode := SubStr(NumGet(lParam+0, 0, "UInt"), 3)
If (wParam = 0x100 || wParam = 0x104)
{
If vkCode = A4
AltDown := 1
Else If (AltDown && vkCode > 59 && vkCode < 70)
{
NumKeys .= SubStr(vkCode, 0)
Return 1
}
NumKeys := ""
}
Else
{
If (vkCode = "A4" && NumKeys != "")
{
AltDown := 0
If Func := Combo[NumKeys]
%Func%()
NumKeys := ""
}
}
Return DllCall("CallNextHookEx", Ptr, 0, Int, nCode, UInt, wParam, UInt, lParam)
}Спасибо за помощь, работает практически, так, как мечтал
.
1) Нажимаем кнопки € или $ и если в течении например половины секунды не происходит повторного нажатия, то делаем Home или End (соответственно).
2) А если происходит ОДНО ДОПОЛНИТЕЛЬНОЕ (или больше) повторное нажатие, то тогда рассцениваем это как нужду перелистнуть страницу(ы) вверх/вниз и задерживаем на этом логику (на несколько секунд) в контексте PgUp, PgDn.
3) И когда в течении нескольких секунд кнопки не тычутся, то и отпускаем скрипт на новый виток (1-3 пункты)
За исключанием:
-второй части 2 пункта: "...и задерживаем на этом логику (на несколько секунд) в контексте PgUp, PgDn."
-и почти всего 3 пункта: "И когда в течении нескольких секунд кнопки не тычутся, то и отпускаем скрипт на новый виток"
Здесь во втором пункте имеется ввиду, что блокируется логика для удобства листания PgUp, PgDn при беглом поиске в обратном направлении (PgUp) нужного текста в странице (например: когда читаеш текст/таблицу_со_значениями и уже прошел несколько страниц вниз и непомниш точно сколько страниц назад был тот текст который хочется переглядеть). И начинаешь быстренько мотать назад в поиске нужной информации и найдя предыдущую страницу понимаешь что проскочил на страницу выше и сразуже хочется разок перелистнуть вниз по тексту (вот какраз именно для этой фишки, жизненно необходимо иметь возможность спокойно листнуть один раз вниз и непопасть на ситуацию, что страница перемотается ВСЯ ВНИЗ изза единственного тыка вниз). Именно изза этого нужно заблокировать логику сразу двух функций PgUp, PgDn и в течении пары секунд дать возможность принять решение об том: Достигнута ли необходимая позиция в тексте.
Я нарвался на эту проблему сразуже в первую минуту перечитывая эту тему (желая почитать и полистать от сообщения к сообщению - вверх/вниз). И нажимая один раз PgUp или PgDn страница уходила полностью вверх/вниз и позиция терялась полностью
, сводив на нет всю прелесть комбинирования двойной функции PgUp ИЛИ Home на одной кнопке € путем установки таймера.
Вобщем, вижу, что надо добавить еще один общий таймер/флаг для выполнения условия 2 и 3 пунктов.
Устанавливать его например на 3 секунды в каждой/любой из функций (где вычитаются таймеры: SetTimer, sendeuro/senddollar, -500) и заключить каждый else в if c этим общим таймером.
По истечении 3 секунд сбросить общий таймер, чтоб в следующий раз в пункте 1) если не нажимается повторно кнопка чтоб всетаки смог сработать else в if и активировалась функция Home или End. но немогу логически додумать какое условие надо поставить.
И еще, конечно, не знаю, как синтаксически это сделать.

