【问题标题】:Simulate Keyboard Event on Windows Mobile在 Windows Mobile 上模拟键盘事件
【发布时间】:2012-10-12 11:04:38
【问题描述】:

请参考以下截图:

日期时间控件是 Compact Framework 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
    ); 

【问题讨论】:

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


    【解决方案1】:

    尝试以下方法 - 虽然我没有针对您的确切场景进行测试,但它确实适用于我们的 .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】:

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

      【讨论】:

      • 谢谢,将焦点设置到 DateTimePicker 确实部分解决了问题,但表现不如预期。然而,它为我指明了正确的方向。
      【解决方案3】:

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

      问候

      约瑟夫

      【讨论】:

        猜你喜欢
        • 2011-05-19
        • 2013-05-25
        • 1970-01-01
        • 1970-01-01
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多