Что нового

HotKeySet на изолированные две клавиши

The Dream

Новичок
Сообщения
393
Репутация
3
Честно, первый раз не совсем понимаю как назвать тему, модераторы будьте любезны если что - помочь с этим.

Ну и собственно к теме.

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

Но при этом, к примеру в редакторе не "печаталось" бы две буквы "и" (то есть "ии").

Это вообще возможно как-то?
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Ребят, в общем написал на коленке, но почему не работает - не понимаю :stars:

Код:
HotKeySet('{b}','_PRESS_B')

$iTimer = 0

While 1

	Sleep(5)

WEnd


Func _PRESS_B()

	If TimerDiff($iTimer) < 2500 Then MsgBox(16, '', 'Два раза нажали!')
	ConsoleWrite('Нажали' & @CRLF)
	$iTimer = TimerInit()

EndFunc   ;==>_PRESS_B
 

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Zalman1980,
А так?
Код:
Global $iWait = 1000

__LoadKeyboardLayoutEngSelf()

HotKeySet('b', '_Double_Press');русская и
HotKeySet('+b', '_Double_Press');Shift + русская и (И)
HotKeySet('{Esc}', '_Exit')

While 1
	Sleep(100)
WEnd

Func _Double_Press()
	Local Static $i__Timer = 0

	If $i__Timer Then
		Local $i_TD = TimerDiff($i__Timer)
		If $i_TD <= $iWait Then
			ConsoleWrite('_Double_Press: ' & $i_TD & @LF)
			$i__Timer = 0
		Else
			$i__Timer = 0
		EndIf
	Else
		$i__Timer = TimerInit()
	EndIf
EndFunc   ;==>_Double_Press

Func _Exit()
	Exit
EndFunc   ;==>_Exit

Func __LoadKeyboardLayoutEngSelf()
	Local Const $__KLF_ACTIVATE = 0x00000001, $__KLF_SETFORPROCESS = 0x00000100
	Local $a_Res = DllCall('user32.dll', 'long', 'LoadKeyboardLayoutW', 'wstr', '00000409', 'uint', BitOR($__KLF_ACTIVATE, $__KLF_SETFORPROCESS))
	If (@error) Or (Not $a_Res[0]) Or (Not StringInStr(Hex($a_Res[0]), '0409')) Then Return 0
	Return 1
EndFunc   ;==>__LoadKeyboardLayoutEngSelf
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
madmasles

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

madmasles

Модератор
Глобальный модератор
Сообщения
7,790
Репутация
2,323
Zalman1980 [?]
НО, когда нажимается одна клавиша - нет действия
А я должен был догадаться, что должно быть действие?
Вы объясните, что Вы хотите получить в итоге.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
madmasles

Простите, да, действительно - не точно указал в теме детали..

Просто хотелось бы, чтобы когда я что-то печатаю и нажимаю два раза клавишу b - мне вставлялась конструкция жирного шрифта. А когда один раз b - то ничего, просто как обычно посылалась бы буква в текстовое поле. В общем чтобы событие работало только на bb, а b обрабатывалось системой как обычно..
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
Zalman1980
Такой вариант
Код:
#include <Misc.au3>
#include <WinAPISys.au3>

Opt("SendKeyDownDelay", 0)
Opt("SendKeyDelay", 0)

Global $Delay = 250

DllCall('user32.dll', 'uint_ptr', 'LoadKeyboardLayoutW', 'wstr', '00000409', 'uint', '0x00000101')
While Sleep(10)
  If _IsPressed("42") Then
    $t = TimerInit()
    While _IsPressed("42")
      Sleep(10)
    WEnd
    If TimerDiff($t) > $Delay Then ContinueLoop
    While TimerDiff($t) <= $Delay
      If _IsPressed("42") Then
        While _IsPressed("42")
          Sleep(10)
        WEnd
        If TimerDiff($t) > $Delay Then ExitLoop
        $wnd = WinGetHandle("[active]")
        $kbl = _WinAPI_GetKeyboardLayout($wnd)
        _WinAPI_SetKeyboardLayout($wnd, 0x0409)
        Send("{bs 2}[b][/b]{left 4}")
        Sleep(30)
        _WinAPI_SetKeyboardLayout($wnd, StringTrimRight($kbl, 4))
      EndIf
      Sleep(10)
    WEnd
  EndIf
WEnd
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
InnI, вы пошли по другому пути, нет слов!

InnI
madmasles

Спасибо Вам!


Добавлено:
Сообщение автоматически объединено:

InnI

Вот только если раскладка не английская, то получается вот такое - "Б.иЮ"

Но это правда в окне программы AutoIt, попробовал в этом поле - вроде такого нет, странно.
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
Zalman1980 [?]
получается вот такое - "Б.иЮ"
Я проверял на Win7 x86 на внешних программах: блокнот, SciTE, AkelPad, IE с английской и русской раскладкой в том числе и при русской по умолчанию. Проблем не заметил.

в окне программы AutoIt
Это внешняя для скрипта программа? Или вы используете этот код, как часть своего скрипта с GUI? Что мне нужно сделать, чтобы попробовать увидеть вашу проблему?
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
Просто не корректно работает в GUICtrlCreateEdit и все.

Спасибо большое, я просто сейчас на работе (именно для нее это и необходимо) и нет возможности попробовать исправить.

Если у вас в GUICtrlCreateEdit работает отлично и не выводит Б.иЮ вместе , то наверно дело в моей Windows.
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
InnI, большое спасибо, теперь вроде работает как положено!
 

InnI

AutoIT Гуру
Сообщения
4,982
Репутация
1,460
Вариант без смены раскладки
Код:
#include <Misc.au3>

Opt("SendKeyDownDelay", 0)
Opt("SendKeyDelay", 0)

Global $Delay = 250

While Sleep(10)
  If _IsPressed("42") Then
    $t = TimerInit()
    While _IsPressed("42")
      Sleep(10)
    WEnd
    If TimerDiff($t) > $Delay Then ContinueLoop
    While TimerDiff($t) <= $Delay
      If _IsPressed("42") Then
        While _IsPressed("42")
          Sleep(10)
        WEnd
        If TimerDiff($t) > $Delay Then ExitLoop
        Send("{bs 2}")
        Send("{ASC 0" & Asc("<") & "}")
        Send("{ASC 0" & Asc("/") & "}")
        Send("{ASC 0" & Asc("b") & "}")
        Send("{ASC 0" & Asc(">") & "}")
      EndIf
      Sleep(10)
    WEnd
  EndIf
WEnd
 
Автор
T

The Dream

Новичок
Сообщения
393
Репутация
3
InnI

Спасибо большое!! не знаю что вами движет!! :smile: :smile: :smile: :smile:
 
Верх