我正在重新制作Windows Minesweeper(来自XP),他们所包含的内容是,如果您同时使用鼠标左键单击带有尽可能多标记的数字,则会显示其他所有隐藏的图块在那个数字附近。
我很难说在同一时间同时按下鼠标左键和右键...我正在使用一对bool,每个按钮一个,包含OnMouseDown和OnMouseUp事件但是如果两个按钮在完全相同的时间(或非常接近)被点击,然后只有一个MouseDown事件关闭而另一个没有...如果你点击并按住其中一个按钮然后点击并按住另一个,代码工作虽然。
有没有更好的方法来检测这种“双重”点击?
修改
好吧,小故事为什么我把它搞砸了(它一直都有效)。
我有一个运行Windows 7的macbook pro。对于那些不知道的人,macbook pro只有一个鼠标按钮栏,通常会留下点击,但是如果你放下2个手指就会点击右键,所以你不能两者兼顾(也没办法中间点击)。所以我正在构建我的应用程序并将其发送给我的朋友,他告诉我它不起作用,所以我发布了这个问题。我终于决定在我的另一台笔记本电脑上试用它,带有2个鼠标按键的戴尔XPS ......一旦它在那里工作,我将它传递给其他朋友,他们确认它有效。我不知道我的第一个朋友是如何搞砸了,但故事的道德是不要买任何苹果。至少那是我得到的道德。
答案 0 :(得分:7)
为左右按钮创建一个类boolean变量,默认为false。当鼠标按下事件触发时,将变量设置为true并检查两者是否都为真。当鼠标向上触发时,将变量设置为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;
}
答案 1 :(得分:2)
完整代码:
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 triggering 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;
}
答案 2 :(得分:0)
试试这个,
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
答案 3 :(得分:0)
这是一个古老的问题,但我偶然发现了这个问题(巧合的是,在做扫雷克隆时也是如此),并感到它遗失了一些东西。如果您想要按两次按钮,但仍然可以捕获常规的单键按钮,则可以执行以下操作:
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;
}
}
它将检测移动到鼠标向上而不是鼠标按下。在释放两个按钮之前,它不会执行任何操作。这几乎与扫雷的Windows 7版本完全相同,只是单独的右按钮在鼠标按下操作。 (老实说,我更喜欢我的版本)。有一些冗余,因为双击情况在两个地方被调用,这取决于你是先释放左按钮还是右按钮,但这应该是单线函数调用无论如何。奖励:您可以从其他地方查看both_click
标志,以便在光标周围绘制提示方框,显示释放按钮时将显示哪些方块。
答案 4 :(得分:0)
另一种选择是在 System.Windows.Forms.Control 类
上使用静态 MouseButtons这将告诉您当前按下了哪些鼠标按钮,以便您可以执行以下操作:
uint8_t GyroReadByte(uint8_t addr) {
GPIOE->BSRR = (1 << 19);
GPIOE->BSRR = (1 << 24);
volatile uint8_t val;
//addr |= R_BIT;
GyroSendByte(addr); //val = GyroTransferByte(addr);
val = GyroTransferByte(DUMMY);
GPIOE->BSRR = (1 << 3);
GPIOE->BSRR = (1 << 8);
return val;
}
void GyroSendByte(uint8_t data) {
GPIOE->BSRR = (1 << 19);
volatile uint8_t * const ptr = (volatile uint8_t *)&SPI1->DR;
while (!(SPI1->SR & SPI_SR_TXE)) {}
;
*ptr = data;
GPIOE->BSRR = (1 << 3);
}
您还可以查看MSDN example
答案 5 :(得分:0)
我在Click事件中使用了以下代码。
if ((Control.MouseButtons == MouseButtons.Right) || (Control.MouseButtons == MouseButtons.Left))
当只按下一个鼠标按钮时,“ Control.MouseButton”将采用“ MouseButtons.None”的值
但是当同时按下鼠标左键和右键时,“ Control.MouseButton”将采用“ MouseButtons.Right”或“ MouseButtons.Left”的值,具体取决于第一次/最后一次按下(取决于持续多长时间)时间是在按下左右按钮之间)