Автозамена в Word

Посмотреть видео

В этой статье мы покажем возможности автозамены в Microsoft Word 2003/2007 и создадим приложение, использующее эту функциональность. Если у вас будет доступ к компьютеру жертвы, то мы немного испортим ему настройки автозамены ради шутки. Как вы, возможно, знаете, автозамена позволяет в Word автоматически исправлять некоторые ошибки. Например, если пользователь наберет "teh," , то слово исправится на "the". Используя настройки автозамены, вы можете добавить дополнительные слова для исправлений, которые удивят жертву, вплоть до того, что он будет думать, что его компьютер был заражен вирусом. Например, мы можем добавить следующие примеры для шутки для жертвы:
• Заменить "и" на "мяу"
• Заменить "что" на "чего"
• Заменить "Linux" на "Windows" и т.д.

Давайте сначала рассмотрим три различных способа добавления в список автозамен.

Простой способ изменить список автозамен

Самый простой способ - это выбрать момент, когда компьютер жертвы свободен, открыть Word и выбрать меню "Tools | AutoCorrect Options." (Word 2007 Русская версия: Параметры Word | Правописание | Параметры автозамены). На рисунке ниже видно, как вы можете добавить новые записи. Вы печатаете текст, который нужно заменить в левом текстовом поле и нужный текст в правом текстовом поле. В примере используется слово "c4f" , которое должно поменяться на "Coding4Fun."

Второй способ более продвинутый. Можно воспользоваться макросом и при помощи Macro Recorder записать ваши действия. Для записи макроса щелкните "Tool | Macro | Record New Macro." Введите имя в диалоговое окно Record Macro и щелкните "OK" Далее, вам нужно запустить макрос на компьютере жертвы. Если взглянуть на код макроса, то увидим следующее:

AutoCorrect.Entries.Add Name:="c4f", Value:="Coding4Fun" 

Используем Visual Studio

Третий способ – создание собственной утилиты, которая автоматически загружает подготовленный список автозамен из слов, разделенных запятой типа "hello, world" для замены слова "hello" на "world." Запускаем новый проект. Далее нам необходимо подключиться к Word. Для этого нужно добавить ссылку на Microsoft Word 11.0 Object Library (для Word 2007 это соответственно будет Microsoft Word 12.0 Object Library). Щелкните Project | Add Reference и на вкладке COM найдите запись Microsoft Word 11.0 Object Library как показано ниже.

Добавим на форму текстовое поле и растянем его на всю форму. Установите значение свойства MultiLine в True. Добавьте также элементы OpenFileDialog и SaveFileDialog. И, наконец, добавьте элемент ToolStrip и используйте "Insert Standard Items" для получения стандартной панели инструментов. Для нашей утилиты нам понадобятся только кнопки New, Open, Save и две собственные кнопки: кнопка Add для добавления и кнопка Remove для удаления:

Необходимо объявить несколько переменных для хранения состояния флага, если текст в текстовом поле менялся и объект Dictionary для хранения пары имя/значение для замены.


private bool textHasChanged = false;
private string fileName = "doc1.txt";

// Используется для хранения списка автозамен
Dictionary myAutoCorrect =
    new Dictionary();
Код для кнопки New

Когда пользователь щелкает на кнопке "New", мы вызываем процедуру promptToSave(). Код проверяет, равен ли textHasChanged true, и если да, то выводит сообщение, спрашивающее сохранить ли измененный текст с кнопками Да и Нет. Если пользователь выберет Да, то вызываем событие Save Button, с предложением сохранить файл.


// Выводим диалоговое окно для сохранения текста
//Display a dialog to Save the text
private void promptToSave()
{
    if (textHasChanged == true)
    {
        //Display a message box asking them to save
        DialogResult dr = MessageBox.Show("Do you want to save the changes to "
            + fileName + "?", "Save File", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
        if (dr == DialogResult.Yes)
        {
                this.saveToolStripButton_Click("Save File", EventArgs.Empty);
        }
    }
}
Код для кнопки Open

Когда пользователь нажимает на кнопке "Open", мы показываем окно OpenFileDialog при помощи метода ShowDialog(). Если в этом окне будет выбрана кнопка "OK", мы получаем имя файла и читаем его содержимое при помощи класса File.


// Открываем документ
private void openToolStripButton_Click(object sender, EventArgs e)
{
    openFileDialog1.InitialDirectory = Environment.SpecialFolder.DesktopDirectory.ToString();
    //Show the Open File Dialog
    openFileDialog1.FileName = fileName;
    if (openFileDialog1.ShowDialog() == DialogResult.OK)
    {
        fileName = openFileDialog1.FileName;
        txtWordList.Text = File.ReadAllText(fileName);
    }
}
Код для кнопки Save

Мы показываем диалоговое окно SaveFileDialog, когда пользователь хочет сохранить файл.


// Сохраняем документ
private void saveToolStripButton_Click(object sender, EventArgs e)
{
    //Show the Save File Dialog            
    saveFileDialog1.FileName = fileName;
    saveFileDialog1.InitialDirectory = Environment.SpecialFolder.Desktop.ToString();
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        File.WriteAllText(saveFileDialog1.FileName, txtWordList.Text);
        textHasChanged = false;
    }
}
Добавление записей в словарь AutoCorrect (Dictionary Object)

