0

情境上下文 - MS Word 插件。
语言 - C#
问题:

我正在尝试获取当前光标位置。我正在使用Application.Selection.Range它返回InsertionPoint。每次按Space,TabEnter键后,我会执行以下操作:MessageBox.Show(Application.Selection.Range.Start.ToString()); 有时我会看到 MessageBox 有时具有正确的 actual_value_of_insertion_point_position+128。为什么插入点索引有时会增加到 128?我没有做任何具体的事情,我只是输入一些文本,按空格键,有时会看到预期的正确值,有时却没有。

更新 实际上,我的问题更深 -是我的另一个 SO 问题,详细描述。我的计划:

1)当用户键入Space记住插入点时 - 它返回下一个未来字母的位置。
2)如果用户输入了某个字母,而前一个键是空格,则表示用户输入了某个生词的第一个字母。如下创建范围Application.ActiveDocument.Range(remembered_pos,rem_pos+1)并根据需要设置样式。

我的代码

 private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
        {
            if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
            {
                int pointerCode = Marshal.ReadInt32(lParam);
                string pressedKey = ((Keys)pointerCode).ToString();

                IntPtr curHandle = GetForegroundWindow();

                if(curHandle==wordHandle)
                {

                    //MessageBox.Show(app.ActiveDocument.Content.LanguageID +" "+ WdLanguageID.wdKazakh);
                    if(pressedKey.Equals("Space")||pressedKey.Equals("Return")||pressedKey.Equals("Tab"))
                    {

                        Word.Range r = app.Application.Selection.Range; 
                        MessageBox.Show(app.Application.Selection.Type.ToString());
                        MessageBox.Show("-"+r.Start.ToString()+"-"+r.End.ToString()); // sometimes +128!


                    }
                    else if(firstAfterSpace!=-1)
                    { // right now doesn't make sense 
                        MessageBox.Show(firstAfterSpace.ToString());
                        //Word.Range rng = app.Application.ActiveDocument.Range(firstAfterSpace,firstAfterSpace+1);
                        //MessageBox.Show("-"+rng.Text+"-");
                        //rng.Underline = Word.WdUnderline.wdUnderlineNone;
                        firstAfterSpace = -1;
                    }



                }

            }
            return CallNextHookEx(hookId, nCode, wParam, lParam);
        }
4

3 回答 3

1

Space, Return or Tab假设您在这些'characters' 中的任何一个之前搜索单词,您可以在有人按下后尝试不同的设置范围的方法。

这是您可以放入的代码If statement

    Word.Range r = appWRD.Application.Selection.Range;
    Word.Range tmpR = r.Previous(Word.WdUnits.wdWord,2);
    MessageBox.Show("-" + tmpR.Start.ToString() + "-" + (r.Start-1).ToString());

    //set temporarily for checking word text
    tmpR = appWRD.ActiveDocument.Range(tmpR.Start, r.Start -1 );
    MessageBox.Show(string.Format("Word found: {0}!", tmpR.Text));
    //this shows it doesn't include any tab or space

小费。Word中有很多,Range modification methods但其中一些不能正常工作。Previous根据我的测试,在这种情况下工作正常。

于 2013-08-04T08:19:55.587 回答
0

我相信这是因为您正在使用全局挂钩事件。但我不知道原因。我刚刚试验过了。当我使用全局挂钩时,范围的索引似乎增加了 128。

于 2014-07-07T07:45:56.353 回答
0

当您访问Selection.StartSelection.EndSystem.Windows.Forms.Timer.

我认为原因是 Word 中文本缓冲区操作的优化。它不是插入一个字符,而是插入一个 128 个字符的块,但会推迟Selection.Start值的更新。

但幸运的是,我们总能获得Selection.Startfrom的正确值selection.Previous(WdUnits.wdCharacter, 1).End

因此,获得正确选择开始和结束的代码如下所示:

var selection = app.Selection.Range;

var selStart = selection.Previous(WdUnits.wdCharacter, 1)?.End ?? 0;
var selEnd = selStart + selection.End - selection.Start;
于 2021-10-06T00:44:20.317 回答