问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

VB.NET想用GetWindowRECT获取某窗口的坐标,但测试结果是L,T,R,B显示都是0,0,0,0

发布网友 发布时间:2022-05-16 16:44

我来回答

2个回答

热心网友 时间:2023-11-01 17:12

很简单,原因有二。第一,VB里long是32位,但是VB.NET里是64位,Dim ksWND As Integer才对。第二,VB在API里默认传址,而VB.NET默认传值,所以API里要添加Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long,添加"ByRef" lpRect As RECT) As Integer

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long

Private Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long,byref lpRect As RECT) As Integer

Private Structure RECT
Dim Left As Integer
Dim Top As Integer
Dim Right As Integer
Dim Bottom As Integer

End Structure

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim ksWND As integer
Dim ksTitle As String
Dim winS As RECT

If TextBox1.Text <> "" Then

ksTitle = TextBox1.Text
ksWND = FindWindow(vbNullString, ksTitle)

GetWindowRect(ksWND, winS)

MsgBox("左上角坐标(" & winS.Left & "," & winS.Top & ")" & vbCrLf & "右下角坐标(" & winS.Right & "," & winS.Bottom & ")" & vbCrLf & "窗口高" & winS.Bottom - winS.Top & "窗口宽" & winS.Right - winS.Left)

Else

MsgBox("请填写窗口名称")
End If
End Sub

热心网友 时间:2023-11-01 17:13

仅提供解决思路。不提供代码,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直接就是相对于客户区的坐标(无边框)追问从另一篇复制过来的答案。

这是提供了另一种思路的方法,但依然无法解答我当前的疑问。
1、GetWindowRECT得出的结果都是0是否正常?
2、但返回值是0应该都是获取失败,既然获取失败了怎能与坐标相减呢?问题出在哪里了?
3、图2那个调用导致堆栈不对称是哪一句造成的?

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
表格列求和公式怎么设置 求和函数公式怎么输入 北京注册成立一个公司需要多少钱 北京公司都是什么 手机导航地图语音怎么下载 如何分别真金和仿金首饰 怎样区分真金和仿金首饰呢 小学生新年晚会主持人的串词!!(不要太多)急 大大后天就需要了!!!_百度... 周年晚会策划公司 奥格瑞玛传送门大厅在哪 奥格瑞玛传送门大厅怎么走 VB.NET中的对齐代码怎么写,黑体和斜体又怎么写进去菜单栏里,知道的请教哈 vb.net怎样获取同类控件名称 如何在VB.net中用程序控制鼠标移动和点击 vb.net 得到焦点 vb.net 窗体位置 vb.net 问题 用vb.net编写程序 修改和界面设计 如何用vb.net做鼠标输入软件 你好,请教一下vb.net中想实现标签自动从左到右移动如何实现,我是新手 VB.NET中右键出现新窗口的问题 vb.net 遇到多个字符串情况应该怎么处理 vb中为什么控件属性中没有right属性,因此到没有窗体的右边界任用left属性表示? m2重机枪的最远射程记录 在VB.NET中,关于top、bottom、left、right的问题 关于VB.NET中的right函数 VB.net中right字符串函数如何不能用 M2重机枪是有怎样的威力 M2重机枪的威力 m2式勃朗宁大口径重机枪的结构是怎样的? 三国志8音乐补丁 带音乐的 为什么苹果8p后置摄像头坏发彩信后置摄又能用是怎么回事 iphone8p后摄1x坏,2x可用,影响扫码吗? 纯净水生产部分资产转让合同 学前教育本科毕业论文数据可以乱编吗 资产转让 论文当中以某公司为例,写公司的内容可以瞎编吗 金融毕业论文数据可以瞎编吗 请问大学生毕业论文能胡编吗? 木炭和氧化铜在高温条件下反应生成黑色固体,正确吗,视频 木炭发生了还原反应 用木炭还原氧化铜的化学方程式 探界者550t四驱拓界版有电动尾门吗 左手大拇指上总是长很多水泡,是怎么回事? 高温下木炭还原氧化铜固体质量如何变化 大拇指疼了两天后长了个水泡,周围红肿疼痛是怎么回事? suv改装只能电动尾门使用寿命有多长? 电脑声音输出设备sc+530—n1 某同学用木炭还原氧化铜时几乎没有看到任何现象失败的原因是因为加热温度不够 左手大拇指上长了个泡泡怎么办? 改装电动尾门的好处是什么?