在Windows Mobile上模拟键盘事件

时间:2012-10-22 15:35:43

标签: c# windows-mobile compact-framework unmanaged

请参阅以下屏幕截图:

datetime控件是Compact Framework DateTimePicker,编号按钮是标准Button控件。

单击DateTimePicker的箭头会显示一个日历控件,允许suer选择日期。但是,如果用户单击所选文本日期的任何部分,它将突出显示,并可使用硬键或屏幕键盘进行修改。我正在尝试使用标准按钮来模拟此功能。

我已经尝试了以下但目前这只会导致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
    ); 

DateTimePicker Keyboard

3 个答案:

答案 0 :(得分:1)

我认为你指出了你的问题,“......但目前这只会导致DateTimePicker失去焦点”。我怀疑你的按钮正在获得焦点,因此消耗了按键。在生成击键之前,您可以尝试将焦点设置为DateTimePicker。如果失败了,作为最后的手段,您可以使用SendMessage()将控件硬编码到DateTimePicker的窗口句柄,使用WM_KEYDOWN,WM_KEYUP。

答案 1 :(得分:0)

尝试以下方法 - 虽然我没有针对您的确切方案进行测试,但它确实可以在我们的.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
); 

答案 2 :(得分:0)

keybd_event工作正常,但你必须首先关注datePicker:

(在一个带有一个datePicker和12个按钮(button1到button12)的表单上):

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

问候

约瑟夫