2013-03-10 11 views
10

Moim zdaniem MS Office Smooth Typing jest bardzo innowacyjną funkcją pakietu Office i chciałbym wiedzieć, czy ta funkcja jest dostępna dla programistów w .NET Framework, szczególnie w języku C#.Czy istnieje sposób mogę zintegrować MS Office Smooth Typing w aplikacji C#?

Jeśli tak, to proszę pisać w odpowiedzi na link do dokumentacji a może także przykładem Wykorzystanie?

Dzięki.

+2

Proszę wyjaśnić, co to „Smooth wpisując” funkcji jest. Czy odnosisz się do animowanych efektów karetki? – Dai

+2

@Dai Mam na myśli animację pisania, która powoduje przesuwanie kursora podczas pisania. Można go łatwo zauważyć, gdy wpisujesz coś w MS Office Word 2010, a następnie przełączasz się na MS Office Word 2013. – Zignd

Odpowiedz

11

Nie jestem właścicielem biura, więc nie mogę spojrzeć na tę funkcję, ale musiałem trochę przedostać się przez karetkę w RichTextBoxes i uznałem, że nie było to warte wysiłku. Zasadniczo jesteś sam. Brak funkcji pomocniczych z .NET, ale wszystko jest obsługiwane przez kontrolkę Win32. Będziesz mieć trudności z pokonaniem tego, co już się dzieje pod maską. I prawdopodobnie skończy się przechwytywaniem wiadomości w oknie i mnóstwem brzydkiego kodu.

Więc moja rada jest podstawowa: Nie rób tego. Przynajmniej dla podstawowych formantów, takich jak TextBox czy RichTextBox. Możesz mieć więcej szczęścia, próbując zdalnie uzyskać dostęp do działającego biura z .NET, ale jest to zupełnie inna puszka robaków.

Jeśli naprawdę domagać się dzieje z SetCaretPos - trasy, tu jest jakiś kod, aby dostać się i działa z wersji podstawowej, gdzie można poprawić na:

// import the functions (which are part of Win32 API - not .NET) 
[DllImport("user32.dll")] static extern bool SetCaretPos(int x, int y); 
[DllImport("user32.dll")] static extern Point GetCaretPos(out Point point); 

public Form1() 
{ 
    InitializeComponent(); 

    // target position to animate towards 
    Point targetCaretPos; GetCaretPos(out targetCaretPos); 

    // richTextBox1 is some RichTextBox that I dragged on the form in the Designer 
    richTextBox1.TextChanged += (s, e) => 
     { 
      // we need to capture the new position and restore to the old one 
      Point temp; 
      GetCaretPos(out temp); 
      SetCaretPos(targetCaretPos.X, targetCaretPos.Y); 
      targetCaretPos = temp; 
     }; 

    // Spawn a new thread that animates toward the new target position. 
    Thread t = new Thread(() => 
    { 
     Point current = targetCaretPos; // current is the actual position within the current animation 
     while (true) 
     { 
      if (current != targetCaretPos) 
      { 
       // The "30" is just some number to have a boundary when not animating 
       // (e.g. when pressing enter). You can experiment with your own distances.. 
       if (Math.Abs(current.X - targetCaretPos.X) + Math.Abs(current.Y - targetCaretPos.Y) > 30) 
        current = targetCaretPos; // target too far. Just move there immediately 
       else 
       { 
        current.X += Math.Sign(targetCaretPos.X - current.X); 
        current.Y += Math.Sign(targetCaretPos.Y - current.Y); 
       } 

       // you need to invoke SetCaretPos on the thread which created the control! 
       richTextBox1.Invoke((Action)(() => SetCaretPos(current.X, current.Y))); 
      } 
      // 7 is just some number I liked. The more, the slower. 
      Thread.Sleep(7); 
     } 
    }); 
    t.IsBackground = true; // The animation thread won't prevent the application from exiting. 
    t.Start(); 
} 
+0

To. Jest. Niesamowity. Dziękuję bardzo. –

+0

Bardzo niesamowity kod! jak @newStackExchangeInstance powiedział, ale jest problem, który pojawia się, gdy naciśniesz klawisz Enter, aby wprowadzić nową linię, kursor zajmuje tyle samo czasu, aby przejść dalej, czy myślisz, że możesz to naprawić, aby kursor powrócił na domyślna prędkość? Myślę, że to rozwiąże problem, a jeśli tak, dam ci nagrodę. – Zignd

+0

Dziękuję. Jeśli to jest jedyny problem, jaki widzisz, to jest w porządku :). Powiedziałbym, że są jeszcze inne niezbyt miłe rzeczy, jak gdybyś pisał zbyt szybko, litery pojawiałyby się przed "nadejściem", itd. W każdym razie, zaktualizowałem kod tak, aby nie animował karetki gdy odległość jest zbyt duża, więc powinna "przeskoczyć" teraz do następnej linii zamiast powolnego poruszania się. Baw się dobrze z kodem;) – Imi

3

Stosować SetCaretPos z własnej funkcji animacja rozrządu. Utwórz nowy wątek, który interpoluje pozycję karetki w oparciu o poprzednią lokalizację i nową pożądaną lokalizację.