使用Gma.UserActivityMonitor发送SendKeys问题(C#)

时间:2011-06-15 04:43:17

标签: c# winforms multithreading sendkeys

我正在创建一个自动化工具,用于使用SendKeys.Send()向发送Windows窗体应用程序之外的其他窗口发送文本。我使用此处提供的Gma.UserActivityMonitor库,使用热键命令将工具设置为“type”:http://www.codeproject.com/KB/cs/globalhook.aspx

我的问题是,当我使用热键处理按键触发打字时,有时它仍然允许按键滑过。

我试图启动一个新线程并在那里使用sendkeys,但由于目标应用程序不接受输入,我收到错误,我应该使用SendKeys.SendWait

所以我的问题可以通过以下两种方式之一来回答:

1)我可以在哪个方向查找有关多线程和使用sendkeys的更多信息?

2)如何确保库中的hookmanager正确禁止触发按键?

我允许用户构建一个由不同字母键入的字典,因此不同的字母会向目标应用程序发送不同的字符串。 相关守则:

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);
}

2 个答案:

答案 0 :(得分:0)

您是否尝试过SendKeys.SendWait(字符串键)而不是Thread.Sleep(10)?

SendWait等待,直到发送的密钥被清除,然后继续。

答案 1 :(得分:0)

这是我写的一个静态线程类,在这种情况下可能很有用:

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();
        }
    }