2013-03-29 30 views
6

Tôi có một điều khiển sửaSửa chụp kiểm soát nhập key

HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL); 

và một nút:

HWND hSendButton = CreateWindowEx(WS_EX_CLIENTEDGE,"BUTTON","Send!", 
     BS_DEFPUSHBUTTON | WS_VISIBLE | WS_CHILD, 
     0,0,0,0,hwnd,(HMENU)IDC_MAIN_SENDBUTTON,GetModuleHandle(NULL),NULL); 

Có cách nào để xem khi phím Enter được nhấn trong khi gõ vào ô sửa đổi kiểm soát và gửi một tin nhắn như nút được nhấn?

Tôi nghĩ rằng có lẽ

SendMessage(hwnd,WM_COMMAND,(WPARAM)IDC_MAIN_SENDBUTTON,LPARAM(0)); 

sẽ làm công việc cho gửi tin nhắn nhưng tôi vẫn đang bị mắc kẹt tại chụp phím Enter.

Cảm ơn bạn trước.

+0

Cách truyền thống để làm điều này là để tuyên bố một bảng gia tốc xác định ENTER như lập bản đồ cho 'IDC_MAIN_SENDBUTTON' . Cũng lưu ý rằng 'GetModuleHandle (NULL)' không phải là thực hành tốt nhất vì nó đặt các cửa sổ của bạn trong không gian tên của tệp thực thi chính thay vì mô đun đã tạo cửa sổ. –

Trả lời

10

Bạn cần phân lớp kiểm soát chỉnh sửa và xử lý tin nhắn WM_KEYDOWN. Nếu đó là chìa khóa bạn muốn, hãy gửi tin nhắn, nếu không, hãy để quy trình kiểm soát chỉnh sửa mặc định thực hiện công việc của nó.

Mã này sẽ như thế này:

WNDPROC oldEditProc; 

LRESULT CALLBACK subEditProc(HWND wnd, UINT msg, WPARAM wParam, LPARAM lParam) 
{ 
    switch (msg) 
    { 
    case WM_KEYDOWN: 
     switch (wParam) 
     { 
      case VK_RETURN: 
      //Do your stuff 
       break; //or return 0; if you don't want to pass it further to def proc 
      //If not your key, skip to default: 
     } 
    default: 
     return CallWindowProc(oldEditProc, wnd, msg, wParam, lParam); 
    } 
    return 0; 
} 

void somecreateeditproc() 
{ 
    HWND hInput = CreateWindowEx(WS_EX_CLIENTEDGE, "EDIT", "", 
    WS_CHILD | WS_VISIBLE | WS_VSCROLL | ES_MULTILINE | ES_AUTOVSCROLL, 
    0, 0, 100, 100, hwnd, (HMENU)IDC_MAIN_INPUT, GetModuleHandle(NULL), NULL); 

    oldEditProc = (WNDPROC)SetWindowLongPtr(hInput, GWLP_WNDPROC, (LONG_PTR)subEditProc); 
} 
0

tôi làm điều đó trong hộp thoại:

BOOL CDialogObject::PreTranslateMessage(MSG* pMsg) 
{ 
    if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_RETURN) 
    { 
     SendMessage(WM_COMMAND, (WPARAM)IDC_BUTTON3,LPARAM(0)); 
    } 
    return CDialog::PreTranslateMessage(pMsg); 
} 
Các vấn đề liên quan