常德水鱼村 发表于 2023-8-10 22:27:43

第六课第二个疑问,请高手解答一下。

课程地址:https://fishc.com.cn/thread-48260-1-2.html

题目中1. 编写程序:当鼠标左键和右键同时被按下时,提示“左右开弓,旗开得胜”,但如果单独点击鼠标左键或者右键均不做任何反馈。
窗口过程中
case WM_LBUTTONUP:
                if (MK_RBUTTON == wParam)
                {
                        MessageBox(hwnd, TEXT("左右开弓,旗开得胜!"), TEXT("竟然同时被按下了"), MB_OK);
                }
                return 0;

请问为什么改成case WM_LBUTTONDOWN就弹不出来了呢?我按下鼠标左键的同时按下右键,窗口过程接受到WM_LBUTTONDOWN,然后鼠标右键也是按下状态,为什么窗口不弹来呢?

case WM_LBUTTONDOWN:
                if (MK_RBUTTON == wParam)
                {
                        MessageBox(hwnd, TEXT("左右开弓,旗开得胜!"), TEXT("竟然同时被按下了"), MB_OK);
                }
                return 0;

isdkz 发表于 2023-8-10 22:28:01

问题出在鼠标消息的处理上。在你提供的代码中,你将处理鼠标按下消息的代码写在了 WM_LBUTTONDOWN 消息的处理分支中。但是,当你按下鼠标左键的同时按下右键时,窗口过程会先接收到 WM_LBUTTONDOWN 消息,然后接收到 WM_LBUTTONUP 消息。因此,当你按下鼠标左键的同时按下右键时,窗口过程会先执行 WM_LBUTTONDOWN 消息的处理分支,但此时右键还没有松开,所以 MK_RBUTTON 的状态为0,不满足条件,不会执行弹窗的代码。

要解决这个问题,你可以将处理鼠标按下消息的代码移到 WM_LBUTTONUP 消息的处理分支中,这样当鼠标左键和右键同时被按下时,窗口过程会先接收到 WM_LBUTTONDOWN 消息,然后接收到 WM_LBUTTONUP 消息,此时右键的状态已经被更新, MK_RBUTTON 的状态为非0,满足条件,会执行弹窗的代码。

以下是修改后的代码:

case WM_LBUTTONUP:
    if (MK_RBUTTON == wParam)
    {
      MessageBox(hwnd, TEXT("左右开弓,旗开得胜!"), TEXT("竟然同时被按下了"), MB_OK);
    }
    return 0;

case WM_LBUTTONDOWN:
    return 0;


这样修改后,当你按下鼠标左键的同时按下右键时,窗口会弹出提示框。而当你单独点击鼠标左键或者右键时,不会有任何反应。

陶远航 发表于 2023-8-11 09:58:51

根据您提供的代码,我看到您正在使用Windows窗口消息处理程序来实现鼠标左键和右键同时按下的功能。您尝试将判断的消息类型从WM_LBUTTONUP改为WM_LBUTTONDOWN,并且希望在鼠标左键按下的同时判断右键是否也被按下。然而,您可能会遇到问题的原因是在WM_LBUTTONDOWN消息中,右键的状态可能还没有被更新,因此无法正确判断右键是否被按下。在鼠标按下的消息中,wParam参数通常用于指示哪个鼠标按钮被按下,而不是同时按下多个按钮的情况。因此,您在WM_LBUTTONDOWN消息中判断wParam是否包含MK_RBUTTON标志可能会导致不准确的结果。为了正确地判断鼠标左键和右键是否同时按下,建议您在处理WM_LBUTTONUP消息时进行判断,因为在该消息中,wParam参数将包含所有被按下的鼠标键的标志的组合。希望这能解答您的疑问!如果您还有其他问题,请随时提问。

常德水鱼村 发表于 2023-8-11 10:40:14

陶远航 发表于 2023-8-11 09:58
根据您提供的代码,我看到您正在使用Windows窗口消息处理程序来实现鼠标左键和右键同时按下的功能。您尝试 ...

是不是相当于程序也是一步一步执行,虽然我同时按下,但是相WM_LBUTTONDOWN消息先进队列,先出来后就执行case WM_LBUTTONDOWN下面的代码了,此时MK_RBUTTON还在消息队列里面

陶远航 发表于 2023-8-11 10:43:18

常德水鱼村 发表于 2023-8-11 10:40
是不是相当于程序也是一步一步执行,虽然我同时按下,但是相WM_LBUTTONDOWN消息先进队列,先出来后就执行 ...

是的,你说得对。该程序一次执行一条消息,在这种情况下,WM_LBUTTONDOWN 消息可能在 WM_RBUTTONDOWN 消息之前被处理,因此 MK_RBUTTON 标志可能尚未更新。这就是为什么建议在 WM_LBUTTONUP 消息中同时检查两个按钮是否被按下,因为这条消息将包含同时按下的所有按钮的标志。
页: [1]
查看完整版本: 第六课第二个疑问,请高手解答一下。