获取句柄问题.

qiaolei321 2010-09-14 12:05:47
通过引用外部DLL"User32.dll"可以调用findWindow()函数来抓取窗体的句柄.
请问如何抓取这个窗体中所有控件的句柄?
比如A窗体有两个TextBox.
我先抓取A窗体的句柄:
IntPtr formIntPtr = FindWindow(null, "a");
然后通过findWindowEx()函数来抓取控件的句柄:
IntPtr controlPtr = FindWindowEx(formIntPtr, IntPtr.Zero, "WindowsForms10.EDIT.app.0.b7ab7b", "");
问题就出在这,我用SPY++抓了两个TextBox的句柄,它们句柄不一样,但类名却一样.都是"WindowsForms10.EDIT.app.0.b7ab7b"
已至于我抓的永远是第2个TextBox,请问高手们如何解决呢?
...全文
175 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
都吃饭去了?..
继续在线等.
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
楼上两位能举个例子说明下吗?
ZengHD 2010-09-14
  • 打赏
  • 举报
回复
使用EnumWindows,再加上一个GetWindowRect,用于判断文本框的坐标,应该就可以找到你要处理的文本框了
足球中国 2010-09-14
  • 打赏
  • 举报
回复
FindWindowEx 不一定能找到。
enumwindows试试
ZengHD 2010-09-14
  • 打赏
  • 举报
回复
如果有两个文本框,使用FindWindowEx是不行的,因为你不知道他取的是哪个文本框
bloodish 2010-09-14
  • 打赏
  • 举报
回复
FindWindowEx(formIntPtr, IntPtr.Zero, "WindowsForms10.EDIT.app.0.b7ab7b", "");

第二个参数,传入你要的TextBox的Handle.
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
在线等啊!
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
问题解决,谢谢ZengHD.
Matrix_Designer 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用楼主 qiaolei321 的回复:]
IntPtr controlPtr = FindWindowEx(formIntPtr, IntPtr.Zero, "WindowsForms10.EDIT.app.0.b7ab7b", "");
[/Quote]

换成下面的试试:
IntPtr controlPtr = FindWindowEx(formIntPtr, IntPtr.Zero, "WindowsForms10.EDIT.app.0.b7ab7b", null);

如果还不行可以尝试在获取了controlPtr再使用下面语句获取另一个控件的句柄:
controlPtr = FindWindowEx(formIntPtr, controlPtr, "WindowsForms10.EDIT.app.0.b7ab7b", null);
ZengHD 2010-09-14
  • 打赏
  • 举报
回复
完整的思路应该是:
用FindWindow找到目标窗口,用EnumChildWindows遍历目标窗所有的控件,用GetClassName判断是否为文本框,用GetWindowRect获得文本框的位置,就能找到你要的文本框了

额外送你一个更简单的API WindowFromPoint
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
谢谢楼上,我再去研究研究.
ZengHD 2010-09-14
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 qiaolei321 的回复:]

能否有根据某个窗体的句柄获得该窗体下所有控件句柄的函数呢?
[/Quote]
EnumChildWindows
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
能否有根据某个窗体的句柄获得该窗体下所有控件句柄的函数呢?
ZengHD 2010-09-14
  • 打赏
  • 举报
回复
EnumChildWindows()
GetClassName()
qiaolei321 2010-09-14
  • 打赏
  • 举报
回复
我看了
这个是枚举所有窗体然后调用声明的回调函数,
问题是我即使获得了所有窗体的句柄,我如何判断他是TEXTBOX呢?
ZengHD 2010-09-14
  • 打赏
  • 举报
回复
关键字都经你了,你为什么不GOOGLE一下呢:EnumWindows

111,129

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