im utilizando keybd_event(); y quiero usar SendMessage(); para enviar una pulsación de tecla al bloc de notas, ¿se puede hacer esto?¿Cómo enviar las teclas a una ventana?
Respuesta
usando SendMessage
para insertar texto en el búfer de edición (que suena como usted quiere):
HWND notepad = FindWindow(_T("Notepad"), NULL);
HWND edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
SendMessage(edit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));
si necesita códigos de teclas y combinaciones de teclas arbitrarias, puede utilizar SendInput()
(disponible en 2k/XP y preferido) o keybd_event()
`(que acabará llamando SendInput en nuevos sistemas operativos) aquí algunos ejemplos:
http://www.codeguru.com/forum/showthread.php?t=377393
también hay WM_SYSCOMMAND/WM_KEYDOWN/WM_KEYUP/WM_CHAR eventos para Sen dMessage que podría interesarle.
keybd_event() ha sido reemplazado con SendInput(), por lo que es mejor usarlo. Aquí hay un código de ejemplo para hacer lo que ha pedido. Puede editar directamente el control de edición de la ventana del Bloc de notas usando SendMessage(), o puede usar SendInput() para sintetizar las pulsaciones de teclas que se enviarán a la ventana.
Usando SendInput()
:
int SendKeystrokesToNotepad(const TCHAR *const text)
{
INPUT *keystroke;
UINT i, character_count, keystrokes_to_send, keystrokes_sent;
HWND notepad;
assert(text != NULL);
//Get the handle of the Notepad window.
notepad = FindWindow(_T("Notepad"), NULL);
if(notepad == NULL)
return 0;
//Bring the Notepad window to the front.
if(!SetForegroundWindow(notepad))
return 0;
//Fill in the array of keystrokes to send.
character_count = _tcslen(text);
keystrokes_to_send = character_count * 2;
keystroke = new INPUT[ keystrokes_to_send ];
for(i = 0; i < character_count; ++i)
{
keystroke[ i * 2 ].type = INPUT_KEYBOARD;
keystroke[ i * 2 ].ki.wVk = 0;
keystroke[ i * 2 ].ki.wScan = text[ i ];
keystroke[ i * 2 ].ki.dwFlags = KEYEVENTF_UNICODE;
keystroke[ i * 2 ].ki.time = 0;
keystroke[ i * 2 ].ki.dwExtraInfo = GetMessageExtraInfo();
keystroke[ i * 2 + 1 ].type = INPUT_KEYBOARD;
keystroke[ i * 2 + 1 ].ki.wVk = 0;
keystroke[ i * 2 + 1 ].ki.wScan = text[ i ];
keystroke[ i * 2 + 1 ].ki.dwFlags = KEYEVENTF_UNICODE | KEYEVENTF_KEYUP;
keystroke[ i * 2 + 1 ].ki.time = 0;
keystroke[ i * 2 + 1 ].ki.dwExtraInfo = GetMessageExtraInfo();
}
//Send the keystrokes.
keystrokes_sent = SendInput((UINT)keystrokes_to_send, keystroke, sizeof(*keystroke));
delete [] keystroke;
return keystrokes_sent == keystrokes_to_send;
}
Usando SendMessage()
:
int SendKeystrokesToNotepad(const TCHAR *const text)
{
HWND notepad, edit;
assert(text != NULL);
//Get the handle of the Notepad window.
notepad = FindWindow(_T("Notepad"), NULL);
if(notepad == NULL)
return 0;
//Get the handle of the Notepad window's edit control.
edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
if(edit == NULL)
return 0;
SendMessage(edit, EM_REPLACESEL, (WPARAM)TRUE, (LPARAM)text);
return 1;
}
Espero que ayude.
¿En el SendMax (SendInput), el KEYEVENTF_UNICODE se preocupa por el tipo de texto, que también puede ser un char? No veo KEYEVENTF_SCANCODE pero pones tu personaje en wScan. ¿Es necesario GetMessageExtraInfo()? – ManuelSchneid3r
@DevNoob: No, esto debería funcionar para compilaciones tanto Unicode como no Unicode. (Acabo de probarlo). Sí, GetMessageExtraInfo() _appears_ será necesario porque la documentación especifica que es obligatorio. Por cierto, las respuestas a sus preguntas también pueden encontrarse leyendo la documentación de MSDN para la función y los tipos correspondientes utilizando el enlace en mi respuesta. – Sam
@DevNoob, no estoy del todo seguro de lo que quieres decir con que 'KEYEVENTF_KEYUP' se haya omitido. Tampoco estoy seguro de qué quiere decir con respecto a la parte de la documentación que citó. Si se está preguntando por qué se requieren los eventos de teclado y teclado, es porque se están utilizando para generar los correspondientes mensajes de ventana WM_KEYDOWN y 'WM_KEYUP' para la ventana de destino. Estamos trabajando en un nivel bajo, y no creo que la API de Windows proporcione un mensaje 'WM_KEYPRESS' para representar una sola tecla _press_. – Sam
- 1. Enviar combinación de teclas a la ventana de fondo
- 2. ¿Enviar texto/teclas a la ventana no seleccionada?
- 3. ¿Cómo enviar una ventana de WPF a la parte posterior?
- 4. ¿Cómo enviar las teclas Control + A + B? (mantener el modificador de control "presionado")
- 5. cómo ordenar las teclas HashMap
- 6. Enviar un atajo de teclado a una ventana de Mac OS X
- 7. ¿Cómo enviar teclas de Unicode con C++ (keybd_event)
- 8. Cómo abrir una nueva ventana en el formulario enviar
- 9. cómo prevenir array_merge volver a numerar las teclas numéricas
- 10. cómo cambiar las teclas de matriz de mayúsculas a minúsculas?
- 11. Postgres: ¿Cómo hacer las teclas compuestas?
- 12. vim: cómo especificar las teclas de flecha
- 13. Javascript Publicar en el formulario Enviar abrir una nueva ventana
- 14. Enviar contenido del portapapeles como pulsaciones de teclas en AutoHotkey
- 15. ¿Inyectar comandos mediante el envío de pulsaciones de teclas a una ventana de comandos?
- 16. ¿Cómo puedo enviar claves a otra aplicación usando Delphi 7?
- 17. Enviar comando a todas las ventanas en tmux
- 18. Cómo enviar una tecla de función de función (F1..F12) a una aplicación de consola en .NET
- 19. ¿Cómo puedo enviar pulsaciones de teclas de flecha a un proceso usando Expect.pm
- 20. ¿Cómo grabar teclas presionadas?
- 21. ¿Cómo enviar una stacktrace a log4j?
- 22. Cambiar las teclas del Array a numérico en PHP
- 23. REDIS: Teclas numéricas (1,2,3 ..) frente a las teclas comprimidas (A9z3, A9z4 ..)?
- 24. ¿Cómo enviar claves en lugar de caracteres a un proceso?
- 25. Para enviar tres teclas usando send_keys() en selenium python webdriver
- 26. Enviar pulsaciones de teclas a un programa incluso si está en segundo plano usando C#
- 27. Envío de pulsaciones de teclas a un programa
- 28. PHP cambiar el nombre de las teclas de una matriz
- 29. Maldiciones al obtener las teclas de flecha
- 30. Cómo animar una ventana?
¿Cómo se envía eso a una ventana? – H4cKL0rD
No es así. Debe pasar un identificador de ventana en el parámetro 'hWnd'. Además, el identificador de ventana es el * primer * parámetro, no el tercero. –
No puede usar SendMessage() para enviar pulsaciones de teclas. No puedes controlar el estado del teclado. Particularmente las teclas Shift, Control y Alt. –