C# 在Windows Mobile上模拟键盘事件

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

请参阅下面的屏幕截图:

datetime控件是一个紧凑的框架DateTimePicker,编号的按钮是标准按钮控件

单击DateTimePicker的箭头显示日历控件,允许用户选择日期。但是,如果用户单击所选文本日期的任何部分,它将高亮显示,并且可以使用硬键或屏幕键盘进行修改。我试图用我的标准按钮来模拟这个功能

我尝试过以下方法,但目前这只会导致DateTimePicker失去焦点

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