private bool handleRequestSuggestionMode(KbDllHookStruct kbDllHookStruct)
{
// Keep track of keyboard key 0-9, a-z and ' "
// For the full list of key covers, please refer to http://www.kbdedit.com/manual/low_level_vk_list.html
int VK_KEY_0 = 0x30;
int VK_KEY_Z = 0x5A;
int VK_OEM_7 = 0xDE; // OEM_7 (" ')
int VK_OEM_1 = 0xBA; // OEM_1 (: ;)
int VK_SPACE = 0x20;
int VK_BACK = 0x08;
int VK_LCONTROL = 0xA2;
int VK_RCONTROL = 0xA3;
int VK_LMENU = 0xA4; // left atrl
int VK_RMENU = 0xA5; // right atrl
int VK_LSHIFT = 0xA0;
int VK_RSHIFT = 0xA1;
if (autoCompleteForm.Visible)
{
bool isCTRLKey = (Convert.ToBoolean(GetAsyncKeyState(VK_LCONTROL)) || Convert.ToBoolean(GetAsyncKeyState(VK_RCONTROL)));
if (isCTRLKey)
{
int[] keys = {(int)Keys.D1, (int)Keys.D2, (int)Keys.D3, (int)Keys.D4, (int)Keys.D5,
(int)Keys.D6, (int)Keys.D7, (int)Keys.D8, (int)Keys.D9};
for (int i = 0; i < autoCompleteForm.getDisplaySuggestionCount(); i++)
{
if (kbDllHookStruct.vkCode == keys[i])
{
autoCompleteForm.quickPaste(i);
return false;
}
}
}
// Allow user to interact with the form when the pop-up is displaying.
if (kbDllHookStruct.vkCode == (int)Keys.Down || kbDllHookStruct.vkCode == (int)Keys.Up)
{
autoCompleteForm.selectFirstIndex();
return false; // block key
}
if (kbDllHookStruct.vkCode == (int)Keys.Right)
{
autoCompleteForm.nextSuggestionPage();
return false; // block key
}
if (kbDllHookStruct.vkCode == (int)Keys.Left)
{
// With this check, it allow user to press left button on Document when there is no previous page
if (autoCompleteForm.getPageIndex() != 1)
{
autoCompleteForm.previousSuggestionPage();
return false; // block key
}
}
if (kbDllHookStruct.vkCode == (int)Keys.Escape)
{
autoCompleteForm.Hide();
return false; // block key
}
}
bool isValidKeyTrigger = (kbDllHookStruct.vkCode >= VK_KEY_0 && kbDllHookStruct.vkCode <= VK_KEY_Z) || kbDllHookStruct.vkCode == VK_OEM_7
|| kbDllHookStruct.vkCode == VK_OEM_1 || kbDllHookStruct.vkCode == VK_SPACE || kbDllHookStruct.vkCode == VK_BACK || kbDllHookStruct.vkCode == (int)Keys.OemPeriod
|| kbDllHookStruct.vkCode == (int)Keys.Oem2;
// Special keys here refer to ALT and CTRL key
bool isSpecialKeyPressed = (Convert.ToBoolean(GetAsyncKeyState(VK_LCONTROL)) || Convert.ToBoolean(GetAsyncKeyState(VK_RCONTROL)) ||
Convert.ToBoolean(GetAsyncKeyState(VK_LMENU)) || Convert.ToBoolean(GetAsyncKeyState(VK_RMENU)));
if (isValidKeyTrigger && !isSpecialKeyPressed && Mode == TriggerMode.AUTO_TRIGGER)
{
autoCompleteForm.Hide();
// Fetch GUITHREADINFO to prepare for evaluateCaretPosition() when the triggerSuggTimer elapse.
getCaretPosition();
if (triggerSuggTimer == null)
{
triggerSuggTimer = new System.Timers.Timer();
triggerSuggTimer.Elapsed += new ElapsedEventHandler(delegate(Object sender, ElapsedEventArgs e)
{
triggerSuggTimer.Stop();
triggerSuggestion(true);
// Logging for user testing
startReqSuggTime = DateTime.Now;
});
}
triggerSuggTimer.Interval = TriggerDelay;
triggerSuggTimer.Stop();
triggerSuggTimer.Start();
}
else if ((kbDllHookStruct.vkCode == triggerSuggestionPopUpKey) && checkHotkeysModifiers("triggerSuggestionPopUp"))
{
getCaretPosition();
triggerSuggestion(false);
}
else if (kbDllHookStruct.vkCode != VK_LCONTROL && kbDllHookStruct.vkCode != VK_RCONTROL && kbDllHookStruct.vkCode != VK_LSHIFT
&& kbDllHookStruct.vkCode != VK_RSHIFT)
{
autoCompleteForm.Hide();
}
return true;
}