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;
ご覧のとおり、これは非常に単純です。