Détecter les clics gauche et droit de la souris en même temps?

Je suis en train de refaire Windows Minesweeper (de XP) et ils avaient inclus que si vous cliquez en même temps sur un nombre comportant autant d’indicateurs que de chiffres avec les boutons gauche et droit de la souris, toutes les autres tuiles masquées autour de ce numéro sont révélées. .

J’ai du mal à dire que les boutons gauche et droit de la souris sont enfoncés exactement au même moment … J’utilise une paire de bools, un pour chaque bouton avec les événements OnMouseDown et OnMouseUp, mais si les 2 boutons Si vous cliquez au même moment (ou très près), alors un seul événement MouseDown se déclenche et l’autre non … Si vous cliquez et maintenez l’un des boutons, puis cliquez et maintenez l’autre, le code fonctionne bien.

Existe-t-il un meilleur moyen de détecter ce type de “double” clic?

Modifier:

Bon, petite histoire pour laquelle je me suis trompé (ça a fonctionné tout le temps).

J’ai un macbook pro sous Windows 7. Pour ceux d’entre vous qui ne le savent pas, le macbook pro a une seule barre pour un bouton de souris qui laisse normalement des clics, mais si vous placez 2 doigts vers le bas, un clic droit vous permet de ” t faire les deux (et aucun moyen de cliquer du milieu). Donc, je construisais mon application et l’envoyais à mon ami, il me disait que ça ne fonctionnait pas, alors j’ai posté cette question. J’ai finalement décidé de l’essayer sur mon autre ordinateur portable, un Dell XPS avec 2 boutons de souris … Une fois que cela a fonctionné, je l’ai transmis à d’autres amis qui ont confirmé que cela fonctionnait. Je ne sais pas comment mon premier ami a tout gâché, mais la morale de l’histoire est de ne rien acheter Apple. Au moins c’est la morale que j’ai.

Créez une variable de classe booléenne pour les boutons gauche et droit, dont la valeur par défaut est False. Lorsque l’événement de souris enfoncé se déclenche, définissez la variable sur true et vérifiez si les deux sont vrais. Lorsque la souris se déclenche, définissez la variable sur false.

public bool m_right = false; public bool m_left = false; private void MainForm_MouseDown(object sender, MouseEventArgs e) { m_objGraphics.Clear(SystemColors.Control); if (e.Button == MouseButtons.Left) m_left = true; if (e.Button == MouseButtons.Right) m_right = true; if (m_left == false || m_right == false) return; //do something here } private void MainForm_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) m_left = false; if (e.Button == MouseButtons.Right) m_right = false; } 

Code complet:

  private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) leftPressed = true; else if (e.Button == MouseButtons.Right) rightPressed = true; if (leftPressed && rightPressed) { MessageBox.Show("Hello"); // note: // the following are needed if you show a modal window on mousedown, // the modal window somehow "eats" the mouseup event, // hence not sortingggering the MouseUp event below leftPressed = false; rightPressed = false; } } private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) leftPressed = false; else if (e.Button == MouseButtons.Right) rightPressed = false; } 

Essaye ça,

 Private Sub Form_Click(... , ByVal e As ystem.Windows.Forms.MouseEventArgs) If e.Button = MouseButtons.Right And e.Button = MouseButtons.Left Then MsgBox ('Right & Left code') End If 

C’est une vieille question, mais je suis tombé sur cette question (comme par hasard, tout en faisant un clone de dragueur de mines) et j’ai eu le sentiment qu’il manquait quelque chose. Si vous souhaitez que les deux boutons soient cliqués mais que vous capturiez tout de même les clics réguliers à un seul bouton, vous pouvez procéder comme suit:

 private bool left_down; private bool right_down; private bool both_click; private void Form1_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { left_down = true; if (right_down) both_click = true; } if (e.Button == MouseButtons.Right) { right_down = true; if (left_down) both_click = true; } } private void Form1_MouseUp(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Left) { if (!right_down) { if (both_click) //Do both-click stuff here else //Do left-click stuff here both_click = false; } left_down = false; } if (e.Button == MouseButtons.Right) { if (!left_down) { if (both_click) //Do both-click stuff here else //Do right-click stuff here both_click = false; } right_down = false; } } 

Il déplace la détection vers le haut de la souris plutôt que vers le bas. Il ne fait rien jusqu’à ce que vous relâchiez les deux boutons. Cela fonctionne presque exactement comme la version Windows 7 de Minesweeper, excepté que le bouton droit seul dans l’original fonctionne lorsque la souris est enfoncée. (Je préfère honnêtement ma version). Il y a un peu de redondance dans le sens où le cas de double-clic est appelé à deux endroits, selon que vous relâchiez d’abord le bouton gauche ou droit, mais il devrait probablement s’agir d’un appel de fonction sur une seule ligne de toute façon. Bonus: vous pouvez vérifier le drapeau both_click d’ailleurs afin de tracer le carré de both_click autour de votre curseur indiquant les carrés qui seront révélés lorsque vous relâcherez les boutons.

Une autre option consiste à utiliser les MouseButtons statiques sur la classe System.Windows.Forms.Control .

Cela vous indiquera quels boutons de la souris sont actuellement appuyés afin que vous puissiez faire quelque chose comme ce qui suit:

 ((Control.MouseButtons & MouseButtons.Right) == MouseButtons.Right) && ((Control.MouseButtons & MouseButtons.Left) == MouseButtons.Left) 

Vous pouvez également consulter l’ exemple MSDN