OSDN Git Service

Modify the way to hook the release of Alt of shortcut keys with Alt
authorKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Tue, 10 May 2011 09:02:00 +0000 (18:02 +0900)
committerKazuhiro Fujieda <fujieda@users.sourceforge.jp>
Fri, 10 Jun 2011 08:10:13 +0000 (17:10 +0900)
to keep the focus from moving to the menu.

Fix a bug where the focus moves to the menu when you release Alt
first when you use a shortcut key with Alt on Visual Studio.

Hook the release of Alt instead of a dummy push of Ctrl on Visual
C++ and Firefox. Hook it on InternetExplorer too.

xkeymacsdll/Commands.cpp
xkeymacsdll/Commands.h
xkeymacsdll/Utils.cpp
xkeymacsdll/Utils.h
xkeymacsdll/xkeymacsdll.cpp
xkeymacsdll/xkeymacsdll.h

index cd61978..44f830d 100644 (file)
@@ -322,8 +322,7 @@ void CCommands::Kdu(BYTE bVk1, BYTE bVk2, BYTE bVk3, BYTE bVk4)
                before &= ~SHIFT;\r
        CXkeymacsDll::SetModifierState(0, before);\r
 \r
-       if (bVk1)\r
-               CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+       CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
        if (bVk2)\r
                CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
        if (bVk3)\r
@@ -367,8 +366,7 @@ void CCommands::CdKduCu(BYTE bVk1, BYTE bVk2)
        UINT before = CXkeymacsDll::GetModifierState();\r
        CXkeymacsDll::SetModifierState(CONTROL, before);\r
 \r
-       if (bVk1)\r
-               CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
+       CXkeymacsDll::Kdu(bVk1, m_nNumericArgument);\r
        if (bVk2)\r
                CXkeymacsDll::Kdu(bVk2, m_nNumericArgument);\r
 \r
@@ -1409,17 +1407,10 @@ int CCommands::ScrollDown()
                return ScrollUp();\r
        }\r
 \r
-       if (m_bDefaultNumericArgument) {\r
-               if (CUtils::IsFirefox()\r
-                || CUtils::IsVisualCpp()) {\r
-                       CdKduCu(0);     // dummy to clear Alt effect.\r
-               }\r
+       if (m_bDefaultNumericArgument)\r
                return Reset(MoveCaret(VK_PRIOR));\r
-       } else {\r
-               while (m_nNumericArgument--) {\r
-                       SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
-               }\r
-       }\r
+       while (m_nNumericArgument--)\r
+               SendMessage(GetFocus(), WM_VSCROLL, SB_LINEUP, NULL);\r
        return Reset(GOTO_HOOK);\r
 }\r
 \r
index f7b53c8..b457e0e 100644 (file)
@@ -235,7 +235,7 @@ private:
        static void AdSdKduSuAu(BYTE bVk1);\r
        static void AdKduAu(BYTE bVk1, BYTE bVk2 = 0, BYTE bVk3 = 0);\r
        static void CdKduCu(BYTE bVk1, BYTE bVk2 = 0);\r
-       static void Kdu(BYTE bVk1 = 0, BYTE bVk2 = 0, BYTE bVk3 = 0, BYTE bVk4 = 0);\r
+       static void Kdu(BYTE bVk1, BYTE bVk2 = 0, BYTE bVk3 = 0, BYTE bVk4 = 0);\r
        static DWORD m_nNumericArgument;\r
        static void Su();\r
        static BOOL m_bIsSu;\r
index c96cd10..6b752cb 100644 (file)
@@ -767,16 +767,6 @@ BOOL CUtils::IsVisualStudio()
        return _tcsstr(szWindowText, _T(" - Microsoft Visual ")) != NULL;\r
 }\r
 \r
