Как я могу отправить вход в Visual Studio с помощью Windows API - PullRequest
1 голос
/ 05 декабря 2009

Я пытаюсь разработать утилиту (используя системный хук), которая работает как расширитель (пользователь выбирает какой-то текст и нажимает горячую клавишу, и он расширяется). Должно работать с Visual Studio.

Я хочу реализовать это с помощью Windows API, потому что хочу разработать приложение, которое будет работать глобально с любым приложением (независимо от того, используете ли вы VS или WordPad, вы должны получить ту же функциональность).

Мне удалось сделать это успешно с помощью блокнота, WordPad и т. Д. С помощью сообщений EM_ GETSEL и EM_REPLACESEL. Но эти API не работают с Visual Studio или MS Word.

Какие API я должен использовать, чтобы иметь возможность 1. Определите, какой текст выделен. 2. Отправьте ввод в редактор.

Я программирую на C #. Если вы должны знать, что я пытаюсь сделать ... Я пытаюсь сделать универсальный порт ZenCoding, который работает на любом редакторе. Так что вся помощь будет оценена.

Ответы [ 4 ]

3 голосов
/ 22 декабря 2009

Для второй части вы можете попробовать Windows Input Simulator , который является проектом с открытым исходным кодом, который я только что выпустил для Codeplex, чтобы обернуть Win32 SendInput. Вместо SendKeys, которая просто имитирует ввод текста, вы можете фактически имитировать реальные нажатия клавиш и сложные аккорды в активном окне.

В вашем случае, если пользователь может выполнить задачу с помощью клавиатуры, этот проект поможет вам, в противном случае вам нужно будет найти другое решение.

Надеюсь, это поможет.

2 голосов
/ 22 декабря 2009

Вы можете использовать функцию автоматизации WPF, инкапсулированную в эти два пространства имен:

System.Windows.Automation
System.Windows.Automation.Provider

В качестве примера, это метод для нахождения целевого элемента автоматизации (например, типичное управление выигрышем):

    public static AutomationElement FindElement(AutomationElement context, PropertyCondition[] conditions)
    {
        // if no conditions, there's no search to do: just return the context, will be used as target
        if (conditions == null)
        {
            return (context);
        }

        // create the condition to find
        System.Windows.Automation.Condition condition = null;
        if (conditions.Length <= 0)
        {
            throw (new ArgumentException("No conditions specified"));
        }
        else if (conditions.Length == 1)
        {
            condition = conditions[0];
        }
        else
        {
            AndCondition ac = new AndCondition(conditions);
            condition = ac;
        }

        // find the element
        CacheRequest creq = new CacheRequest();
        creq.TreeFilter = Automation.ControlViewCondition;
        using (creq.Activate())
        {
            AutomationElement e = AutomationContext(context);
            AutomationElement target = e.FindFirst(TreeScope.Subtree, condition);
            return (target);
        }
    }
2 голосов
/ 05 декабря 2009

Почему бы вам не использовать класс System.Windows.Forms.SendKeys для имитации ввода с клавиатуры пользователем?

Вы можете использовать:

SendKeys.SendWait("^C"); //CTRL+C
var selectedText = Clipboard.GetText();
var newText = Replace(selectedText);
SendKEys.SendWait("^V"); //CTRL+V
0 голосов
/ 22 декабря 2009

Что бы вы ни пытались, обязательно попробуйте это, как можно скорее, с Visual Studio 2010 beta 2. Редактор в значительной степени переписан, и хаки, работающие с более ранней версией, должны быть снова протестированы.

...