Я создаю инструмент автоматизации для отправки текста, используя 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);
}