3

请参考下面的截图:

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

单击 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
    ); 

日期时间选择器键盘

4

3 回答 3

1

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

于 2012-10-22T18:40:58.467 回答
0

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

(在具有一个 datePicker 和 12 个按钮(按钮 1 到按钮 12)的表单上):

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

问候

约瑟夫

于 2012-10-23T09:51:30.647 回答
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
); 
于 2012-10-22T18:34:21.353 回答