2012-10-22 95 views
3

请参考以下屏幕截图:在Windows Mobile上模拟键盘事件

datetime控件是Compact Framework DateTimePicker,其编号按钮是stndard 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

回答

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

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

+0

谢谢,把重点放在DateTimePicker的确部分解决了这个问题,但并没有像预期的那样表现得很好。但它指出了我的正确方向。 – Fishcake

0

keybd_event工作得很好,但你必须首先关注的日期选择器:

(有一个日期选择器和12个按钮(按钮1至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); 
    } 

问候

约瑟夫