2016-11-27 112 views
10

Pracuję nad narzędziem do analizy języka w czasie rzeczywistym, które musi podkreślać słowa, aby zwrócić uwagę pisarza w Word 2016 za pomocą dodatku VSTO, napisanego w .NET4.6.1 z C#. Pomyśl o sprawdzeniu gramatyki/sprawdzania pisowni, które dodaje skośną linię pod słowem, aby pokazać, że słowo zawiera błędy gramatyczne lub ortograficzne. Dodaję podobną funkcję do niektórych własnych zdefiniowanych reguł.Słowo VSTO 2016: Squiggly podkreślenie bez wpływu na cofanie

Szukałem wokół dodając falowane linie, i natknąłem się na Font.Underline i Font.UnderlineColor. Ustawiłem to na zakresie słowa i wydaje się, że pod warunkiem, że wizualne stumili, które miałem zwrócić uwagę. Jest jednak pewien problem. Każde podkreślenie dodaję lub podkreślam kolor, który zmieniam, dodaje akcję cofania do stosu cofania.

Nie chcę, aby tak się stało, lub chcę, aby uruchomić akcję, którą właśnie zrobiłem w kodzie ze stosu. Celem jest umożliwienie użytkownikowi użycia CTRL + Z do usunięcia zmienił i nie wpłynie na wynik anlysis mojego języka.

Jak miałbym to zrobić?

Odpowiedz

4

Natknąłem się na to pytanie, co dokładnie jest prośbą to samo: Prevent actions to be added to the word undo redo OR Remove actions from the undo redo CommandBarComboBox

Jak @Manu podkreślić, że samo pytanie zadano również nad pod adresem MSDN, gdzie odpowiedź brzmiała:

Metoda UndoClear opróżnia listę. To najlepsze, co możesz zrobić.

Istnieje również podobne pytanie na tutaj Word VSTO override CTRL+Z/CTRL+Y co sugeruje trasę Microsoft.Office.Interop.Word.UndoRecord lub MessageHooks w Addins.


Po dalszych badań zauważyłem świetny pomysł na końcu tego wątku: MSDN Draw my own squigglies on Word document gdzie można śledzić swoje działania, a następnie przejść obok nich w cofania i ponawiania operacji.

Oto doskonały przykład kodu "transakcyjne cofanie/ponawianie" Can I create an undo transaction in Word or Excel? (VSTO).Można to zrobić sam sposób w VSTO z wyjątkiem jednego dużego problemu, jak zauważył Dirk Vollmar w swojej odpowiedzi:

nie sądzę, że nadpisywanie wbudowanych komend Słowo jest możliwe przy użyciu VSTO sam, choć

Nadpisałem kilka wbudowanych poleceń w VSTO, używając zdarzeń przechwytywania klawiatury, aby przechwycić polecenia: How to perform .Onkey Event in an Excel Add-In created with Visual Studio 2010? Jednak nie jestem pewien, czy można odtworzyć Wstążkę, aby przechwytywać polecenia przycisku. Dokładniej, Cofnij i Ponów są wbudowanymi galeriami w interfejsie Wstążki i nie możesz nic zrobić z wbudowaną galerią Wstążki. Oraz w wersjach jak 2010 przyciski Undo/Redo są na pasku tytułowym - i nie można add/edit buttons on the title bar using VSTO:

enter image description here

Więc jeśli dotyczy odłowu polecenia przycisk (wszyscy, których znam używa Ctrl + Z & Y), można wstrzyknąć kod VBA, aby uzyskać dostęp do EditUndo i EditRedo wydarzeń, np:

VB._VBComponent vbModule = VBProj.VBE.ActiveVBProject.VBComponents.Add(VB.vbext_ComponentType.vbext_ct_StdModule); 
String functionText = "Public Sub EditUndo() \n"; 
functionText += "MsgBox \"Undo Happened\"\n"; 
functionText += "End Sub"; 
vbModule.CodeModule.AddFromString(functionText); 

Główny problem z tym podejściem jest zaufanie musi być udzielona.


Inna odpowiedź w tym samym QA Can I create an undo transaction in Word or Excel? (VSTO) jest Mike Regan, który odpowiedział na 3 miesiące po Dirk. Użył ukrytego dokumentu i umieścił go w prawdziwym dokumencie, kiedy jest potrzebny, aby dowolna ilość akcji VSTO była jednym cofnięciem.

Nadal nie rozwiązuje problemu zapobiegania zapisywaniu akcji w historii cofania.


Próbowałem klucza rejestru w celu ograniczenia UndoHistory 0 i przywrócić go z powrotem do 100 (w celu wyłączenia Historia dodając akcję), ale wydaje się jej tylko dla programu Excel https://support.microsoft.com/en-gb/kb/211922

