Jump to content
Belini

Hotkeyset() - Chamar função apenas uma vez

Recommended Posts

Existe alguma maneira para quando eu pressionar uma tecla que foi definida como hotkkey chamar a função apenas uma vez sem que eu precise usar _WinAPI_GetAsyncKeyState  ou _IsPressed para saber quando ela foi solta? 

Share this post


Link to post
Share on other sites

Esqueci de responder no sábado...

Não olhei as funções em si, nem para verificar alguma alternativa melhor, mas segue um macete para impedir a rotina de se autoexecutar inúmeras vezes.

Quer dizer, estou supondo que vc não quer que a rotina seja chamada várias vezes durante o pressionamento da tecla, isto?

Tipo ficar segurando a tecla?

Share this post


Link to post
Share on other sites
2 hours ago, Manimal said:

mas segue um macete para impedir a rotina de se autoexecutar inúmeras vezes

Qual macete?

2 hours ago, Manimal said:

Quer dizer, estou supondo que vc não quer que a rotina seja chamada várias vezes durante o pressionamento da tecla, isto?

Sim exatamente isto não quero chamar a função mais que uma vez durante o tempo que a tecla ficar pressionada mas também não quero ter que usar _WinAPI_GetAsyncKeyState  ou _IsPressed para saber quando ela foi solta .

Share this post


Link to post
Share on other sites

Esqueci do macete...

Func MinhaFunc ()
   Local Static $bExecutando = False
   If $bExecutando Then Return
   $bExecutando = True
;~    resto da minha funcao
   $bExecutando = False
EndFunc

Veja se serve. Isto faz com que a tecla pressionada seja executada apenas uma vez completamente.

Se ficar pressionando a tecla, vai executar a função sequencialmente (executa a 1a vez, termina, executa a 2a vez, termina, etc..) mas não vai executar simultaneamente (executa a 1a vez e já sai executando a 2a vez junto com a 3a, etc)

Veja se isso serve...

Share this post


Link to post
Share on other sites

Assim também não resolve pois são créditos ai vai ficar dando créditos durante o tempo que a tecla ficar pressionada!

Share this post


Link to post
Share on other sites

Por algum motivo está travando no loop e reconhecendo a tecla como pressionada mesmo depois que é solta aí o programa todo perde as funções pois não sai mais do loop, não era prá acontecer mas parece que verificar o pressionamento várias vezes seguidas e com intevalo curto está fazendo detectar a tecla sempre pressionada.

Share this post


Link to post
Share on other sites

Enfim resolvi o problema e não vai acreditar o que era, faltava o diodo IN4007 prá evitar reboot no relé e não tinha visto pois a placa do teclado e o relé ficam dentro de uma caixinha preta pensei que fosse o programa porque o noteiro que está nela é um BV20 que manda pulsos bem mais rápido que o BL700 e por mandar mais rápido os reboots são quase juntos por isto acontecia nele e não acontecia com o BL700.

  • Thanks 1

Share this post


Link to post
Share on other sites

Ahhh entendi....                                                                                                      (bost* nenhuma kkkk)

  • Haha 1

Share this post


Link to post
Share on other sites

Foi sim e eu bem achando que eram os pulsos rápidos que estavam travando o programa e na verdade era o reboot do relé que travava o teclado e por isto ficava indicando que estava pressionado o tempo todo.

  • Like 1

Share this post


Link to post
Share on other sites
#include <MsgBoxConstants.au3>

HotKeySet("a", "ShowMessage")

While Sleep(100)
    Switch GUIGetMsg()
            Case $GUI_EVENT_CLOSE
                ExitLoop
    EndSwitch
WEnd


Func ShowMessage()
    HotKeySet("a")                  ;Remove a Hotkey durante a execução da função

    MsgBox($MB_SYSTEMMODAL, "", "Testando.")    ;Executa qualquer coisa
    Sleep(1000)

    HotKeySet("a", "ShowMessage")           ;Adiciona novamente a hotkey
