在 Windows 环境中,如何获取鼠标点击的坐标(相对于窗口)

Posted

技术标签:

【中文标题】在 Windows 环境中,如何获取鼠标点击的坐标(相对于窗口)【英文标题】:How do you get the coordinates (with respect to a window) of a mouse click, in a Windows environment 【发布时间】:2011-02-04 18:54:41 【问题描述】:

对于 Windows 环境窗口 HWND,如何获取鼠标在该窗口上单击的坐标?

编辑:抱歉含糊不清。我有一个 HWND 对象,我正在对其进行一些图像分析。我希望能够单击 HWND 对象中显示的图像上的一个点并打印出我单击的 x、y 坐标,以及 x 和 y 坐标处图像的一些属性

【问题讨论】:

【参考方案1】:

函数ScreenToClientClientToScreen 在屏幕坐标系和客户端坐标系之间转换。鼠标消息以客户端相对坐标传递到窗口。

但是,您的问题不是很清楚,所以如果我没有提供您正在寻找的答案,请编辑您的问题以准确解释您在寻找什么。

【讨论】:

@apple 您需要处理 WM_LBUTTONDOWN 和/或 WM_LBUTTONUP 消息。当然,如果您使用的是 MFC 或 WinForms 或 VCL 或 wxWidgets 或 Qt 等,那么这些将为您包装好。你为什么不告诉我们更多。我们无法真正猜测您在做什么。语言、框架、应用类型等细节会有所帮助。 这是 windows c++,如问题的标签所示。而已。一个函数更新窗口视频 WNDCLASS.lpfnWndProc。我没有使用 QT 或 wxWidgets 之类的。不过,也许我误解了你的要求 @apple “window video WNDCLASS.lpfnWndProc”是什么意思?你有一个带有 switch 语句的 WndProc 吗?您是否尝试过处理我提到的消息。【参考方案2】:

David Heffernan 已经给出了基本答案。为了更完整,这是完整的过程:

每个窗口都有一个唯一的HWND,它是一个内部数据结构的句柄。除其他外,该结构包含一个指向WindowProc(窗口过程)的函数指针。这个窗口过程负责处理WM_LBUTTONUP等消息。每个窗口消息都有两个关联的参数,历史上称为lparamwparamWM_LBUTTONUPlparam 参数包含您想要的 x 和 y 坐标。您可以通过GET_X_LPARAM(lparam)GET_Y_LPARAM(lparam) 检索它们

Windows 支持为单个HWND 链接多个WindowProc。这被称为"subclassing"

【讨论】:

以上是关于在 Windows 环境中,如何获取鼠标点击的坐标(相对于窗口)的主要内容,如果未能解决你的问题,请参考以下文章

c#window窗体应用程序中一个控件,如果鼠标点击控件,怎么获得此时鼠标点击处的屏幕坐标

C#+ARCENGINE,如何获取mapcontrol控件上鼠标点击位置的具体坐标?不是要鼠标的坐标

Cesium 获取鼠标点击坐标及世界坐标与弧度(经纬度)转换

QT如何获取窗口外的鼠标点击事件,或者鼠标坐标

三维坐标系下,python如何获取鼠标点击事件,返回三维坐标x,y,z?

QT中如何获取QTableView当前行的坐标