Проблема SendKeys с Gma.UserActivityMonitor (C#)

Я создаю инструмент автоматизации для отправки текста, используя SendKeys.Send(), в различные другие окна, кроме приложения для отправки оконных форм. Я настраиваю инструмент на «ввод» с помощью горячих клавиш, используя библиотеку Gma.UserActivityMonitor, доступную здесь: http://www.codeproject.com/KB/cs/globalhook.aspx

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

Я попытался запустить новый поток и использовать там sendkeys, но получил сообщение об ошибке, что я должен использовать SendKeys.SendWait из-за того, что целевое приложение не принимает ввод.

Итак, на мой вопрос можно ответить одним из двух способов:

1) В каком направлении я могу искать больше информации о многопоточности и использовании sendkeys?

2) Как я могу убедиться, что триггерное нажатие клавиши корректно блокируется менеджером хуков в библиотеке?

Я разрешаю пользователю создавать словарь с разными буквами, поэтому разные буквы отправляют разные строки в целевое приложение. Соответствующий код:

private void HookManager_KeyPress(object sender, KeyPressEventArgs e)
{
    //code to generate tValue from the pressed key
    if (tAutoTyperDictionary.ContainsKey(tValue))
    {
        //Should prevent the key from being passed to the window
        //works sometimes
        e.Handled = true;
        AutoType();
    }
}

private void AutoType()
{
    int tCount = 0;
    string tLine = tAutoTyperDictionary[tCurrentAutotypeKey];

    //I remove the listener to prevent it calling itself
    HookManager.KeyPress -= new KeyPressEventHandler(HookManager_KeyPress);
    while (tCount < tLine.Length)
    {
        SendKeys.Send(tLine[tCount].ToString());
        Thread.Sleep(10);
        tCount++;
    }

    HookManager.KeyPress += new KeyPressEventHandler(HookManager_KeyPress);
}

person Ken    schedule 15.06.2011    source источник


Ответы (2)


Вы пробовали SendKeys.SendWait(строковые ключи) вместо Thread.Sleep(10)?

SendWait ждет, пока отправленные ключи не будут очищены, прежде чем продолжить.

person negEntropy    schedule 25.02.2012

Вот статический класс потока, который я написал, который может быть полезен в этом случае:

public static class threadClass
    {
        private static Thread _thread;
        public static Thread thread
        {
            get { return _thread; }
        }
        public static void startThread()
        {
            _thread = new Thread(delegate() { });
            _thread.Start();
        }
    }
person negEntropy    schedule 25.02.2012
comment
Надеюсь, я смогу проверить оба ваших предложения в эти выходные. Спасибо за предложение помощи. знак равно - person Ken; 26.02.2012