2013-03-29 34 views
6

我有一個編輯控件編輯控件捕捉回車鍵

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); 

和一個按鈕:

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); 

有沒有辦法看的時候,同時編輯控件 打字鍵被按下回車併發送消息,如按鈕被按下?

我想,也許

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

將用於發送郵件做的工作,但我仍然停留在捕捉回車鍵。

預先感謝您。

+0

這樣做的傳統方式是聲明定義ENTER作爲映射到'IDC_MAIN_SENDBUTTON'加速器表。還要注意''GetModuleHandle(NULL)'不是最好的做法,因爲它把你的窗口放在主要可執行文件的命名空間中,而不是創建窗口的模塊。 –

回答

10

您需要繼承編輯控件並處理WM_KEYDOWN消息。如果它是你想要的密鑰,發送消息,否則,讓默認的編輯控制程序完成它的工作。

的代碼會是這樣的:

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

我這樣做是在對話框:

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); 
}