2010-01-21 18 views

Respuesta

7

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.

+0

¿Cómo se envía eso a una ventana? – H4cKL0rD

+0

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. –

+0

No puede usar SendMessage() para enviar pulsaciones de teclas. No puedes controlar el estado del teclado. Particularmente las teclas Shift, Control y Alt. –

5

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.

+0

¿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

+1

@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

+0

@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

Cuestiones relacionadas