模拟发送密钥

问题描述 投票:0回答:1

我试图通过使用keybd_event发送密钥来模拟键盘,如下所述。

最初从我的窗口加载事件我创建一个后台工作者并启动它。此后台工作程序除其他外,如果模拟参数处于活动状态,则订阅表单按键事件。

我确保此参数处于活动状态,因此我正确订阅了winform keypress事件。

另外在表格中我有一个按钮来开始模拟键盘。当单击此按钮“btnSimulateKeyboard_Click”时,我发送一个字符串,然后将其转换为字节数组,最后在循环内使用keybd_event发送每个字节。

我的问题是表单按键事件永远不会被触发。为什么?这不是模拟发送密钥的正确方法吗?

namespace My.Apps.WinForms.Test
{
    public partial class MyForm: Form
    {
        #region Constructor
        public MyForm()
        {
          InitializeComponent();
        } 
        #endregion

        private void MyForm_Load(object sender, EventArgs e)
        {
            // Some stuff

            _worker = new BackgroundWorker();
            _worker.DoWork += new DoWorkEventHandler(_worker _DoWork);
            _worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(_worker _RunWorkerCompleted);
            _worker.ProgressChanged += new ProgressChangedEventHandler(_worker t_ProgressChanged);
            _worker.WorkerReportsProgress = true;
            _worker.RunWorkerAsync();
        }

        private void _worker_DoWork(object sender, DoWorkEventArgs e)
        {
            // Some stuff
            // Load parameters

            if (simulateKeyboard)
            {
               this.InitKb();
            }

            // Some stuff
        }

        private void InitKb()
        {
            this.KeyPress += new System.Windows.Forms.KeyPressEventHandler(this.MyForm_KeyPress);
        }

        private void MyForm_KeyPress(object sender, KeyPressEventArgs e)
        {
            // Check key pressed
        }    

        private void btnSimulateKeyboard_Click(object sender, EventArgs e)
        {
            SimulateKeyboardTest.SendString("abcdefg");
        }       
    }
}

键盘模拟类:

namespace My.Apps.WinForms.Test
{
    public static class SimulateKeyboardTest
    {
        #region DLLs Import
        [DllImport("user32.dll", SetLastError = true)]
        static extern void keybd_event(byte bVk, byte bScan, int dwFlags, int dwExtraInfo);
        #endregion

        #region Constants

        public const int KEYEVENTF_EXTENDEDKEY = 0x0001;      // Key down flag
        public const int KEYEVENTF_KEYUP = 0x0002;            // Key up flag

        #endregion

        #region Public Static Methods

        /// <summary>
        ///   Sends a string.
        /// </summary>
        /// <param name="strChars">String to send.</param>
        public static void SendString(string strChars)
        {
            byte[] bytChars = Encoding.ASCII.GetBytes(strChars);
            for (int i = 0; i < bytChars.Length; i++)
            { 
                KeyPress(bytChars[i]);
                KeyUp(bytChars[i]);
            }
        }

        /// <summary>
        ///   Simulate a key press
        /// </summary>
        public static void KeyPress(byte keyCode)
        {
            keybd_event(keyCode, 0, KEYEVENTF_EXTENDEDKEY, 0);
        }

        /// <summary>
        ///   Simulate a key release 
        /// </summary>
        public static void KeyUp(byte keyCode)
        {
            keybd_event(keyCode, 0, KEYEVENTF_KEYUP, 0);
        }

        #endregion
    }
}
c# winforms .net-3.5
1个回答
1
投票

我想你可以使用winForms SendKeys.Send()方法发送密钥,不需要工人或事件。

请参阅MSDN文档:https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx

© www.soinside.com 2019 - 2024. All rights reserved.