none
Capturar teclas digitadas e jogar numa variável. RRS feed

  • Pergunta

  • Olá, arrumei na net uma classe que permite capturar as teclas digitadas (Código abaixo). Eu consigo capturar as teclas à medida que elas vão sendo digitadas e escrevê-las num Richtextbox: 

     

    void _listener_OnKeyPressed(object sender, KeyPressedArgs e)       

    {             this.rtb_Hook.Text += e.KeyPressed.ToString();

    }

    Entretanto, não consigo jogar para uma variável, meu objetivo inicial:
     string txtPesquisa +=  e.KeyPressed.ToString();
    Aparece erro nos sinais de += dizendo que o termo de expressão é inválido. Por que? Não consigo entender. Toda ajuda é bem vinda. Obrigado.

    public class LowLevelKeyboardListener { private const int WH_KEYBOARD_LL = 13; private const int WM_KEYDOWN = 0x0100; private const int WM_SYSKEYDOWN = 0x0104; [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] [return: MarshalAs(UnmanagedType.Bool)] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] private static extern IntPtr GetModuleHandle(string lpModuleName); public delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam); public event EventHandler<KeyPressedArgs> OnKeyPressed; private LowLevelKeyboardProc _proc; private IntPtr _hookID = IntPtr.Zero; public LowLevelKeyboardListener() { _proc = HookCallback; } public void HookKeyboard() { _hookID = SetHook(_proc); } public void UnHookKeyboard() { UnhookWindowsHookEx(_hookID); } private IntPtr SetHook(LowLevelKeyboardProc proc) { using (Process curProcess = Process.GetCurrentProcess()) using (ProcessModule curModule = curProcess.MainModule) { return SetWindowsHookEx(WH_KEYBOARD_LL, proc, GetModuleHandle(curModule.ModuleName), 0); } } private IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN || wParam == (IntPtr)WM_SYSKEYDOWN) { int vkCode = Marshal.ReadInt32(lParam); if (OnKeyPressed != null) { OnKeyPressed(this, new KeyPressedArgs(KeyInterop.KeyFromVirtualKey(vkCode))); } } return CallNextHookEx(_hookID, nCode, wParam, lParam); } } public class KeyPressedArgs : EventArgs { public Key KeyPressed { get; private set; } public KeyPressedArgs(Key key) { KeyPressed = key; } }


    domingo, 4 de fevereiro de 2018 14:29

Respostas

  • O += funcionaria como um acumulador, ou seja, acrescentaria um novo valor ao valor existente, porém, se estiver declarando a variável dentro do método do evento, esta será criada novamente a cada disparo do evento, então não faz sentido.

    O correto seria declarar a variável fora do evento e fazer o acúmulo dos valores dentro do método.

    public class Algo
    {
        string txtPesquisa = String.Empty;
    
        public void _listener_OnKeyPressed(...)
        {
            txtPesquisa += e.KeyPressed.ToString();
        }
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta Denis Valjean domingo, 4 de fevereiro de 2018 15:12
    domingo, 4 de fevereiro de 2018 15:05

Todas as Respostas

  • O += funcionaria como um acumulador, ou seja, acrescentaria um novo valor ao valor existente, porém, se estiver declarando a variável dentro do método do evento, esta será criada novamente a cada disparo do evento, então não faz sentido.

    O correto seria declarar a variável fora do evento e fazer o acúmulo dos valores dentro do método.

    public class Algo
    {
        string txtPesquisa = String.Empty;
    
        public void _listener_OnKeyPressed(...)
        {
            txtPesquisa += e.KeyPressed.ToString();
        }
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    • Marcado como Resposta Denis Valjean domingo, 4 de fevereiro de 2018 15:12
    domingo, 4 de fevereiro de 2018 15:05
  • O += funcionaria como um acumulador, ou seja, acrescentaria um novo valor ao valor existente, porém, se estiver declarando a variável dentro do método do evento, esta será criada novamente a cada disparo do evento, então não faz sentido.

    O correto seria declarar a variável fora do evento e fazer o acúmulo dos valores dentro do método.

    public class Algo
    {
        string txtPesquisa = String.Empty;
    
        public void _listener_OnKeyPressed(...)
        {
            txtPesquisa += e.KeyPressed.ToString();
        }
    }


    Juliano Nunes - http://linkedin.com/in/julianonunes

    Lembre-se de clicar em "Votar como útil" e "Marcar como Resposta" caso tenha respondido sua dúvida.

    Remember to "Vote as Helpful" and "Mark as Answer" if your question has been answered.

    Valeu amigo. Tinha tentado por fora e estava dando erro, depois vi que tinha feito uma burrice aqui. Valeu!!
    domingo, 4 de fevereiro de 2018 15:13
  • Aproveitando da boa vontade, alguém sabe me dizer porque as teclas modificadoras (ALT, SHIFT, CONTROL) não são detectadas nessa classe? as outras teclas são capturadas direito.

      if (e.KeyPressed.ToString() == Keys.LShiftKey.ToString())  
    
                {
                    MessageBox.Show(txtPesquisa);
    
    
    

    não é exibida a MessageBox.. Pras outras teclas (ABCD) exibe.

    domingo, 4 de fevereiro de 2018 16:19