C# 为什么Application.Selection.Range.Start有时返回不正确的值?
情境语境-MS Word插件。C# 为什么Application.Selection.Range.Start有时返回不正确的值?,c#,ms-word,add-in,C#,Ms Word,Add In,情境语境-MS Word插件。语言-C#问题: 我正在尝试获取当前光标位置。我正在使用Application.Selection.Range,因为它返回InsertionPoint。在每个空格后,按Tab或Enter键执行以下操作:MessageBox.Show(Application.Selection.Range.Start.ToString())有时我会看到带有正确值的MessageBox有时插入点位置+128的实际值。为什么插入点索引有时会增加到128?我并没有做任何具体的事情,我只是输
语言-C#
问题: 我正在尝试获取当前光标位置。我正在使用
Application.Selection.Range
,因为它返回InsertionPoint
。在每个空格后,按Tab
或Enter
键执行以下操作:MessageBox.Show(Application.Selection.Range.Start.ToString())
有时我会看到带有正确值的MessageBox有时插入点位置+128的实际值。为什么插入点索引有时会增加到128?我并没有做任何具体的事情,我只是输入一些文本,按空格键,有时看到正确的值,有时不正确
更新
事实上,我的问题更为深刻——我的另一个问题有详细的描述。我的计划:
1) 当用户键入空格时
记住插入点-它返回下一个未来字母的位置。
2)如果用户键入了某个字母,而上一个键是空格,则表示用户键入了某个新词的第一个字母。按照下面的Application.ActiveDocument.range(membered\u pos,rem\u 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);
}
在有人按下空格、回车或制表符后,您可以尝试不同的设置范围的方法,假设您在这些“字符”之前搜索单词
下面是您可以放入If语句中的代码:
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中有许多范围修改方法
,但其中一些方法无法正常工作<根据我的测试,code>Previous
在这种情况下运行良好。我相信这是因为您使用的是全局钩子事件。但我不知道原因。我刚刚试过。当我使用全局钩子时,范围的索引似乎增加了128 你的问题纯粹是信息性的吗?你是只想知道为什么这是它的工作方式,还是你试图完成一些事情,但这阻碍了你?在后一种情况下,如果你能描述一下你希望实现的目标,那将是很有帮助的。当你有值+128
时,你还可以指出确切的情况,但不要只提到,有时也要提到。如果要在自己的机器上检查此行为,这可能会很有帮助。@Vadim,我想获取光标的当前位置。我是指整数指数。当它返回插入点的索引时,我使用了Application.Selection.Range.Start
,这正是我需要的。它可以工作,但有时返回不正确的值。我想知道我怎样才能解决这个问题。可能还有其他方法可以获取光标位置。@KazJaw,测试用例描述:我键入了一些文本,按了空格
。光标位置的预期值为text.length+1
。MessageBox显示文本。长度+1+128
。当我越来越多地按空格键时,有时我会看到预期值。我的注释意图是获取有关文档结构的更多信息,因为按空格键、Tab键和Enter键以及它们在.Start
属性结果中的奇怪结果时没有什么异常。有桌子吗?领域?内容控制?等等。如果您检查.End属性
,它的行为是否也很奇怪?你能上传一些测试的文档吗?谢谢你的调查。实际上,我需要记住的范围不是在空格之前,而是在空格之后。A你回答了我的另一个问题-我知道如何改变某个范围的样式我不知道如何改变空格后第一个字母的样式。我接受了你的回答,因为Previous
很好用。不幸的是,我仍然可以;我没有从中获利(无论如何,感谢您的回复,我接受了您的回答,因为您确实帮助我解决了128 shift
问题)。此外,我尝试将两个答案结合起来-获取光标位置和上一个
,简单地设置rng.Font=…
-不起作用。我必须更深入)很高兴能帮忙。据我所知,这两个问题都是一个项目的一部分,因此我建议使用.Previous
。我做了一些测试,上面的代码有助于更改最后一个单词,而不必在后面加空格。如果是这样的话,下一个单词是用default style.BTW编写的,您可以自己找到它,但是<代码>以前的方法
第二个参数此时设置为2
。但是,根据我的测试,空格
可能需要将其更改为1
,并保留2
选项卡和输入
。@Baurzhan,我还为你的另一个问题添加了其他建议。