请参阅以下屏幕截图:
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
);
答案 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);
}
问候
约瑟夫