vb 获取某窗口内相对坐标

打开某个程序,有些程序上面有标题和边框,有些程序没有标题和边框(例如全屏游戏那类),鼠标移动到那程序上面时,怎样获取当前鼠标在那程序的相对坐标?网上搜索了下,很多都是包括... 打开某个程序,有些程序上面有标题和边框,有些程序没有标题和边框(例如全屏游戏那类),

鼠标移动到那程序上面时,怎样获取当前鼠标在那程序的相对坐标?

网上搜索了下,很多都是包括标题和边框的相对坐标。

如何在label中分别显示

包括标题和边框时的相对坐标

没有标题和边框的相对坐标

代码怎样写?
展开
 我来答
swx1995
2010-05-24 · TA获得超过2696个赞
知道大有可为答主
回答量:1477
采纳率:0%
帮助的人:2365万
展开全部
仅提供解决思路。不提供代码,API请自己找齐。
这样以后你遇到类似问题可以自行解决。
以下为思路,看不懂请自己琢磨相关逻辑和API作用。

1.GetCursorPos 获取鼠标坐标 设获得的坐标为t_pos
2.WindowFromPoint 获取t_pos坐标指向的窗体 设获得的窗体句柄为hwnd
3.GetWindowRect 根据hwnd获取对应窗体坐标。此时t_pos与窗体坐标相减可以初步计算得相对坐标(包括标题栏等),设此时计算得坐标为pos
4.GetWindowLong 获取样式,判断是否存在WS_BORDER(是否有边框)
方法:
假设GetWindowLong,获取的样式保存在style中,则if style or WS_BORDER=style then 存在WS_BORDER else 不存在WS_BORDER

如果存在WS_BORDER即有边框,则再调用GetSystemMetrics得到边框和标题栏宽度高度,然后pos与之相减(减掉边框)得到坐标相对于客户区的坐标
如果不存在WS_BORDER,则pos直接就是相对于客户区的坐标(无边框)
百度网友b8d7be837
2010-05-24 · TA获得超过819个赞
知道小有建树答主
回答量:865
采纳率:0%
帮助的人:863万
展开全部
borderstyle属性可以改变窗体边框和标题:
0-无边框
1-含控制菜单、标题栏、最大化和最小化按钮,窗体大小不能拖动改变。
2-默认,窗体可以随意拖动改变大小。
3-固定大小,有控制菜单和标题栏,但没有最大化、最小化按钮。
4-固定大小,只有关闭按钮,并用缩小字体显示标题栏。
5-可变大小,只有关闭按钮,并用缩小字体显示标题栏。

在窗体的mousemove事件中x、y分别代表鼠标在窗体中的x、y坐标值。
Private Sub Form_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
label=x","y
End Sub

如果你想要加上标题栏那部分,那就在y上加上标题栏的宽度就可以了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dr_zxp
2010-05-24 · TA获得超过861个赞
知道小有建树答主
回答量:765
采纳率:100%
帮助的人:855万
展开全部
窗体中加入一个Timer,代码如下:

Private Declare Function GetWindowPlacement Lib "user32" (ByVal hwnd As Long, lpwndpl As WINDOWPLACEMENT) As Long
Private Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long
Private Type POINTAPI
x As Long
y As Long
End Type
Private Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type
Private Type WINDOWPLACEMENT
Length As Long
flags As Long
showCmd As Long
ptMinPosition As POINTAPI
ptMaxPosition As POINTAPI
rcNormalPosition As RECT
End Type

Private Sub Form_Load()
Timer1.Interval = 15
End Sub

Private Sub Timer1_Timer()
Dim pt As POINTAPI
Dim wfp As WINDOWPLACEMENT
Dim myhwnd As Long
Dim r As Long
GetCursorPos pt
myhwnd = WindowFromPoint(pt.x, pt.y)
r = GetWindowPlacement(myhwnd, wfp)

Cls
Print "Current hWnd:" & myhwnd
Print "X:" & pt.x - wfp.rcNormalPosition.Left
Print "Y:" & pt.y - wfp.rcNormalPosition.Top
End Sub

该代码可以得到鼠标在所指的窗体中的相对坐标

上面的myhwnd为窗体句柄。

当然除了WindowFromPoint函数,你也可以使用getwindowlong或者getforegruondwindow等函数获得窗体句柄。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
微标防伪防窜货标签定制

2010-05-24 · TA获得超过2016个赞
知道大有可为答主
回答量:1512
采纳率:87%
帮助的人:551万
展开全部
其实得到窗体的句柄就什么都得到了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式