Question

Je suis en train d'utiliser PostMessage pour envoyer une touche de tabulation.

Voici mon code:

// This class allows us to send a tab key when the the enter key
//  is pressed for the mooseworks mask control.   
public class MaskKeyControl : MaskedEdit
{
//  [DllImport("coredll.dll", SetLastError = true, CharSet = CharSet.Auto)]
//  static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

    [return: MarshalAs(UnmanagedType.Bool)]
    // I am calling this on a Windows Mobile device so the dll is coredll.dll
    [DllImport("coredll.dll", SetLastError = true)]
    static extern bool PostMessage(IntPtr hWnd, uint Msg, Int32 wParam, Int32 lParam);

    public const Int32 VK_TAB = 0x09;
    public const Int32 WM_KEYDOWN = 0x100;

    protected override void OnKeyDown(KeyEventArgs e)
    {
        if (e.KeyData == Keys.Enter)
        {
            PostMessage(this.Handle, WM_KEYDOWN, VK_TAB, 0);
            return;
        }
        base.OnKeyDown(e);
    }

    protected override void OnKeyPress(KeyPressEventArgs e)
    {
        if (e.KeyChar == '\r') 
            e.Handled = true;
        base.OnKeyPress(e);
    }
}

Quand je presse entrer le code est appelé, mais rien ne se passe. Ensuite, j'appuyez sur TAB et il fonctionne très bien. (Donc, il y a quelque chose de mal avec mon envoi du message Tab.)

Était-ce utile?

La solution

Vous devriez vraiment pas envoyer des messages de fenêtres liées à l'entrée utilisateur directement aux commandes Windows. Au contraire, si vous voulez entrer Simuler, vous devez compter sur la SendInput fonction API au lieu d'envoyer les touches.

En outre, comme Chris Taylor mentionne dans son commentaire, le classe SendKeys peut être utilisé pour envoyer des éléments clés pour une application dans le cas où vous souhaitez utiliser un wrapper managé existant (au lieu d'appeler la fonction vous SendInput à travers la couche P / Invoke).

Autres conseils

PostMessage sur les événements clés fait des choses vraiment très bizarre.

Dans ce cas, peut-être SendMessage avec KEYDOWN, KEYPRESS, keyUp (trois appels) pourrait mieux fonctionner.

Une alternative à l'envoi de messages d'entrée au contrôle, vous pourriez être plus explicite et procédez comme suit.

protected override void OnKeyDown(KeyEventArgs e)
{
  if (e.KeyCode == Keys.Enter)
  {
    if (Parent != null)
    {
      Control nextControl = Parent.GetNextControl(this, true);
      if (nextControl != null)
      {
        nextControl.Focus();
        return;
      }
    }
  }
  base.OnKeyDown(e);
}

Cela mettra l'accent sur le contrôle suivant sur le parent lorsque la touche entrée est enfoncée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top