EndFunc

 

Edited by Pedro Pinheiro
  • Like 1

Share this post


Link to post
Share on other sites

@Pedro Pinheiro desta forma não resolve pois se a tecla ficar presa vai executar a função repetidamente ou seja desinstala a hotkey executa instala novamente executa... o que eu queria no início do tópico era usar Hotkeyset() e a função ser executada apenas uma vez até a tecla ser solta mas sem usar _WinAPI_GetAsyncKeyState  ou _IsPressed  e sem precisar desinstalar a hotkey se eu achasse o código da função hotkeyset() talvez conseguisse alterá-lo prá ficar desta forma mas não encontrei e acaba que descobri que o problema aqui era a falta do diodo IN4007 no relé de crédito aí pude voltar a usar _WinAPI_GetAsyncKeyState para saber quando a tecla foi liberada.

Share this post


Link to post
Share on other sites

Olha um exemplo do _IsPressed. Talvez te ajude

 

#include <Misc.au3>
#include <MsgBoxConstants.au3>

Local $hDLL = DllOpen("user32.dll"), $pressed = False

While 1
    Select
        Case  _IsPressed("1B", $hDLL)
            ExitLoop
        Case  _IsPressed("10", $hDLL)
            if Not $pressed Then ConsoleWrite("Shift pressionado!" & @CRLF)
            $pressed = True
        case Else
            $pressed = False
    EndSelect
WEnd

DllClose($hDLL)

 

Edited by Pedro Pinheiro
  • Like 1

Share this post


Link to post
Share on other sites

@Pedro pinheiro estas funções todas eu conheço e já usei, só queria usar Hotkeyset() sem outra função que verificasse se a tecla foi solta ( _WinAPI_GetAsyncKeyState  ou _IsPressed ) porque achei que estava perdendo créditos por estar usando elas e depois descobri que era a falta de um diodo que estava fazendo travar o teclado ou seja já foi resolvido se bem que se encontrasse o código da função Hotkeyset() poderia tentar fazer a função ser chamada apenas uma vez sem precisar desinstalar a hotkey e usar outra função para monitorar quando foi solta e isto com certeza iria tornar a verificação muito mais rápida, se vc encontrar o código da função Hotkeyset() me passa que aí faço testes aqui, enquanto isto se tiver alguma dica de como resolver o problema dos vídeos ficarem em tela cheia pode postar aqui ==>  http://www.autoitbrasil.com/forum/index.php?/topic/2174-abrir-vídeo-em-tela-cheia-usando-udf-videoau3/

Share this post


Link to post
Share on other sites

@Belini

Segue minhas sugestões:

 

Sugestão 1:

;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/

#include <Misc.au3>

Global $hDLL = DllOpen("user32.dll")

Global $aKeys[][4] = [ _
        [2], _
        [10, False, "ShiftOn", "ShiftOff"], _
        [11, False, "CtrlOn", "CtrlOff"] _
        ]

While Sleep(10)
    For $ii = 1 To $aKeys[0][0]
        If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then
            Call($aKeys[$ii][2])
            $aKeys[$ii][1] = True
        ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then
            Call($aKeys[$ii][3])
            $aKeys[$ii][1] = False
        EndIf
    Next
WEnd

Func ShiftOn()
    ConsoleWrite("Shift On!" & @LF)
EndFunc   ;==>ShiftOn

Func ShiftOff()
    ConsoleWrite("Shift Off!" & @LF)
EndFunc   ;==>ShiftOff

Func CtrlOn()
    ConsoleWrite("Ctrl On!" & @LF)
EndFunc   ;==>ShiftOn

Func CtrlOff()
    ConsoleWrite("Ctrl Off!" & @LF)
EndFunc   ;==>ShiftOff

DllClose($hDLL)

 

Sugestão 2:
 

