Simuler un événement de clavier sur Windows Mobile

Veuillez vous référer à la capture d’écran ci-dessous:

Le contrôle datetime est un Compact Framework DateTimePicker, les boutons numérotés sont des contrôles stndard Button.

En cliquant sur la flèche de DateTimePicker, un contrôle de calendrier permet au demandeur de sélectionner une date. Toutefois, si l’utilisateur clique sur une partie de la date du texte sélectionnée, celle-ci est mise en surbrillance et peut être modifiée à l’aide des touches du clavier ou du clavier à l’écran. J’essaie d’imiter cette fonctionnalité avec mes boutons standard.

J’ai déjà essayé ce qui suit, mais pour le moment, DateTimePicker perd tout son focus.

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

Clavier DateTimePicker

Je pense que vous avez signalé votre problème, “… mais actuellement, cela ne fait que perdre le contrôle de DateTimePicker”. Je soupçonne que vos boutons sont de plus en plus ciblés et qu’ils utilisent les frappes au clavier. Vous pouvez essayer de définir le focus sur le DateTimePicker avant de générer les frappes au clavier. Si cela échoue, vous pouvez, en dernier recours, coder en dur le contrôle à l’aide de SendMessage () sur le handle de fenêtre pour DateTimePicker, avec WM_KEYDOWN, WM_KEYUP.

Essayez ce qui suit: même si je ne l’ai pas testé pour votre scénario exact, cela fonctionne dans nos applications .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 ); 

keybd_event fonctionne très bien, MAIS il faut d’abord focaliser le datePicker:

(sur un formulaire avec un datePicker et 12 boutons (bouton 1 à bouton 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); } 

Cordialement

Josef