Usuário com melhor resposta
Capturar teclas digitadas e jogar numa variável.

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:
Entretanto, não consigo jogar para uma variável, meu objetivo inicial:void _listener_OnKeyPressed(object sender, KeyPressedArgs e)
{ this.rtb_Hook.Text += e.KeyPressed.ToString();
}
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; } }
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
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
-
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.
-
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.