;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/

#include <Misc.au3>
#include <MsgBoxConstants.au3>

Global $hDLL = DllOpen("user32.dll")
Global $aKeys[][4] = [ _
        [2], _
        [10, False, ShiftOn, ShiftOff], _
        [11, False, CtrlOn, CtrlOff] _
        ]

While Sleep(10)
    For $ii = 1 To $aKeys[0][0]
        If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then
            $aKeys[$ii][2]()
            $aKeys[$ii][1] = True

        ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then
            $aKeys[$ii][3]()
            $aKeys[$ii][1] = False
        EndIf
    Next
WEnd

Func ShiftOn()
    ConsoleWrite("Shift On!" & @LF)
EndFunc   ;==>ShiftOn

Func ShiftOff()
    ConsoleWrite("Shift Off!" & @LF)
EndFunc   ;==>ShiftOff

Func CtrlOn()
    ConsoleWrite("Ctrl On!" & @LF)
EndFunc   ;==>ShiftOn

Func CtrlOff()
    ConsoleWrite("Ctrl Off!" & @LF)
EndFunc   ;==>ShiftOff

DllClose($hDLL)

 

Sugestão 3:
 

;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/

#include <Misc.au3>

Global $hDLL = DllOpen("user32.dll")

Global $aKeys[][4] = [ _
        [2], _
        [10, False, ShiftOn, ShiftOff], _
        [11, False, CtrlOn, CtrlOff] _
        ]

While Sleep(10)
    For $ii = 1 To $aKeys[0][0]
        If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then
            $aKeys[$ii][1] = $aKeys[$ii][2]()
        ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then
            $aKeys[$ii][1] = $aKeys[$ii][3]()
        EndIf
    Next
WEnd

Func ShiftOn()
    ConsoleWrite("Shift On!" & @LF)
    Return True
EndFunc   ;==>ShiftOn

Func ShiftOff()
    ConsoleWrite("Shift Off!" & @LF)
    Return False
EndFunc   ;==>ShiftOff

Func CtrlOn()
    ConsoleWrite("Ctrl On!" & @LF)
    Return True
EndFunc   ;==>ShiftOn

Func CtrlOff()
    ConsoleWrite("Ctrl Off!" & @LF)
    Return False
EndFunc   ;==>ShiftOff

DllClose($hDLL)

 

Sugestão 4:
 

;~ http://www.autoitbrasil.com/forum/index.php?/topic/2177-hotkeyset-chamar-fun%C3%A7%C3%A3o-apenas-uma-vez/

#include <Misc.au3>

Global $hDLL = DllOpen("user32.dll")

Global $aKeys[][3] = [ _
        [2], _
        [10, False, Shift], _
        [11, False, Ctrl] _
        ]

While Sleep(10)
    For $ii = 1 To $aKeys[0][0]
        If _IsPressed($aKeys[$ii][0], $hDLL) And Not $aKeys[$ii][1] Then
            $aKeys[$ii][2]($ii)
        ElseIf Not _IsPressed($aKeys[$ii][0], $hDLL) And $aKeys[$ii][1] Then
            $aKeys[$ii][2]($ii)
        EndIf
    Next
WEnd

Func Shift($id)
    Switch $aKeys[$ii][1]
        Case True
            ConsoleWrite("Shift Off!" & @LF)
        Case False
            ConsoleWrite("Shift On!" & @LF)
    EndSwitch
    $aKeys[$id][1] = Not $aKeys[$id][1]
EndFunc   ;==>ShiftOn

Func Ctrl($id)
    Switch $aKeys[$ii][1]
        Case True
            ConsoleWrite("Ctrl Off!" & @LF)
        Case False
            ConsoleWrite("Ctrl On!" & @LF)
    EndSwitch
    $aKeys[$id][1] = Not $aKeys[$id][1]
EndFunc   ;==>ShiftOn

DllClose($hDLL)

 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×