在 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】:函数ScreenToClient
和ClientToScreen
在屏幕坐标系和客户端坐标系之间转换。鼠标消息以客户端相对坐标传递到窗口。
但是,您的问题不是很清楚,所以如果我没有提供您正在寻找的答案,请编辑您的问题以准确解释您在寻找什么。
【讨论】:
@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
等消息。每个窗口消息都有两个关联的参数,历史上称为lparam
和wparam
。 WM_LBUTTONUP
的 lparam
参数包含您想要的 x 和 y 坐标。您可以通过GET_X_LPARAM(lparam)
和GET_Y_LPARAM(lparam)
检索它们
Windows 支持为单个HWND
链接多个WindowProc
。这被称为"subclassing"
【讨论】:
以上是关于在 Windows 环境中,如何获取鼠标点击的坐标(相对于窗口)的主要内容,如果未能解决你的问题,请参考以下文章
c#window窗体应用程序中一个控件,如果鼠标点击控件,怎么获得此时鼠标点击处的屏幕坐标
C#+ARCENGINE,如何获取mapcontrol控件上鼠标点击位置的具体坐标?不是要鼠标的坐标
Cesium 获取鼠标点击坐标及世界坐标与弧度(经纬度)转换