7
votes

C # Capturez les événements du clavier principal principal

Comment attraper des événements de clavier de la forme principale WinForm, où d'autres contrôles sont. Donc, je veux attraper un événement Ctrl + s et peu importe la mise au point. Mais sans pinvoke (crochets et tels ...) Seule la puissance interne gérée.


4 Réponses :


10
votes

Le classe de formulaire (System.Windows.Forms) a ONKEYDODOW , OnKeyPress et OnKeyUp Méthodes d'événement que vous pouvez utiliser pour détecter Ctrl + s

Utilisez le keeventargs dans ces méthodes Pour déterminer quelles touches ont été appuyées sur

Edit

Assurez-vous d'activer form.keypreview = true; de sorte que le formulaire capturera les événements indépendamment de la mise au point.


2 commentaires

Vous avez manqué la nécessité «Peu importe l'endroit où concentrez-vous».


Avez-vous lu: «Donc, je veux attraper un événement Ctrl + S et peu importe où se concentre la mise au point». Veuillez lire attentivement.



1
votes

gérer la touche code> sur le formulaire et toutes ses commandes.

private void OnFormLoad(object sender, EventArgs e)
{
    this.KeyDown += OnKeyDown;
    foreach (Control control in this.Controls)
    {
        control.KeyDown += OnKeyDown;
    }
}

private void OnKeyDown(object sender, KeyEventArgs e)
{
    if (e.Control)
    {
        if (e.KeyValue == (int)Keys.S)
        {
            Console.WriteLine("ctrl + s");
        }
    }
}


4 commentaires

Avez-vous lu: «Donc, je veux attraper un événement Ctrl + S et peu importe où se concentre la mise au point». Veuillez lire attentivement.


@ROBB: Oui, j'ai lu cela, mais j'ai supposé que la phase n'a pas d'importance où la mise au point est se référant à l'intérieur du formulaire ou de ses commandes afin que la mise au point sur l'exemple d'un Textbox1 ou dans le formulaire. N'est-ce pas que vous vouliez dire?


@Robb: Avez-vous remarqué la question sur mon commentaire précédent?


Jalal, Yas je voulais dire que ... mais si cette question n'est que sur l'événement clé, alors je ne demanderais pas. J'appliquais à P / Invoke Keyboard Crown Proc avant, et la réponse d'Ashish était expressément ce que je cherchais.



11
votes

Essayez ce code. Utilisez l'interface imessagefilter code> Vous pouvez filtrer n'importe quelle touche Ctrl kbd> +.

public partial class Form1 : 
    Form,
    IMessageFilter
{
    public Form1()
    {
        InitializeComponent();

        Application.AddMessageFilter(this);
        this.FormClosed += new FormClosedEventHandler(this.Form1_FormClosed);
    }

    private void Form1_FormClosed(object sender, FormClosedEventArgs e)
    {
        Application.RemoveMessageFilter(this);
    }

    public bool PreFilterMessage(ref Message m)
    {
        //here you can specify  which key you need to filter

        if (m.Msg == 0x0100 && (Keys)m.WParam.ToInt32() == Keys.S &&
            ModifierKeys == Keys.Control) 
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}


0 commentaires

0
votes

Vous pouvez ajouter un MENUSDIP, puis créer un élément de bandes de menu nommé Enregistrer et lui donner une coupe courte Ctrl + S. Ajoutez un gestionnaire d'événements pour cela. Cela tirera même si l'accent sera mis sur un autre contrôle sur la forme. Si vous n'aimez pas voir le ménousting; Vous pouvez définir visible = false aussi. Je dois admettre que cela est laid.


0 commentaires