Index: reactos/base/shell/explorer/explorer.cpp =================================================================== --- reactos/base/shell/explorer/explorer.cpp (revision 73352) +++ reactos/base/shell/explorer/explorer.cpp (working copy) @@ -193,6 +193,81 @@ return 0; } +// EDIT control Ctrl+A hooker +class CtrlAHooker +{ +public: + CtrlAHooker() { } + CtrlAHooker(BOOL bDoHook) { + if (bDoHook) + DoHook(); + } + + ~CtrlAHooker() + { + Unhook(); + } + + BOOL DoHook() + { + if (s_hHook) + return TRUE; + + s_hHook = ::SetWindowsHookEx(WH_MSGFILTER, + _CtrlAMessageProc, NULL, GetCurrentThreadId()); + return s_hHook != NULL; + } + void Unhook() + { + if (s_hHook) + { + ::UnhookWindowsHookEx(s_hHook); + s_hHook = NULL; + } + } + BOOL IsHooked() const + { + return s_hHook != NULL; + } + +protected: + static HHOOK s_hHook; + + // hook proc for Ctrl+A + static LRESULT CALLBACK + _CtrlAMessageProc(INT nCode, WPARAM wParam, LPARAM lParam) + { + TCHAR szClassName[32]; + HWND hWnd; + if (nCode < 0) + return CallNextHookEx(s_hHook, nCode, wParam, lParam); + + LPMSG pMsg = (LPMSG)lParam; + if (pMsg->message != WM_KEYDOWN) + return CallNextHookEx(s_hHook, nCode, wParam, lParam); + + 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, _countof(szClassName)); + if (::lstrcmpi(szClassName, TEXT("EDIT")) == 0) + { + ::SendMessage(hWnd, EM_SETSEL, 0, -1); + return 1; + } + } + } + return CallNextHookEx(s_hHook, nCode, wParam, lParam); + } +}; +/*static*/ HHOOK CtrlAHooker::s_hHook = NULL; + INT WINAPI _tWinMain(IN HINSTANCE hInstance, IN HINSTANCE hPrevInstance, @@ -199,6 +274,7 @@ IN LPTSTR lpCmdLine, IN INT nCmdShow) { + CtrlAHooker TheHooker(TRUE); /* * Set our shutdown parameters: we want to shutdown the very last, * but before any TaskMgr instance (which has a shutdown level of 1).