扩展鼠标单击事件 - C.

时间:2010-02-15 17:15:30

标签: c winapi

目前我正在检测鼠标点击的x和y位置,将其存储在中并通过消息框显示。

我希望能够读取是否按下另一个键盘键,例如Shift或Control按钮。

在MSDN上查找我发现了以下信息:

  

wParam表示是否各种各样   虚拟键已关闭。这个参数   可以是以下一种或多种   值。

     

MK_CONTROL CTRL键已关闭。

     

MK_MBUTTON鼠标中键是   下来。

     

MK_RBUTTON鼠标右键是   下来。

     

MK_SHIFT SHIFT键已关闭。

     

MK_XBUTTON1 Windows 2000 / XP:第一个   X按钮已关闭。

     

MK_XBUTTON2 Windows 2000 / XP:The   第二个X按钮已关闭。

我遇到的问题是我不确定如何为每个参数存储wParam的结果并使用它们,就像我必须通过消息框显示它们一样。

到目前为止,我的进展如下:

LRESULT CALLBACK WindowFunc(HWND hMainWindow, UINT message,
    WPARAM wParam, LPARAM lParam)
{
 POINTS mouseXY;
 WCHAR buffer[256];

    // Act on current message
    switch(message)    
    {
    case WM_DESTROY:
        PostQuitMessage(0);
        break;
 case WM_LBUTTONUP:
  // Get mouse x, y
  mouseXY = MAKEPOINTS(lParam);

  // Output the co-ordinates
  swprintf(buffer, 255, L"x = %d, y = %d", mouseXY.x, mouseXY.y);
  MessageBox(0, buffer, L"Mouse Position", MB_OK);
  break;
    default:
        return DefWindowProc(hMainWindow, message, wParam, lParam);
    }
    return 0;
}

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

您可以使用GetAsyncKeyState查找大多数按钮的状态:

SHORT lshift = GetAsyncKeyState(VK_LSHIFT);
SHORT rshift = GetAsyncKeyState(VK_RSHIFT);
// etc...

Here描述了GetKeyState和GetAsyncKeyState之间的区别。

您还可以使用GetKeyboardState

BYTE keyboardState[256];
GetKeyboardState(keyboardState);

答案 1 :(得分:1)

不同的虚拟键在wParam中进行OR运算。要检查单个值,您必须将它们取出(想想基本位操作)。

示例:

swprintf(buffer, 255, L"x = %d, y = %d, Shift = %s, Ctrl = %s",
         mouseXY.x, mouseXY.y,
         wParam & MK_SHIFT ? L"yes" : L"no",
         wParam & MK_CONTROL ? L"yes" : L"no");