Ctrl + A не является встроенным ускорителем, как Ctrl + C и Ctrl + V . Вот почему вы видите сообщения WM_CUT, WM_PASTE и WM_COPY, но WM_SELECTALL не определено.
Вы должны реализовать эту функцию самостоятельно. Я сделал это в своем приложении MFC следующим образом:
static BOOL IsEdit( CWnd *pWnd )
{
if ( ! pWnd ) return FALSE ;
HWND hWnd = pWnd->GetSafeHwnd();
if (hWnd == NULL)
return FALSE;
TCHAR szClassName[6];
return ::GetClassName(hWnd, szClassName, 6) &&
_tcsicmp(szClassName, _T("Edit")) == 0;
}
BOOL LogWindowDlg::PreTranslateMessage(MSG* pMsg)
{
if(pMsg->message==WM_KEYDOWN)
{
if ( pMsg->wParam=='A' && GetKeyState(VK_CONTROL)<0 )
{
// User pressed Ctrl-A. Let's select-all
CWnd * wnd = GetFocus() ;
if ( wnd && IsEdit(wnd) )
((CEdit *)wnd)->SetSel(0,-1) ;
}
}
return CDialog::PreTranslateMessage(pMsg);
}
Обратите внимание, я украл IsEdit с этой страницы: http://support.microsoft.com/kb/145616
Я отмечаю это отчасти потому, что хочу отдать должное, а отчасти потому, что считаю, что функция IsEdit (сравнение строк с именами классов) глупа, и я хочу обвинить.