ソフトウェア開発 Win32プログラミング

EDITコントロールでCtrl+Aを有効にする

戻る


エディットコントロールでCtrl+Aを押すとすべて選択するようにするには、ウィンドウのサブクラス化ではなく、以下のようにローカルフックを使うと簡単だ。

#include <windows.h>

// hook for Ctrl+A
HHOOK g_hCtrlAHook = NULL;

// hook proc for Ctrl+A
LRESULT CALLBACK CtrlAMessageProc(INT nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode < 0)
        return CallNextHookEx(g_hCtrlAHook, nCode, wParam, lParam);

    MSG *pMsg = (MSG *) lParam;
    TCHAR szClassName[64];

    HWND hWnd;
    if (pMsg->message == WM_KEYDOWN)
    {
        if ((INT) pMsg->wParam == 'A' &&
            GetAsyncKeyState(VK_CONTROL) < 0 &&
            GetAsyncKeyState(VK_SHIFT) >= 0 &&
            GetAsyncKeyState(VK_MENU) >= 0)
        {
            // Ctrl+A is pressed
            hWnd = GetFocus();
            if (hWnd != NULL)
            {
                GetClassName(hWnd, szClassName, 64);
                if (lstrcmpi(szClassName, TEXT("EDIT")) == 0)
                {
                    SendMessage(hWnd, EM_SETSEL, 0, -1);
                    return 1;
                }
            }
        }
    }

    return CallNextHookEx(g_hCtrlAHook, nCode, wParam, lParam);
}

INT_PTR CALLBACK
DialogProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
{
    ...
}

extern "C"
INT WINAPI WinMain(
    HINSTANCE   hInstance,
    HINSTANCE   hPrevInstance,
    LPSTR       pszCmdLine,
    INT         nCmdShow)
{
    g_hCtrlAHook = SetWindowsHookEx(WH_MSGFILTER,
        CtrlAMessageProc, NULL, GetCurrentThreadId());

    DialogBox(hInstance, MAKEINTRESOURCE(1), NULL, DialogProc);

    UnhookWindowsHookEx(g_hCtrlAHook);
    g_hCtrlAHook = NULL;

    return 0;
}

ソース: ctrl_a.zip


戻る

©片山博文MZ
katayama.hirofumi.mz@gmail.com

inserted by FC2 system