在文本框中检测 CTRL+A

Detect CTRL+A in a texbox

我有一个主 window hwndMain 和一个多行 Edit 文本框:

hwndEdit = CreateWindowEx(0, L"EDIT", NULL, WS_CHILD | WS_VISIBLE | ES_LEFT | ES_MULTILINE | ES_AUTOVSCROLL, 0, 0, 300, 200, hwndMain, 0, (HINSTANCE) GetWindowLong(hwndMain, GWL_HINSTANCE), NULL);

我用它来检测文本框中的 CTRL+A​​(因为奇怪的是,它不是开箱即用的):

LRESULT CALLBACK WindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    switch (uMsg)
    {
        case WM_KEYDOWN:
        {
            if (wParam == VK_CONTROL)  // something here missing for detecting "A"
            {
                SendMessage(hwndEdit, EM_SETSEL, 0, -1);    // select all ; this code works on its own, tested
            }
            ...

不幸的是,当我执行 CTRL+A​​CTRL+[= 时没有任何反应16=]B 或 CTRL+ 任何东西。

怎么了?

注意:好的,检测A的代码仍然缺失(我仍然不知道该怎么做),但是这里的代码应该适用于任何CTRL+键...

只需检查 A 的 WM_KEYDOWN,然后使用 GetKeyState

case WM_KEYDOWN:
  {
    if (wParam=='A' && (::GetKeyState(VK_CONTROL) & 0x8000)!=0)
    {
      SendMessage(hwndEdit, EM_SETSEL, 0, -1);    // select all
    }

请记住,WM_KEYDOWN 仅发送给具有焦点的 window,而不发送给父级 windows。

在您创建所有 windows 之后:

hwndEdit = CreateWindowEx(.....)
...

//Subbclassing
SetWindowSubclass(hwndEdit, (SUBCLASSPROC)EditWndProc, 0, 1);


LRESULT CALLBACK EditWndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam, UINT_PTR uIdSubclass, DWORD_PTR dwrefData){

    switch(message){ //handle the messages   
        case WM_KEYDOWN:
            //your code

           break;
        default:   //for messages that we don't deal with
            return DefSubclassProc(hwnd, message, wParam, lParam);
    }

    return DefSubclassProc(hwnd, message, wParam, lParam);
}