Контекст ситуации - добавление MS Word.
Langiage - C#
Задача:Почему Application.Selection.Range.Start иногда вызывает некорректное значение?
Я пытаюсь получить текущую позицию курсора. Я использую Application.Selection.Range
, так как он возвращает InsertionPoint
. После каждого Space,Tab
или Enter
клавиши, нажав я делаю следующее: MessageBox.Show(Application.Selection.Range.Start.ToString());
Иногда я вижу MessageBox с правильным значением иногдаactual_value_of_insertion_point_position+128
. Почему индекс точки вставки иногда увеличивается до 128? Я ничего не делаю, я просто набираю текст, нажимаю «Пробел» и вижу иногда правильное значение, как и ожидалось.
UPDATE На самом деле, моя проблема глубже - here мой другой 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);
}
Является ли ваш вопрос чисто информационным? Вы только хотите знать, почему так оно работает, или вы пытаетесь что-то сделать, и это мешает вам? В более позднем случае - было бы полезно, если бы вы могли описать, что вы хотите достичь. – Vadim
вы также можете указать точную ситуацию, когда у вас есть значение + 128, но не только упоминание 'иногда'. Это может быть полезно, если вы хотите проверить это поведение на своей машине. –
@ Vadim, я хочу получить текущую позицию курсора. Я имею в виду целочисленный индекс. Я использовал 'Application.Selection.Range.Start', поскольку он возвращает индекс точки вставки - именно то, что мне нужно. Он работает, но иногда возвращает неправильное значение. Я хочу знать, как я могу решить эту проблему. Возможно, существует другой способ получить позицию курсора. – Baurzhan