Для добавления записей в список автозамен, нужно сначала разделить текст в текстовом поле на составляющие имя/значение и добавить полученные пары в объект Dictionary, который будет хранить данные. Для этого мы воспользуемся классом StringReader и прочитаем содержимое текстового поля. Сначала мы используем цикл While, чтобы пройти в цикле каждую строчку и убедиться, что строка не равна NULL. Затем с помощью метода Split() склеиваем содержимое строчки в строковый массив при помощи запятой (",") в качестве разделителя. Например, если имеется строчка "Hello, World," то метод Split() вернет массив, где element(0) равен "Hello" и element(1) равен "World." Наконец, мы вызываем метод Add для добавления ключа (Hello) и значения (World) в словарь myAutoCorrect.


// Считываем содержимое текстового поля и склеиваем текст в пары имя/ключ
private void updateDictionary()
{
    string[] splitKeyValues;
    string currentLine;

    using (StringReader sr = new StringReader(txtWordList.Text))
    {
        //loop through each line
        while (true)
        {
            currentLine = sr.ReadLine();
            if (currentLine != null)
            {
                //split the text and add it to the AutoCorrect Dictionary
                splitKeyValues = currentLine.Split(',');
                myAutoCorrect.Add(splitKeyValues[0], splitKeyValues[1]);
            }
            else //break when we run out of lines
                break;
        }
    }
}
Добавление записей автозамен при помощи Word Object Library

Теперь у нас есть словарь записей ключ/значение и нам нужно добавить эти записи в Word при помощи Microsoft Word Object Library. Для этого мы создадим класс-обертку WordWrapperClass, в котором будут производиться операции с Word. У класса WordWrapperClass будут два открытых метода AddToAutoCorrect() и RemoveFromAutoCorrect(), которые будут брать значения из myAutoCorrect. Первое, что мы делаем в методе AddToAutoCorrect – это вызываем функцию startWord(), которая создает невидимый экземпляр Word. Далее, для каждого ключа нашего словаря мы получаем его значение и вызываем метод AutoCorrect.Entries.Add(key,value) для добавления записи в Word. После того, как мы добавили записи, вызываем метод quitWord(), чтобы закрыть созданный нами экземпляр Word в методе startWord().
Замечание для метода quitWord: так как Visual C# не поддерживает опциональные параметры, мы объявим переменную "empty" для типа System.Reflection.Missing.Value.


using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Office.Interop.Word; 

namespace FunWithAutoCorrect
{
    public class WordWrapper
    {
        object empty = System.Reflection.Missing.Value;
        
        public void AddToAutoCorrect(Dictionary<string, string> entries)
        {
            Application oWord = startWord(); 
            string value;

            //Loop through each entry from the dictionary
            foreach (string key in entries.Keys)
            {
                //get the dictionary value 
                entries.TryGetValue(key, out value);    

                // Add the AutoCorrect entry into Word
                oWord.Application.AutoCorrect.Entries.Add(key, value);
            }
            quitWord(oWord); //cleanup
        }

        public void RemoveFromAutoCorrect(Dictionary<string, string> entries)
        {
            Application oWord = startWord();
            string value;

            //Loop through each entry from the dictionary
            foreach (string key in entries.Keys)
            {
                entries.TryGetValue(key, out value); //get the dictionary value 

                //Loop through each Word AutoCorrect entry
                foreach (AutoCorrectEntry a in oWord.AutoCorrect.Entries)
                {
                    //Entries must match key and value
                    if (a.Name == key && a.Value == value)
                    {
                        a.Delete(); //Delete the AutoCorrect entry 
                    }
                }
            }

            quitWord(oWord); //cleanup
        
        }
        
        private Application startWord()
        {
            Application oWord = new Application();
            oWord.Visible = false;
            return oWord;
        }

        private void quitWord(Application oWord)
        {
            //Quit Word
            oWord.Application.Quit(ref empty, ref empty, ref empty);
        }
    }
}
Удаление записей AutoCorrect из Word Object Library

Так как наше приложение является шуткой, то мы должны предусмотреть удаление наших вредных записей из списка автозамен у жертвы. Удаление записей схоже с методом AddToAutoCorrect: мы используем класс Dictionary, содержащий ключ/значение для записей AutoCorrect. Отличие состоит в том, что мы имеет два цикла. Один для каждого ключа Dictionary, а второй цикл для прохождения через все записи AutoCorrect для проверки совпадений. Это необходимо делать, чтобы убедиться, что ключ и значение точно совпадают с нашим словарем и по неосторожности не удалить правильные записи автозамены. Например, мы хотим удалить нашу запись "Hello,World", но при этом не должны удалять запись "helo,hello". Только после такой проверки мы можем вызывать метод AutoCorrectEntry Delete() для удаления записи. Данный код используется в методе RemoveFromAutoCorrect

Автозамена является удобной вещью для автоматического добавления записей, которое помогает сохранять время на исправление ошибок. А мы воспользовались этой функциональностью для своей шутки. Если вы думаете, как еще можно улучшить это приложение-шутку, то подброшу такую идею. Например, можно воспользоваться поддержкой RichTextFile и при замене слов можно использовать форматированный текст (картинки, цвет, таблицу и т.д.). Предположим, пользователь ввел слово "horse", которое автоматически поменяется на изображение лошади (посмотрите видео в начале статьи).

Скачать пример

Источник: When AutoCorrect Goes Bad

Перевод: Александр Климов

Реклама

Proliant DL, оборудование hp proliant .; Продаю дом коттедж в твери .