2010-01-21 27 views

Trả lời

7

sử dụng SendMessage để chèn văn bản vào chỉnh sửa đệm (mà có vẻ như bạn muốn):

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

nếu bạn cần mã phím và tổ hợp phím tùy ý, bạn có thể sử dụng SendInput() (có sẵn trong 2k/xp và ưa thích) hoặc keybd_event() `(mà sẽ kết thúc gọi SendInput trong phiên bản mới hơn OSS) một số ví dụ ở đây:

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

có cũng WM_SYSCOMMAND/WM_KEYDOWN/WM_KEYUP/WM_CHAR sự kiện Sen dMessage mà bạn có thể quan tâm.

+0

Làm thế nào để gửi nó vào một cửa sổ? – H4cKL0rD

+0

Không. Bạn cần phải vượt qua một tay cầm cửa sổ trong tham số 'hWnd'. Ngoài ra, xử lý cửa sổ là tham số * đầu tiên *, không phải là tham số thứ ba. –

+0

Bạn không thể sử dụng SendMessage() để gửi tổ hợp phím. Bạn không thể kiểm soát trạng thái bàn phím. Đặc biệt là các phím Shift, Control và Alt. –

5

keybd_event() đã được thay thế bằng SendInput(), vì vậy tốt nhất nên sử dụng điều đó. Dưới đây là một số mã ví dụ để làm những gì bạn đã yêu cầu. Bạn có thể chỉnh sửa trực tiếp điều khiển chỉnh sửa của cửa sổ Notepad bằng cách sử dụng SendMessage(), hoặc bạn có thể sử dụng SendInput() để tổng hợp các tổ hợp phím được gửi đến cửa sổ.

Sử dụng 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; 
} 

Sử dụng 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; 
} 

Tôi hy vọng rằng sẽ giúp.

+0

Hiện tại, trong bản đồ ngoại lệ SendInput(), KEYEVENTF_UNICODE có quan tâm đến loại văn bản, có thể là một char không? Tôi thấy không có KEYEVENTF_SCANCODE nhưng bạn đặt nhân vật của bạn trong wScan. GetMessageExtraInfo() có cần thiết không? – ManuelSchneid3r

+1

@DevNoob: Không, điều này sẽ hoạt động đối với cả bản dựng Unicode và không phải Unicode. (Tôi vừa thử nghiệm nó.) Có, GetMessageExtraInfo() _appears_ là cần thiết vì tài liệu chỉ ra rằng nó được yêu cầu. Bằng cách này, các câu trả lời cho câu hỏi của bạn cũng có thể được tìm thấy bằng cách đọc tài liệu MSDN cho các chức năng tương ứng và các loại bằng cách sử dụng liên kết trong câu trả lời của tôi. – Sam

+0

@DevNoob, tôi không hoàn toàn chắc chắn ý của bạn về 'KEYEVENTF_KEYUP' bị bỏ qua. Tôi cũng không chắc chắn những gì bạn có ý nghĩa về một phần của tài liệu bạn trích dẫn. Nếu bạn đang băn khoăn tại sao cả hai sự kiện bàn phím và khóa bàn phím đều được yêu cầu, đó là vì chúng được sử dụng để tạo ra các thông báo cửa sổ WM_KEYDOWN và 'WM_KEYUP' tương ứng cho cửa sổ đích. Chúng tôi đang làm việc trên một mức độ thấp, và tôi không nghĩ rằng Windows API cung cấp một thông điệp 'WM_KEYPRESS' để đại diện cho một khóa duy nhất _press_. – Sam

Các vấn đề liên quan