SEARCH_DIRECTION CCommands::m_SearchDirection = NA;\r
int (*CCommands::m_LastKillCommand)() = NULL;\r
int (*CCommands::m_LastCommand)() = NULL;\r
-CPtrList CCommands::m_CaretPos;\r
-CPtrList CCommands::m_ScrollInfo;\r
-CPtrList CCommands::m_FindText;\r
BOOL CCommands::m_bFirstFindDialog = FALSE;\r
BOOL CCommands::m_bTemporarilyDisableXKeymacs = FALSE;\r
CArray<CClipboardSnap *, CClipboardSnap *> CCommands::m_oClipboardData;\r
-OriginalWindowPosition_t CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
+OriginalWindowPosition CCommands::m_OriginalWindowPosition[MAX_WINDOW] = {'\0'};\r
BOOL CCommands::m_bIsSu = FALSE;\r
#pragma data_seg()\r
\r
ReleaseKey(VK_CONTROL);\r
}\r
if (bIsAltDown) {\r
+ if (CUtils::IsVisualStudio2010())\r
+ CXkeymacsDll::SetHookAltRelease(); // Ignore Alt release\r
ReleaseKey(VK_MENU);\r
}\r
if (bIsShiftDown) {\r
// C-f: Right\r
int CCommands::ForwardChar()\r
{\r
-// TCHAR szWindowText[0x100] = {'\0'};\r
+// TCHAR szWindowText[WINDOW_TEXT_LENGTH] = {'\0'};\r
// GetWindowText(GetForegroundWindow(), szWindowText, sizeof(szWindowText));\r
// CUtils::Log("C-f: %s", szWindowText);\r
\r
\r
HWND hWnd = GetForegroundWindow();\r
if (hWnd) {\r
- OriginalWindowPosition_t *pOriginalWindowPosition = GetOriginalWindowPosition(hWnd);\r
- if (pOriginalWindowPosition && pOriginalWindowPosition->bMax[ROLL_UP_UNROLL]) {\r
+ OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
+ if (pPos && pPos->bMax[ROLL_UP_UNROLL]) {\r
RollUpUnroll();\r
}\r
}\r
return Reset(GOTO_HOOK);\r
}\r
\r
-OriginalWindowPosition_t* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
+OriginalWindowPosition* CCommands::GetOriginalWindowPosition(HWND hWnd)\r
{\r
- const int nOriginalWindowPosition = sizeof(m_OriginalWindowPosition) / sizeof(m_OriginalWindowPosition[0]);\r
-\r
- for (int i = 0; i < nOriginalWindowPosition; ++i) {\r
+ for (int i = 0; i < MAX_WINDOW; i++) {\r
if (m_OriginalWindowPosition[i].hWnd == hWnd) {\r
return &m_OriginalWindowPosition[i];\r
}\r
}\r
\r
- for (int j = 0; j < nOriginalWindowPosition; ++j) {\r
+ for (int j = 0; j < MAX_WINDOW; j++) {\r
if (m_OriginalWindowPosition[j].hWnd == 0) {\r
m_OriginalWindowPosition[j].hWnd = hWnd;\r
- memset(&m_OriginalWindowPosition[(j + 1) % nOriginalWindowPosition], 0, sizeof(m_OriginalWindowPosition[0]));\r
+ memset(&m_OriginalWindowPosition[(j + 1) % MAX_WINDOW], 0, sizeof(OriginalWindowPosition));\r
return &m_OriginalWindowPosition[j];\r
}\r
}\r
return Reset(GOTO_HOOK);\r
}\r
\r
- OriginalWindowPosition_t *pOriginalWindowPosition = GetOriginalWindowPosition(hWnd);\r
- if (!pOriginalWindowPosition) {\r
+ OriginalWindowPosition *pPos = GetOriginalWindowPosition(hWnd);\r
+ if (!pPos) {\r
return Reset(GOTO_HOOK);\r
}\r
\r
\r
switch (direction) {\r
case VERTICAL:\r
- if (pOriginalWindowPosition->bMax[direction]) {\r
- Y = pOriginalWindowPosition->nOriginalY;\r
- nHeight = pOriginalWindowPosition->nOriginalHeight;\r
+ if (pPos->bMax[direction]) {\r
+ Y = pPos->nOriginalY;\r
+ nHeight = pPos->nOriginalHeight;\r
} else {\r
- pOriginalWindowPosition->nOriginalY = Y;\r
- pOriginalWindowPosition->nOriginalHeight = nHeight;\r
+ pPos->nOriginalY = Y;\r
+ pPos->nOriginalHeight = nHeight;\r
\r
Y = workarea.top;\r
nHeight = workarea.bottom - workarea.top;\r
}\r
break;\r
case HORIZONTAL:\r
- if (pOriginalWindowPosition->bMax[direction]) {\r
- X = pOriginalWindowPosition->nOriginalX;\r
- nWidth = pOriginalWindowPosition->nOriginalWidth;\r
+ if (pPos->bMax[direction]) {\r
+ X = pPos->nOriginalX;\r
+ nWidth = pPos->nOriginalWidth;\r
} else {\r
- pOriginalWindowPosition->nOriginalX = X;\r
- pOriginalWindowPosition->nOriginalWidth = nWidth;\r
+ pPos->nOriginalX = X;\r
+ pPos->nOriginalWidth = nWidth;\r
\r
X = workarea.left;\r
nWidth = workarea.right - workarea.left;\r
}\r
break;\r
case ROLL_UP_UNROLL:\r
- if (pOriginalWindowPosition->bMax[direction]) {\r
- nHeight = pOriginalWindowPosition->nOriginalHeight;\r
+ if (pPos->bMax[direction]) {\r
+ nHeight = pPos->nOriginalHeight;\r
} else {\r
- pOriginalWindowPosition->nOriginalHeight = nHeight;\r
+ pPos->nOriginalHeight = nHeight;\r
\r
nHeight = 0x15;\r
}\r
}\r
\r
MoveWindow(hWnd, X, Y, nWidth, nHeight, TRUE);\r
- pOriginalWindowPosition->bMax[direction] = !pOriginalWindowPosition->bMax[direction];\r
+ pPos->bMax[direction] = !pPos->bMax[direction];\r
return Reset(GOTO_HOOK);\r
}\r
\r
AdKduAu('E', 'I');\r
return ERROR_SUCCESS; // i.e. return 0;\r
}\r
- if (CUtils::IsVisualStudioDotNet()) { // Ctrl + Click select a word on Visual Studio .NET\r
- ReleaseKey(VK_CONTROL);\r
- return ClickCaret();\r
+ if (CUtils::IsVisualStudio()) { // Ctrl + Click select a word on Visual Studio .NET\r
+ BOOL bIsCtrlDown = CXkeymacsDll::IsDown(VK_CONTROL, FALSE);\r
+ if (bIsCtrlDown)\r
+ ReleaseKey(VK_CONTROL);\r
+ DWORD res = ClickCaret();\r
+ if (bIsCtrlDown)\r
+ DepressKey(VK_CONTROL);\r
+ return res;\r
}\r
\r
return ClickCaret();\r
if (CUtils::IsFlash()\r
|| CUtils::IsSleipnir()) {\r
CdKduCu('O');\r
- } else if (CUtils::IsVisualStudioDotNet()) {\r
+ } else if (CUtils::IsVisualStudio()) {\r
AdKduAu('F', 'O', 'F');\r
} else {\r
AdKduAu('F', 'O');\r
void CCommands::bC_(BOOL b)\r
{\r
m_bC_ = b;\r
- CXkeymacsDll::ModifyShell_NotifyIcon(CTRL_ICON, m_bC_);\r
}\r
\r
BOOL CCommands::bC_x()\r
void CCommands::bC_x(BOOL b)\r
{\r
m_bC_x = b;\r
- CXkeymacsDll::ModifyShell_NotifyIcon(CX_ICON, m_bC_x);\r
}\r
\r
BOOL CCommands::bM_x()\r
m_bM_x = b;\r
\r
if (b) {\r
- CXkeymacsDll::ModifyM_xTip("");\r
+ CXkeymacsDll::SetM_xTip("");\r
} else {\r
- CXkeymacsDll::ModifyM_xTip(NULL);\r
+ CXkeymacsDll::SetM_xTip(NULL);\r
}\r
}\r
\r
// M-!: cmd.exe/command.com\r
int CCommands::ShellCommand()\r
{\r
- if (!CUtils::Run(_tgetenv(_T("XKEYMACS_SHELL")))) {\r
- CUtils::Run(_tgetenv(_T("COMSPEC")));\r
- }\r
+ TCHAR szShell[MAX_PATH];\r
+ size_t len;\r
+ !_tgetenv_s(&len, szShell, _T("XKEYMACS_SHELL")) && len != 0 && CUtils::Run(szShell) ||\r
+ !_tgetenv_s(&len, szShell, _T("COMSPEC")) && len != 0 && CUtils::Run(szShell);\r
return Reset(GOTO_HOOK);\r
}\r
\r
void CCommands::bM_(BOOL b)\r
{\r
m_bM_ = b;\r
- CXkeymacsDll::ModifyShell_NotifyIcon(META_ICON, m_bM_);\r
}\r
\r
BOOL CCommands::bM_()\r
|| CUtils::IseMemoPad()\r
|| CUtils::IsJmEditor()\r
|| CUtils::IsK2Editor()\r
- || (CUtils::IsNotepad() && CUtils::IsNTor9x())\r
|| CUtils::IsOedit()\r
|| CUtils::IsOpenJane()\r
|| CUtils::IsPHPEditor()\r
AdKduAu('S', VK_RETURN);\r
} else if (CUtils::IsNami2000()) {\r
AdKduAu('D', 'F');\r
- } else if (CUtils::IsVisualStudioDotNet()) {\r
+ } else if (CUtils::IsVisualStudio()) {\r
AdKduAu('E', 'F', 'F');\r
} else if (CUtils::IsDirector()) {\r
AdKduAu('E', 'F', 'T');\r
}\r
\r
if (CUtils::IsVisualCpp()\r
- || CUtils::IsVisualStudioDotNet()) {\r
+ || CUtils::IsVisualStudio()) {\r
switch (direction) {\r
case FORWARD:\r
CdKduCu('I');\r
\r
BOOL CCommands::IsKillCommand(int (*nFunctionPointer)())\r
{\r
- for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+ for (int nCommandID = 1; nCommandID < MAX_COMMAND; ++nCommandID) {\r
if (Commands[nCommandID].fCommand == nFunctionPointer) {\r
return !_tcsncmp(Commands[nCommandID].szCommandName, _T("kill-"), 5);\r
}\r
int CCommands::Tilde()\r
{\r
ClearNumericArgument();\r
- if (CXkeymacsData::Is106Keyboard()) {\r
+ if (CXkeymacsDll::Is106Keyboard()) {\r
SdKduSu(0xDE); // VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. \r
Su(); // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
} else {\r
int CCommands::BackQuote()\r
{\r
ClearNumericArgument();\r
- if (CXkeymacsData::Is106Keyboard()) {\r
+ if (CXkeymacsDll::Is106Keyboard()) {\r
SdKduSu(0xC0);\r
Su();\r
} else {\r
|| CUtils::IsOpenJane()\r
|| CUtils::IsStoryEditor()\r
|| CUtils::IsVisualBasicEditor()\r
- || CUtils::IsVisualStudioDotNet()\r
+ || CUtils::IsVisualStudio()\r
|| CUtils::IsWordpad()) {\r
bDirectionForward = 0;\r
} else if (CUtils::IsLotusNotes()\r
return bDirectionBackward;\r
}\r
\r
-void CCommands::GetCaretPosition()\r
-{\r
-// CUtils::Log(_T("GetClipboardTextLength = %d"), CUtils::GetClipboardTextLength());\r
-\r
- try {\r
- POINT *pCaretPos = new POINT;\r
- if (pCaretPos && GetCaretPos(pCaretPos)) {\r
-// CUtils::Log(_T("x = %d, y = %d"), pCaretPos->x, pCaretPos->y);\r
- m_CaretPos.AddTail(pCaretPos);\r
- } else {\r
- delete pCaretPos;\r
- pCaretPos = NULL;\r
- }\r
- }\r
- catch (CMemoryException* e) {\r
- e->Delete();\r
-// CUtils::Log("GetCaretPosition: pCaretPos: 'new' threw an exception");\r
- }\r
-\r
- try {\r
- SCROLLINFO *pScrollInfo = new SCROLLINFO;\r
- if (pScrollInfo) {\r
- memset(pScrollInfo, 0, sizeof(SCROLLINFO));\r
- pScrollInfo->cbSize = sizeof(SCROLLINFO);\r
- pScrollInfo->fMask = SIF_ALL;\r
- if (GetScrollInfo(GetFocus(), SB_VERT, pScrollInfo)) {\r
-// CUtils::Log(_T("page = %d, pos = %d, max = %d, min = %d, trackpos = %d"), pScrollInfo->nPage, pScrollInfo->nPos, pScrollInfo->nMax, pScrollInfo->nMin, pScrollInfo->nTrackPos);\r
- m_ScrollInfo.AddTail(pScrollInfo);\r
- } else {\r
-// CUtils::Log(_T("GetScrollInfo Error: %d"), GetLastError());\r
- delete pScrollInfo;\r
- pScrollInfo = NULL;\r
- }\r
- }\r
- }\r
- catch (CMemoryException* e) {\r
- e->Delete();\r
-// CUtils::Log("GetCaretPosition: pScrollInfo: 'new' threw an exception");\r
- }\r
-\r
- try {\r
- CString* pClipboardText = new CString;\r
- if (pClipboardText) {\r
- CUtils::GetClipboardText(pClipboardText);\r
- CUtils::SetClipboardText(pClipboardText);\r
- m_FindText.AddTail(pClipboardText);\r
- }\r
- }\r
- catch (CMemoryException* e) {\r
- e->Delete();\r
-// CUtils::Log("GetCaretPosition: pClipboardText: 'new' threw an exception");\r
- }\r
-}\r
-\r
-BOOL CCommands::SetCaretPosition()\r
-{\r
- {\r
-// TCHAR buf[0x100] = {'\0'};\r
-// GetWindowText(GetForegroundWindow(), buf, sizeof(buf));\r
-// CUtils::Log(buf);\r
- }\r
-\r
- if (!m_ScrollInfo.IsEmpty()) {\r
- SCROLLINFO* pScrollInfo = (SCROLLINFO*)m_ScrollInfo.GetTail();\r
- delete pScrollInfo;\r
- pScrollInfo = NULL;\r
- m_ScrollInfo.RemoveTail();\r
- }\r
- if (!m_ScrollInfo.IsEmpty()) {\r
- SCROLLINFO* pScrollInfo = (SCROLLINFO*)m_ScrollInfo.GetTail();\r
- SendMessage(GetFocus(), WM_VSCROLL, SB_THUMBPOSITION | (pScrollInfo->nPos << 0x10), NULL);\r
- }\r
-\r
- BOOL bMoveCaret = FALSE;\r
- if (!m_CaretPos.IsEmpty()) {\r
- POINT* pCaretPos = (POINT*)m_CaretPos.GetTail();\r
- delete pCaretPos;\r
- pCaretPos = NULL;\r
- m_CaretPos.RemoveTail();\r
- }\r
- if (!m_CaretPos.IsEmpty()) {\r
- POINT* pCaretPos = (POINT*)m_CaretPos.GetTail();\r
- SetCaretPos(pCaretPos->x, pCaretPos->y);\r
-\r
-// CUtils::Log(_T("set x = %d), y = %d", p->x, p->y);\r
-\r
- DeactivateMark();\r
-\r
- const int nPreviousFindTextLength = CUtils::GetClipboardTextLength();\r
- if (0 < nPreviousFindTextLength) {\r
- if (CUtils::IsWordpad()) {\r
- POSITION position = m_FindText.GetTailPosition();\r
- CString* pPreviousFindText = (CString*)m_FindText.GetPrev(position);\r
- CString* pNextFindText = (CString*)m_FindText.GetPrev(position);\r
- if (*pPreviousFindText == *pNextFindText) {\r
- for (int i = 0; i <= nPreviousFindTextLength; ++i) {\r
- Kdu(VK_LEFT);\r
- }\r
- } else {\r
- Kdu(VK_LEFT);\r
- }\r
- }\r
- bMoveCaret = TRUE;\r
- }\r
- } else {\r
- Kdu(VK_LEFT);\r
- }\r
-\r
-// CUtils::Log(_T("scrollInfo.GetCount() = %d, szFindText.GetLength() = %d"), scrollInfo.GetCount(), szFindText.GetLength());\r
-\r
- if (!m_FindText.IsEmpty()) {\r
- CString *pFindText = (CString *)m_FindText.GetTail();\r
- delete pFindText;\r
- pFindText = NULL;\r
- m_FindText.RemoveTail();\r
- }\r
- if (!m_FindText.IsEmpty()) {\r
- CString *pFindText = (CString *)m_FindText.GetTail();\r
- CUtils::SetClipboardText(pFindText);\r
- }\r
-\r
- return bMoveCaret;\r
-}\r
-\r
void CCommands::SetMark(BOOL bSetMark)\r
{\r
m_bSetMark = bSetMark;\r
\r
void CCommands::PrintFunctionName(int (*nFunctionPointer)())\r
{\r
- for (int nCommandID = 1; nCommandID < sizeof(Commands) / sizeof(Commands[0]); ++nCommandID) {\r
+ for (int nCommandID = 1; nCommandID < MAX_COMMAND; ++nCommandID) {\r
if (Commands[nCommandID].fCommand == nFunctionPointer) {\r
CUtils::Log(_T("m_LastCommand: %s"), Commands[nCommandID].szCommandName);\r
}\r
int CCommands::Underscore()\r
{\r
ClearNumericArgument();\r
- if (CXkeymacsData::Is106Keyboard()) {\r
+ if (CXkeymacsDll::Is106Keyboard()) {\r
SdKduSu(0xE2); // VK_OEM_102 Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
Su();\r
} else {\r
return Reset(GOTO_HOOK);\r
}\r
\r
-BOOL CCommands::GetCaretPos(LPPOINT lpPoint)\r
-{\r
- if (CUtils::IsMicrosoftWord()\r
- || CUtils::IsThunderbird()) {\r
- IMECHARPOSITION ImeCharPosition = {sizeof(IMECHARPOSITION)};\r
-\r
- CallWindowProc((WNDPROC)GetWindowLongPtr(GetFocus(), GWLP_WNDPROC), GetFocus(), WM_IME_REQUEST, IMR_QUERYCHARPOSITION, (LPARAM)&ImeCharPosition);\r
-// CUtils::Log(_T("ImeCharPosition: rc = %d, x = %d, y = %d"), 0, ImeCharPosition.pt.x, ImeCharPosition.pt.y);\r
-\r
- ScreenToClient(GetFocus(), &ImeCharPosition.pt);\r
-// CUtils::Log(_T("ScreenToClient: rc = %d, x = %d, y = %d"), 0, ImeCharPosition.pt.x, ImeCharPosition.pt.y);\r
-\r
- *lpPoint = ImeCharPosition.pt;\r
-// CUtils::Log(_T("x = %d, y = %d"), lpPoint->x, lpPoint->y);\r
-\r
- return TRUE;\r
- }\r
-\r
- return ::GetCaretPos(lpPoint);\r
-}\r
-\r
LRESULT CCommands::VScroll(UINT nSBCode, const int nTimes)\r
{\r
if (CUtils::IsMicrosoftWord()\r
bM_x(TRUE);\r
return Reset(GOTO_HOOKX);\r
}\r
+\r
+CString CCommands::GetCommandName(int nCommandID)\r
+{\r
+ CString szCommandName(Commands[nCommandID].szCommandName);\r
+ return szCommandName;\r
+}\r
+\r
+int CCommands::GetCategoryID(int nCommandID)\r
+{\r
+ return Commands[nCommandID].nCategoryID;\r
+}\r
+\r
+int CCommands::GetDescriptionID(int nCommandID)\r
+{\r
+ return Commands[nCommandID].nDescriptionID;\r
+}\r
+\r
+int CCommands::GetToolTipID(int nCommandID)\r
+{\r
+ return Commands[nCommandID].nToolTipID;\r
+}\r
+\r
+int CCommands::GetDefaultCommandType(int nCommandID, int nIndex)\r
+{\r
+ if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+ || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+ ASSERT(0);\r
+ return NONE;\r
+ }\r
+\r
+ int nCommandType = Commands[nCommandID].keybind[nIndex].nCommandType;\r
+ int bVk = Commands[nCommandID].keybind[nIndex].bVk;\r
+\r
+ if (CXkeymacsDll::Is106Keyboard()) {\r
+ if (nCommandType & SHIFT) { // Shift\r
+ switch (bVk) {\r
+ case '2':\r
+ case '6':\r
+ case 0xBA: // VK_OEM_1 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+ nCommandType &= ~SHIFT;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ } else { // Normal\r
+ switch (bVk) {\r
+ case 0xBB: // VK_OEM_PLUS Windows 2000/XP: For any country/region, the '+' key\r
+ case 0xC0: // VK_OEM_3 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+ case 0xDE: // VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+ nCommandType |= SHIFT;\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return nCommandType;\r
+}\r
+\r
+int CCommands::GetDefaultCommandKey(int nCommandID, int nIndex)\r
+{\r
+ if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+ || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+ ASSERT(0);\r
+ return 0;\r
+ }\r
+\r
+ int nCommandType = Commands[nCommandID].keybind[nIndex].nCommandType;\r
+ int bVk = Commands[nCommandID].keybind[nIndex].bVk;\r
+\r
+ if (CXkeymacsDll::Is106Keyboard()) {\r
+ if (nCommandType & SHIFT) { // Shift\r
+ switch (bVk) {\r
+ case '0':\r
+ bVk = '9';\r
+ break;\r
+ case '2':\r
+ bVk = 0xC0; // VK_OEM_3 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the '`~' key\r
+ break;\r
+ case '6':\r
+ bVk = 0xDE; // VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+ break;\r
+ case '7':\r
+ bVk = '6';\r
+ break;\r
+ case '8':\r
+ bVk = 0xBA; // VK_OEM_1 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+ break;\r
+ case '9':\r
+ bVk = '8';\r
+ break;\r
+ case 0xBD: // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+ bVk = 0xE2; // VK_OEM_102 Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard\r
+ break;\r
+ case 0xC0:\r
+ bVk = 0xDE; // VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+ break;\r
+ case 0xDE: // VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+ bVk = '2';\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ } else { // Normal\r
+ switch (bVk) {\r
+ case 0xBA: // VK_OEM_1 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the ';:' key\r
+ bVk = 0xBB; // VK_OEM_PLUS Windows 2000/XP: For any country/region, the '+' key\r
+ break;\r
+ case 0xBB: // VK_OEM_PLUS Windows 2000/XP: For any country/region, the '+' key\r
+ bVk = 0xBD; // VK_OEM_MINUS Windows 2000/XP: For any country/region, the '-' key\r
+ break;\r
+ case 0xDE: // VK_OEM_7 Used for miscellaneous characters; it can vary by keyboard. \r
+ // Windows 2000/XP: For the US standard keyboard, the 'single-quote/double-quote' key\r
+ bVk = '7';\r
+ break;\r
+ default:\r
+ break;\r
+ }\r
+ }\r
+ }\r
+\r
+ return bVk;\r
+}\r
+\r
+int CCommands::GetDefaultControlID(int nCommandID, int nIndex)\r
+{\r
+ if (nCommandID < 0 || sizeof(Commands) / sizeof(Commands[0]) <= nCommandID\r
+ || nIndex < 0 || sizeof(Commands[nCommandID].keybind) / sizeof(Commands[nCommandID].keybind[0]) <= nIndex) {\r
+ ASSERT(0);\r
+ return 0;\r
+ }\r
+\r
+ return Commands[nCommandID].keybind[nIndex].nControlID;\r
+}\r