Выделите весь текст в поле редактирования, нажав Ctrl+A

Как выделить весь текст в редактировании, нажав Ctrl + A ? Я могу поймать Ctrl + A для родительского окна в WndProc. Но я не знаю, как поймать ctrl + a , которые применяются для управления редактированием. Также я пробовал использовать ускорители, но опять же это применимо только для родительского окна. Спасибо. РЕДАКТИРОВАТЬ:1-самый простой метод Этот метод основан на ответах @phord на этот вопрос: win32 выбрать все при редактировании ctrl (текстовое поле)

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        if (msg.message == WM_KEYDOWN && msg.wParam == 'A' && GetKeyState(VK_CONTROL) < 0)
    {
        HWND hFocused = GetFocus();
        wchar_t className[6];
        GetClassName(hFocused, className, 6);
        if (hFocused && !wcsicmp(className, L"edit"))
            SendMessage(hFocused, EM_SETSEL, 0, -1);
    }
    TranslateMessage(&msg);
    DispatchMessage(&msg);
    }
}

EDIT :2 -метод Необходимо использовать функции CreateAcceleratorTable + TranslateAccelerator:

//глобальные переменные:

enum {ID_CTRL_A = 1};
HACCEL accel;

//основная процедура

ACCEL ctrl_a;
ctrl_a.cmd = ID_CTRL_A; // Hotkey ID
ctrl_a.fVirt = FCONTROL | FVIRTKEY;
ctrl_a.key = 0x41; //'A' key
accel = CreateAcceleratorTable(&ctrl_a, 1); //we have only one hotkey

//как выглядит цикл GetMessage

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        if (!TranslateAccelerator(hWnd, accel,  &msg))
        {
            TranslateMessage(&msg); 
            DispatchMessage(&msg); 
        }
    }
}

//в WndProc мы должны добавить следующие случаи

case WM_COMMAND:
{
    if (LOWORD(wParam) == ID_CTRL_A && HIWORD(wParam) == 1)
    {
        //on which control there was pressed Ctrl+A
        //there is no way of getting HWND through wParam and lParam
        //so we get HWND which currently has focus.
        HWND hFocused = GetFocus();
        wchar_t className[6];
        GetClassName(hFocused, className, 6);
        if (hFocudsed && !wcsicmp(className, L"edit"))
            SendMessage(hFocused, EM_SETSEL, 0, -1);
    }
}
break;
case WM_DESTROY:
{
   DestroyAcceleratorTable(accel);
   PostQuitMessage(0);
}
break;

Как вы видите это довольно просто.

9
задан Community 23 May 2017 в 12:32
поделиться