Być może nieudokumentowany klucz reg do całkowitego wyłączenia historii Cofnij/Ponów, ale byłby to tylko odczyt przy uruchamianiu programu Word. Myślałem, że klucz UndoHistory zawierający numer zostanie odczytany przed każdym Undo/Redo, ale nie ma szczęścia w tym podejściu.


To nie jest łatwy do rozwiązania problemem istnieją duże ograniczenia, więc to może być łatwiej:

a) Przyjmij, że czar/Grammer sprawdzania Add-In jest ujęte w wykazie Undo/Redo (Pokonać).

b) Sprawdź, gdzie linia/tekst znajduje się na ekranie i wyświetl przezroczystą etykietkę wskazującą problem. Jest to o wiele trudniejsze niż się wydaje i jest mniej niż idealna, tu są dwa wielkie odpowiedzi, aby poprowadzić Cię w tej metodzie: Detecting text changes in Word 2016 from VSTO add-in lub znacznie prostsze podejście do wykrywania pozycji XY Od tego Microsoft wątku e-mail: https://groups.google.com/forum/#!topic/microsoft.public.word.vba.general/pKq4PsqD3cM

//position dialog relative to word insertion point (caret) 
int left = 0; 
int top = 0; 
int width = 0; 
int height = 0; 
MSWord.Range r = Globals.ThisDocument.Application.Selection.Range; 
MSWord.Window w = Globals.ThisDocument.ActiveWindow; 

w.GetPoint(out left, out top, out width, out height, r); 

frmPopUp newForm = new frmPopUp(); 
newForm.SetDesktopLocation(left + width + 2, top - newForm.Height + height); 

c) Przechwytywanie zdarzeń Undo/Redo tylko za pomocą klawiatury za pomocą Transactional Undo/Redo's i pozwala użytkownikom zobaczyć atomowe Undo/Redo za pomocą przycisków. Byłoby niezwykle podejrzanie usunąć przyciski Cofnij/Ponów, co spowoduje stertę Gdzie jest mój przycisk Cofnij? skrzynie pomocnicze. Więc nie rób tego, jeśli jesteś ciekawy, można szybko dostosować dostęp do narzędzi z pliku ".qat". Ref: https://support.microsoft.com/en-us/kb/926805

d) Użyj myszki i sprawdź, kiedy kliknięto przyciski Cofnij/Ponów. Oto kod do podpięcia myszy, pamiętaj, że nie będzie to przyjemne z produktami antywirusowymi firmy i nie polecam: https://blogs.msdn.microsoft.com/andreww/2009/02/24/message-hooks-in-add-ins/ lub https://github.com/gmamaladze/globalmousekeyhook.

e) Spróbuj przechwytywać wiadomości surowe okna, np Excel CustomTaskPane with WebBrowser control - keyboard/focus issues tylko uważaj jak na mój komentarz odwołującego BUG: Cant choose dates on a DatePicker that fall outside a floating VSTO Add-In Pompy że wiadomość w Urzędzie czasami wykazywać dziwne zachowanie.

2

Niestety, nie wygląda na to, że istnieje proste rozwiązanie tego problemu. Z tego, co widziałem, masz dwie opcje:

  1. Możesz usunąć cały stos cofania za pomocą Document.UndoClear. Jednak nie będzie to zbyt przyjazne dla użytkownika, ponieważ wszystkie poprzednie działania nie są już na liście cofania.
  2. Praca z klasą UndoRecord. Między twoimi połączeniami do StartCustomRecord i EndCustomRecord, wszystkie akcje w twoim kodzie będą generowały tylko jeden przedmiot w stosie cofania. CTRL + Z nadal będzie wpływać na twoją analizę języka, ale cały cofnięty stos nie będzie tak zanieczyszczony jak poprzednio.

Wiem, że to nie jest to czego chcesz, but even Microsoft MVPs don't have a better solution.

+0

Dzięki! To znacznie poprawia obecną sytuację. –

0

Może należy rozważyć użycie SmartTags zamiast ...

+0

Czy SmartTags zmienia kolor tekstu i/lub renderuje pod nim squiggles? –

+1

Nie sądzę ... Nie jestem jednak pewien, czy zmiana stylu tekstu dokumentu jest właściwa w scenariuszu opisanym w pytaniu - stąd sugestia. –

+1

'Tagi inteligentne są nieaktualne w programach Excel 2010 i Word 2010. Chociaż nadal można korzystać z powiązanych funkcji API w projektach Excel 2010 i Word 2010, aplikacje te nie rozpoznają automatycznie terminów, a rozpoznane terminy nie są już podkreślane. Użytkownicy muszą wywołać rozpoznawanie i wyświetlić niestandardowe akcje powiązane z tekstem, klikając prawym przyciskiem myszy tekst i klikając opcję Dodatkowe akcje w menu kontekstowym. Https://msdn.microsoft.com/en-us/library/ms178786(v=vs. 100) .aspx – Chris

Powiązane problemy