Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Если LCtrl удерживалась меньше 1 секунды, то действие1, иначе действие2. (http://forum.oszone.net/showthread.php?t=148923)

beve 26-08-2009 09:46 1203487

Если LCtrl удерживалась меньше 1 секунды, то действие1, иначе действие2.
 
Возможно ли реализовать такое:
Код:

While 1
   
_IsPressed("A2") Then _function() ;если нажата клавиша - левый Ctrl то...
   
Sleep
(100)
WEnd

Func
_function()
;тут производится обработка, если клавиша - левый ctrl была просто нажата меньше секунды и отпущена то вызов функции
   
If .... Then
       
_next()
;если же клавиша левый ctrl была удержана больше секунды то выход из функции
   
Else
        Return
    EndIf
EndFunc
;_function()

Func _next()
   
MsgBox(0,"","тест")
EndFunc
;_next()

P.S. Алгоритм может быть другим, важна суть.

amel27 27-08-2009 09:48 1204391

beve, не понял - у тебя ведь уже была похожая задача?
[решено] Отслеживание нажатий клавиш на клавиатуре (чтоб узнать код нажатой клавиши)

- фиксируешь нажатие, включаешь таймер
- фиксируешь отжатие, измеряешь время, далее в зависимости от интервала

beve 27-08-2009 12:43 1204548

Цитата:

Цитата amel27
у тебя ведь уже была похожая задача?
[решено] Отслеживание нажатий клавиш на клавиатуре (чтоб узнать код нажатой клавиши)
- фиксируешь нажатие, включаешь таймер
- фиксируешь отжатие, измеряешь время, далее в зависимости от интервала »

Ну чтоб "поймать" нажатие клавиши LCtrl, достаточно в функцию _EvaluateKey_Proc($nKeyCode) в том примере добавить еще один Case: Case 162. Но вот как там "поймать" отжатие клавиши?

Medic84 27-08-2009 13:07 1204567

Конечно глуповатая функция, и врядли работающая(Честно скажу что не проверял)

Код:

While _IsPressed(11)
$Time += 0.1
Sleep(100)
WEnd

Не пинайте сильно :) Я всего лишь начинающий....

SyDr 27-08-2009 13:18 1204572

Код:

$tHandle = TimerInit()
While _IsPressed($nKeyCode)
Sleep(50)
WEnd
If TimerDiff($tHandle) > 2000 Then
_SomeFunc()
Else
_AnotherFunc()
EndIf


beve 27-08-2009 14:24 1204614

Код:

#include <Misc.au3>

While 1
   
If
_IsPressed("A2") Then  _function() ;если нажата клавиша - левый Ctrl то...
   
Sleep
(50)
WEnd

Func
_function()
;тут производится обработка, если клавиша - левый ctrl была просто нажата меньше секунды и отпущена то вызов функции
   
$tHandle = TimerInit()
   
While
_IsPressed("A2")
   
Sleep(50)
   
WEnd
    If
TimerDiff($tHandle) <500 Then
       
_next()
;если же клавиша левый ctrl была удержана больше секунды то выход из функции
   
Else
        Return
    EndIf
EndFunc
;_function()

Func _next()
   
MsgBox(0,"","тест",1)
EndFunc
;_next()


amel27 28-08-2009 09:37 1205226

Цитата:

Цитата beve
Но вот как там "поймать" отжатие клавиши? »

хде-то так:
Код:

#include <WindowsConstants.au3>
#include <StructureConstants.au3>
#include <Timers.au3>
#include <WinAPI.au3>

HotKeySet("{ESC}", "OnAutoItExit")

Global $hStub_KeyProc = DllCallbackRegister("_Key_Proc", "int", "int;ptr;ptr")
Global $hHook = _WinAPI_SetWindowsHookEx($WH_KEYBOARD_LL, DllCallbackGetPtr($hStub_KeyProc), _WinAPI_GetModuleHandle(0))

Global $CtrlState = 0
Global $CtrlLimit = 500
Global $CtrlTimer = 0

While 1
    If $CtrlState = 2 Then                      ; по ходу нажали...
        If $CtrlTimer < $CtrlLimit Then _next()  ; и сколько держали?
        $CtrlState = 0                          ; уже обработали!
    EndIf
    Sleep(100)
WEnd

Func _next()
    ConsoleWrite("типа контрал, типа левый, типа быстро, типа нажал..." &@CRLF)
EndFunc

Func _Key_Proc($nCode, $wParam, $lParam)
    If $nCode < 0 Then Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
    Local $KEYHOOKSTRUCT = DllStructCreate($tagKBDLLHOOKSTRUCT, $lParam)
    ; Обработка нажатия левого CTRL: установка флага и таймера
    If $CtrlState=0 And $wParam = $WM_KEYDOWN And DllStructGetData($KEYHOOKSTRUCT,"vkCode")=162 Then
        $CtrlTimer = _Timer_Init()
        $CtrlState=1
    EndIf
    ; Обработка отжатия левого CTRL: сброс флага, установка таймера
    If $CtrlState=1 And $wParam = $WM_KEYUP And DllStructGetData($KEYHOOKSTRUCT,"vkCode")=162 Then
        $CtrlTimer = _Timer_Diff($CtrlTimer)
        $CtrlState=2
    EndIf

    Return _WinAPI_CallNextHookEx($hHook, $nCode, $wParam, $lParam)
EndFunc

Func OnAutoItExit()
    If $hStub_KeyProc Then DllCallbackFree($hStub_KeyProc)
    If $hHook Then _WinAPI_UnhookWindowsHookEx($hHook)
    If @HotKeyPressed <> "" Then Exit
EndFunc



Время: 17:26.

Время: 17:26.
© OSzone.net 2001-