2013-08-04 5 views
0

Контекст ситуации - добавление 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); 
     } 
+0

Является ли ваш вопрос чисто информационным? Вы только хотите знать, почему так оно работает, или вы пытаетесь что-то сделать, и это мешает вам? В более позднем случае - было бы полезно, если бы вы могли описать, что вы хотите достичь. – Vadim

+0

вы также можете указать точную ситуацию, когда у вас есть значение + 128, но не только упоминание 'иногда'. Это может быть полезно, если вы хотите проверить это поведение на своей машине. –

+0

@ Vadim, я хочу получить текущую позицию курсора. Я имею в виду целочисленный индекс. Я использовал 'Application.Selection.Range.Start', поскольку он возвращает индекс точки вставки - именно то, что мне нужно. Он работает, но иногда возвращает неправильное значение. Я хочу знать, как я могу решить эту проблему. Возможно, существует другой способ получить позицию курсора. – Baurzhan

ответ

1

Вы можете попробовать другой способ диапазон настройки после того, как кто-то нажатой Space, Return or Tab при условии, что вы ищете слово, прежде чем любой из these'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 

Tip. В Word много Range modification methods, но некоторые из них работают неправильно. Previous отлично работает в этой ситуации в соответствии с моим тестом.

+0

Спасибо за ваши исследования. На самом деле, мне нужно помнить диапазон не до места, а после. Видел, что вы ответили на мой другой вопрос - я знаю, как меняется стиль какого-то диапазона. Я не знаю, как изменить стиль первой буквы после пробела. Я принял ваш ответ, потому что «Предыдущая» работает нормально. К сожалению, я по-прежнему не могу получить прибыль от него (в любом случае спасибо за ответ, я принял ваш ответ, так как вы действительно помогли мне решить проблему «128 shift»). Кроме того, я попытался объединить 2 ответа - получить курсор pos с помощью «Предыдущая» и просто установить 'rng.Font = ...' - не работает. Я должен идти глубже) – Baurzhan

+1

Глад смог помочь. Насколько я понял, оба вопроса являются частью одного проекта, поэтому я предложил использовать '.Previous'. Я сделал несколько тестов и выше кода, чтобы изменить последнее слово без «пробела», которое следует за ним. Если это так, следующее слово было написано в стиле по умолчанию. –

+0

Кстати, вы могли бы найти это самостоятельно, но ... Второй параметр «Предыдущий метод» теперь установлен на '2'. Тем не менее, может потребоваться изменить его на '1' для' пробелов' и ​​сохранить '2' для' Tabs и входит 'в соответствии с моим тестом. –

0

Я считаю, что это потому, что вы используете глобальное событие hook. Но я не знаю причины. Я только что экспериментировал. Когда я использую глобальный крючок, индекс диапазона, кажется, увеличивается на 128.

Смежные вопросы