Как отправить нажатия клавиш в окно? - PullRequest
8 голосов
/ 22 января 2010

я использую keybd_event (); и я хочу использовать SendMessage (); чтобы отправить нажатие клавиш в блокнот, это можно сделать?

Ответы [ 2 ]

8 голосов
/ 22 января 2010

, используя SendMessage для вставки текста в буфер редактирования (который звучит так, как вы хотите):

HWND notepad = FindWindow(_T("Notepad"), NULL);
HWND edit = FindWindowEx(notepad, NULL, _T("Edit"), NULL);
SendMessage(edit, WM_SETTEXT, NULL, (LPARAM)_T("hello"));

если вам нужны коды клавиш и произвольные нажатия клавиш, вы можете использовать SendInput() (доступно в 2k / xp и предпочтительно) или keybd_event() `(что в конечном итоге вызов SendInput в более новых ОС) некоторые примеры здесь:

http://www.codeguru.com/forum/showthread.php?t=377393

есть также события WM_SYSCOMMAND / WM_KEYDOWN / WM_KEYUP / WM_CHAR для SendMessage, которые могут вас заинтересовать.

6 голосов
/ 22 января 2010

keybd_event () заменено на SendInput (), поэтому лучше использовать это. Вот пример кода, чтобы сделать то, что вы просили. Вы можете либо напрямую отредактировать элемент управления редактирования окна Блокнота с помощью SendMessage (), либо вы можете использовать SendInput () для синтеза нажатий клавиш, которые будут отправлены в окно.

Использование 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;
}

Использование 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;
}

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...