C# 在Windows Mobile上模拟键盘事件
请参阅下面的屏幕截图: datetime控件是一个紧凑的框架DateTimePicker,编号的按钮是标准按钮控件 单击DateTimePicker的箭头显示日历控件,允许用户选择日期。但是,如果用户单击所选文本日期的任何部分,它将高亮显示,并且可以使用硬键或屏幕键盘进行修改。我试图用我的标准按钮来模拟这个功能 我尝试过以下方法,但目前这只会导致DateTimePicker失去焦点C# 在Windows Mobile上模拟键盘事件,c#,windows-mobile,compact-framework,unmanaged,C#,Windows Mobile,Compact Framework,Unmanaged,请参阅下面的屏幕截图: datetime控件是一个紧凑的框架DateTimePicker,编号的按钮是标准按钮控件 单击DateTimePicker的箭头显示日历控件,允许用户选择日期。但是,如果用户单击所选文本日期的任何部分,它将高亮显示,并且可以使用硬键或屏幕键盘进行修改。我试图用我的标准按钮来模拟这个功能 我尝试过以下方法,但目前这只会导致DateTimePicker失去焦点 const int KEYEVENTF_KEYUP = 0x2; const int KEYEVE
const int KEYEVENTF_KEYUP = 0x2;
const int KEYEVENTF_KEYDOWN = 0x0;
const int VK_NUMPAD1 = 0x61;
private void digitButton_Clicked(object sender, EventArgs e)
{
keybd_event(VK_NUMPAD1, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(VK_NUMPAD1, 0, KEYEVENTF_KEYUP, 0);
}
[DllImport("coredll.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event
(
byte bVk,
byte bScan,
int dwFlags,
int dwExtraInfo
);
尝试以下方法-虽然我没有针对您的具体场景对其进行测试,但它在我们的.NET CF应用程序中确实有效:
const int KEYEVENTF_EXTENDED_KEY = 0x1;
const int KEYEVENTF_KEYUP = 0x2;
const int KEYEVENTF_KEYDOWN = 0x0;
const int VK_NUMPAD1 = 0x61;
private void digitButton_Clicked(object sender, EventArgs e)
{
keybd_event(VK_NUMPAD1, 0x45, KEYEVENTF_EXTENDEDKEY, 0);
keybd_event(VK_NUMPAD1, 0x45, KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP, 0);
}
[DllImport("coredll.dll", EntryPoint = "keybd_event", SetLastError = true)]
public static extern void keybd_event
(
byte bVk,
byte bScan,
int dwFlags,
int dwExtraInfo
);
我想你指出了你的问题,“……但目前这只会导致DateTimePicker失去焦点”。我怀疑你的按钮正在获得焦点,因此会消耗击键的时间。在生成击键之前,可以尝试将焦点设置为DateTimePicker。如果失败,作为最后手段,您可以使用WM_KEYDOWN、WM_keydup将SendMessage()硬编码到DateTimePicker的窗口句柄中。keybd_事件可以正常工作,但您必须首先关注datePicker: (在具有一个日期选择器和12个按钮(按钮1到按钮12)的表单上):
public Form1()
{
初始化组件();
foreach(此.Controls中的控件c)
{
如果(c是按钮)
{
int n=GetButtonnNumber((按钮)c);
如果(n)谢谢,将焦点设置为DateTimePicker确实部分解决了问题,但没有达到预期效果。不过,它为我指明了正确的方向。
public Form1()
{
InitializeComponent();
foreach (Control c in this.Controls)
{
if (c is Button)
{
int n = getButtonNumber((Button)c);
if (n <= 10)
c.Text = n.ToString();
c.Click += new EventHandler(c_Click);
}
}
button11.Text = "<-"; button12.Text = "OK";
}
void c_Click(object sender, EventArgs e)
{
if (sender is Button)
{
Button b = (Button)sender;
int n = Convert.ToInt16( b.Text);
digitButtonClick(n);
}
}
private void digitButtonClick(int n)
{
byte vkInt = (byte)(0x30 + n);
dateTimePicker1.Focus();
keybd_event(vkInt, 0, KEYEVENTF_KEYDOWN, 0);
keybd_event(vkInt, 0, KEYEVENTF_KEYUP, 0);
}