键盘挂钩在MS Word中多次触发

时间:2016-09-01 06:40:27

标签: ms-word vsto keyboard-hook

这是参考Detecting text changes in Word 2016 from VSTO add-in

中提出的问题

虽然Dirk Vollmar提供的答案有效,但我发现按一个键会触发KeyboardHookCallBack 10-12次,而且我无法准确捕捉按键被击中的顺序。

请原谅我,如果我的问题很愚蠢,但有没有办法确保每个键只触发一次KeyboardHookCallBack?我已经尝试了一段时间,但没有任何运气。

我很感激这方面的任何帮助。

1 个答案:

答案 0 :(得分:0)

我的要求是在MS Word中使用intellisense实现自动完成功能。我已经决定每次用户点击一个空格键时我应该尝试跟踪用户自上次击中空格键以来按下了哪些键。基于Detecting text changes in Word 2016 from VSTO add-in处的解决方案,我没有按正确的顺序按下键并且多次执行钩子回调。虽然我找到了解决问题的肮脏方法,但解决方案并不是全面的。花了几天后,我想出了一个解决方法,我觉得这个应该有效。在这里:

private IntPtr KeyboardHookCallback(int nCode, IntPtr wParam, IntPtr lParam)
{
    string key = ((System.Windows.Forms.Keys)wParam).ToString‌();
    if (key == "Space")
    {
        Word.Selection sel = Globals.ThisAddIn.Application.Selection;
        Word.Range rng = sel.Range.Paragraphs[1].Range;
        object unitWord = Word.WdUnits.wdWord;
        object countN1 = -1;
        sel.MoveStart(ref unitWord, ref countN1);
        string userInput = sel.Words[1].Text;
        sel.MoveRight(ref unitWord, ref missing, ref missing);
    }
}

希望这有助于所有在类似问题上苦苦挣扎的人。