9

Ctrl+を押して編集コントロール内のすべてのテキストを選択する方法はA? WndProc で親ウィンドウのCtrl+をキャッチできます。しかし、編集コントロールに適用される+Aをキャッチする方法がわかりません。また、アクセラレータを使用しようとしましたが、これも親ウィンドウにのみ適用されます。ありがとう。編集:1番目の最も簡単な方法この方法は、この質問での@phordの回答に基づいています: win32編集ctrl(テキストボックス)ですべて選択ctrla

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

編集: 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;

ご覧のとおり、これは非常に単純です。

4

4 に答える 4

9

WM_KEYDOWN を処理する必要はありません。ここにあるほとんどの例 (および CodeProject と他の多くの場所) はすべて存在すると言っていますが、処理されない WM_CHAR が発生するたびに発生するビープ音は治りません。

代わりに、これを試してください:

LRESULT CALLBACK Edit_Prc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){
  if(msg==WM_CHAR&&wParam==1){SendMessage(hwnd,EM_SETSEL,0,-1); return 1;}
  else return CallWindowProc((void*)WPA,hwnd,msg,wParam,lParam);
}

WPA=SetWindowLong(...) を使用して、EDIT コントロールをこの Edit_Prc() にサブクラス化することを忘れないでください。ここで、WPA は CallWindowProc(...) のウィンドウ プロシージャ アドレスです。

于 2014-08-18T03:16:40.253 に答える
6

まず、編集コントロールの WindowProc を変更します。

if (!(pEditProc = (WNDPROC)SetWindowLong(hEdit, GWL_WNDPROC, (LONG)&EditProc)))
{
    assert(false);
    return false;
}

次に、新しいウィンドウ プロシージャで、ctrl+a を処理します。

LRESULT CALLBACK EditProc( HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
    if (msg == WM_KEYDOWN) {
        if (GetKeyState(VK_CONTROL) & 0x8000 && wParam == 'A') {
            SendMessage(hwnd, EM_SETSEL, 0, -1);
        }
    }
    return CallWindowProc(pEditProc, hwnd, msg, wParam, lParam);
}
于 2013-01-17T03:19:07.610 に答える