我试图通过使用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
}
}
答案 0 :(得分:1)
我认为你可以使用winForms SendKeys.Send()方法发送密钥,不需要工作人员或事件。
请参阅MSDN文档:https://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.send(v=vs.110).aspx