2013-08-04 2 views
0

상황 별 상황 - MS Word 추가 기능.
Langiage - C#
문제 :Application.Selection.Range.Start가 때때로 잘못된 값을 반환하는 이유는 무엇입니까?

현재 커서 위치를 얻으려고합니다. InsertionPoint을 반환하므로 Application.Selection.Range을 사용하고 있습니다. 각 Space,Tab 또는 Enter 키를 누른 후 다음을 수행합니다. 간혹 올바른 값 인 MessageBox가 표시됩니다.actual_value_of_insertion_point_position+128 가끔 있습니다. 왜 때때로 삽입 점 인덱스가 128로 증가 했습니까? 나는 아무것도하지 않고있다. 단지 텍스트를 입력하고, Space를 누르고, 때로는 올바른 값을 예상하지 않는다.

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

당신은 또한'value + 128'을 가질 때 정확한 상황을 지적 할 수 있지만'때때로'를 언급 할뿐만 아니라. 이것은 자신의 컴퓨터에서이 동작을 확인하려는 경우 유용 할 수 있습니다. –

+0

@ Vadim, 현재 커서 위치를 가져오고 싶습니다. 나는 정수 인덱스를 의미합니다. 삽입 포인터의 인덱스를 반환하므로'Application.Selection.Range.Start'를 사용했습니다. 그것은 작동하지만 때로는 잘못된 값을 반환합니다. 이 문제를 어떻게 해결할 수 있는지 알고 싶습니다. 커서 위치를 얻는 다른 방법이있을 수 있습니다. – Baurzhan

답변

1

당신은 누군가가 당신이 these'characters '의 전에 단어를 검색 가정 Space, Return or Tab를 누른 후 범위를 설정하는 다른 방법을 시도 할 수 있습니다.

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 

팁 : 여기

당신이 당신의 If statement에 배치 할 수있는 코드입니다. Word에 Range modification methods이 많이 있지만 일부는 올바르게 작동하지 않습니다. Previous 내 테스트에 따라이 상황에서 잘 작동합니다.

+0

조사 해 주셔서 감사합니다. 사실, 나는 공간을 기억하기 전에 공간을 기억할 필요가있다. 당신이 내 다른 질문에 답한 것을 보았습니다 - 어떤 범위의 스타일을 바꾸는 것이 공간을 따라 첫 글자의 스타일을 바꾸는 방법을 모르겠습니다. 'Previous'가 잘 작동하기 때문에 답을 받아 들였습니다. 불행하게도 나는 여전히 이익을 얻는다. (어쨌든 응답을 주셔서 감사한다. 나는 당신이 정말로 128 시프트 문제를 푸는데 도움을 주었기 때문에 대답을 받아 들였다.) 또한, 나는 커서 위치를'Previous'로 가져오고 단순히 설정 'rng.Font = ...'- 작동하지 않습니다. 나는 더 깊이 가야 해.) – Baurzhan

+1

다행이 도왔다. 내가 아는 한 두 질문은 하나의 프로젝트의 일부이므로 그러므로'.Previous'를 사용하여 제안했습니다. 나는 몇 가지 테스트를했고 위의 코드는 그것을 따르는'space '없이 마지막 단어를 바꾸는 데 도움이된다. 그렇다면 다음 단어가 기본 스타일로 작성되었습니다. –

+0

BTW, 스스로 발견 할 수는 있지만 ...'이전 방법'두 번째 매개 변수는 현재 '2'로 설정되어 있습니다. 그러나 '공백'의 경우 '1'로 변경하고 테스트 결과에 따라 '탭과 입력'의 경우 '2'를 유지해야 할 수 있습니다. –

0

나는 글로벌 후크 이벤트를 사용하고 있기 때문에 이것이라고 생각합니다. 그러나 나는 그 이유를 모른다. 나는 단지 그것을 실험했다. 전역 후크를 사용하면 범위 색인이 128만큼 증가한 것 같습니다.

관련 문제