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

DateTimePicker キーボード

4

3 に答える 3

1

「...しかし、現在、これはDateTimePickerがフォーカスを失う原因になっているだけです」という問題を指摘したと思います。ボタンがフォーカスされ、その結果、キーストロークが消費されていると思われます。キーストロークを生成する前に、DateTimePicker にフォーカスを設定してみてください。それが失敗した場合は、最後の手段として、WM_KEYDOWN、WM_KEYUP を使用して、DateTimePicker のウィンドウ ハンドルに SendMessage() を使用して、コントロールにハード コードすることができます。

于 2012-10-22T18:40:58.467 に答える
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 に答える
0

keybd_event は正常に動作しますが、最初に datePicker に焦点を当てる必要があります。

(1 つの 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);
    }

よろしく

ヨーゼフ

于 2012-10-23T09:51:30.647 に答える