-BOOL CUtils::IsVisualStudio2010()\r
-{\r
-       if (IsVisualStudio()) {\r
-               TCHAR szWindowText[WINDOW_TEXT_LENGTH] = _T("");\r
-               GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
-               return _tcsstr(szWindowText, _T("2010")) != NULL;\r
-       }\r
-       return FALSE;\r
-}\r
-\r
 BOOL CUtils::IsAccess()\r
 {\r
        return !_tcsicmp(m_szApplicationName, _T("MSACCESS.EXE"));\r
index 1a4d298..f655263 100644 (file)
@@ -63,7 +63,6 @@ public:
        static BOOL IsProject();\r
        static BOOL IsAccess();\r
        static BOOL IsVisualStudio();\r
-       static BOOL IsVisualStudio2010();\r
        static BOOL IsCsh();\r
        static BOOL IsSh();\r
        static BOOL IsBash();\r
index 7453094..80f1b16 100644 (file)
@@ -228,7 +228,7 @@ DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
 \r
 #include "xkeymacsDll.h"\r
 #pragma data_seg(".xkmcs")\r
-       BOOL    CXkeymacsDll::m_bHookAltRelease = FALSE;\r
+       DWORD   CXkeymacsDll::m_nHookAltRelease = 0;\r
        HHOOK   CXkeymacsDll::m_hHookCallWnd = NULL;\r
        HHOOK   CXkeymacsDll::m_hHookCallWndRet = NULL;\r
        HHOOK   CXkeymacsDll::m_hHookGetMessage = NULL;\r
@@ -625,11 +625,14 @@ void CXkeymacsDll::SetModifierState(UINT after, UINT before)
                UpdateKeyboardState(VK_CONTROL, 0);\r
        }\r
 \r
-       if (after & META && !(before & META))\r
+       BOOL bHookApp = CUtils::IsVisualCpp() || CUtils::IsFirefox() || CUtils::IsVisualStudio() || CUtils::IsInternetExplorer();\r
+       if (after & META && !(before & META)) {\r
+               if (bHookApp)\r
+                       m_nHookAltRelease |= HOOK_ALT_LATER;\r
                DepressKey(VK_MENU);\r
-       else if (!(after & META) && before & META) {\r
-               if (CUtils::IsVisualStudio2010())\r
-                       m_bHookAltRelease = TRUE;\r
+       else if (!(after & META) && before & META) {\r
+               if (bHookApp)\r
+                       m_nHookAltRelease++;\r
                ReleaseKey(VK_MENU);\r
        }\r
 }\r
@@ -873,8 +876,11 @@ LRESULT CALLBACK CXkeymacsDll::KeyboardProc(int nCode, WPARAM wParam, LPARAM lPa
                case VK_LMENU:\r
                case VK_RMENU:\r
                        bAlt = TRUE;\r
-                       if (m_bHookAltRelease) {\r
-                               m_bHookAltRelease = FALSE;\r
+                       if (m_nHookAltRelease) {\r
+                               if (m_nHookAltRelease & ~HOOK_ALT_LATER)\r
+                                       m_nHookAltRelease--;\r
+                               else if (m_nHookAltRelease & HOOK_ALT_LATER)\r
+                                       m_nHookAltRelease = 0;\r
                                goto HOOK;\r
                        }\r
                        // pass through\r
index 05112d7..9626495 100644 (file)
@@ -50,6 +50,8 @@ struct KeyName
        LPCTSTR name;\r
 };\r
 \r
+const DWORD HOOK_ALT_LATER = 0x10000;\r
+\r
 class AFX_EXT_CLASS CXkeymacsDll  \r
 {\r
 public:\r
@@ -101,7 +103,7 @@ public:
        CXkeymacsDll();\r
        virtual ~CXkeymacsDll();\r
 private:\r
-       static BOOL m_bHookAltRelease;\r
+       static DWORD m_nHookAltRelease;\r
        static TCHAR m_M_xTip[128];\r
        static void InvokeM_x(const TCHAR* const szPath);\r
        static BOOL UpdateKeyboardState(BYTE bVK, BYTE bState);\r