[原创分享]VFP获取第三方窗体的控件信息(句柄,窗口ID,进程ID,类名,标题)

十豆三 2010-02-09 04:12:10
本人水平太菜,不要见笑,如果欠佳之处,请帮忙指出。
如果您有更合理、更简洁的代码,希望您能与大家分享,谢谢。

Declare Long FindWindow In WIN32API String lpClassName,String lpWindowName	&&函数返回与指定字符创相匹配的窗口类名或窗口名的最顶层窗口的窗口句柄。这个函数不会查找子窗口。
Declare Long FindWindowEx In WIN32API Long hwndParent,Long hwndChildAfter,String @lpszClass,String @lpszWindow &&函数获得一个窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数查找子窗口,从排在给定的子窗口后面的下一个子窗口开始。在查找时不区分大小写。
Declare Long GetClassName In WIN32API Long HWnd,String @lpClassName,Long nMaxCount &&获得指定窗口所属的类的类名
Declare Long SendMessage In WIN32API Long HWnd,Long Msg,Long wParam,String @IParam &&函数将指定的消息发送到一个或多个窗口。此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回。而函数PostMessage不同,将一个消息寄送到一个线程的消息队列后立即返回。
Declare Long GetDlgCtrlID In WIN32API Long hwndCtl &&通过句柄得到控件ID
Declare Long GetWindowThreadProcessId In WIN32API Long HWnd,Long @lpdwProcessId &&通过窗口句柄返回其进程Id
#Define WM_GETTEXT 0x000D

Create Cursor T1 (序号 I Not Null Autoinc,父窗口句柄 I,窗口句柄 I,窗口ID I,进程ID I,窗口类名 C(100),标题文本 C(254))
******
Declare Long WinExec In kernel32 String lpCmdLine,Long nCmdShow &&运行指定的程序
=WinExec("C:\WINDOWS\system32\calc.exe",1) &&以 计算器 为例
m.lcCaption="计算器" &&要查找窗口的标题,这里以 计算器为例
******

Local m.lnHandle,m.lcClassName,m.lcText,m.lnClassLen,m.lnTextLen,m.lnProcessId,m.lnChildHandle,m.lnMaxXH
m.lnHandle=FindWindow(Null,m.lcCaption)
If m.lnHandle>0
Store Replicate(Chr(0),255) To m.lcClassName,m.lcText
m.lnClassLen=GetClassName(m.lnHandle,@m.lcClassName,255)
m.lnTextLen=SendMessage(m.lnHandle,WM_GETTEXT,255,@m.lcText)
m.lnProcessId=0
=GetWindowThreadProcessId(m.lnHandle,@m.lnProcessId)
Insert Into T1 (父窗口句柄,窗口句柄,窗口ID,进程ID,窗口类名,标题文本) Values (0,m.lnHandle,0,m.lnProcessId,Left(m.lcClassName,m.lnClassLen),Left(m.lcText,m.lnTextLen)) &&顶层窗口没有ID
Store 0 To m.lnChildHandle,m.lnMaxXH
Do While .T.
Select * Into Cursor T2 From T1 Where 序号>m.lnMaxXH
If _Tally>0
Release m.lnMaxXH
Select Max(序号) As MaxXH Into Array lnMaxXH From T1
Select T2
Scan
m.lnHandle=窗口句柄
m.lnChildHandle=0
Do While .T.
m.lnChildHandle=FindWindowEx(m.lnHandle,m.lnChildHandle,Null,Null)
If m.lnChildHandle<>0
Store Space(255) To m.lcClassName,m.lcText
m.lnClassLen=GetClassName(m.lnChildHandle,@m.lcClassName,255)
m.lnTextLen=SendMessage(m.lnChildHandle,WM_GETTEXT,255,@m.lcText)
m.lcCtrlId=GetDlgCtrlID(m.lnChildHandle)
m.lnProcessId=0
=GetWindowThreadProcessId(m.lnHandle,@m.lnProcessId)
Insert Into T1 (父窗口句柄,窗口句柄,窗口ID,进程ID,窗口类名,标题文本) Values (m.lnHandle,m.lnChildHandle,m.lcCtrlId,m.lnProcessId,Left(m.lcClassName,m.lnClassLen),Left(m.lcText,m.lnTextLen))
Loop
Else
Exit
Endif
Enddo
Endscan
Else
Exit
Endif
Enddo
Select T1
Locate
Browse
Else
Messagebox("没有找到 ["+m.lcCaption+"] 窗体!"+Space(5),48,"信息提示")
Endif
Clear Dlls
Release m.lnHandle,m.lcClassName,m.lcText,m.lnClassLen,m.lnTextLen,m.lnProcessId,m.lnChildHandle,m.lnMaxXH
...全文
900 21 打赏 收藏 举报
写回复
21 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
我是小数位 2010-04-19
  • 打赏
  • 举报
回复
你是菜的话,那我们应该是种子,还没发芽哦!
jxliu443119186 2010-03-24
  • 打赏
  • 举报
回复
呵呵。看完帖子发现:勋章是真的。
十豆三 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 foxhengxing 的回复:]
怎么格式全乱了?换行符呢
[/Quote]

暂不用你的 CodeToUBB 了。
十豆三 2010-03-22
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 foxhengxing 的回复:]
怎么格式全乱了?换行符呢
[/Quote]

论坛升级后就乱了,CSDN又改了回复框,晕死
FOXHENGXING 2010-03-22
  • 打赏
  • 举报
回复
怎么格式全乱了?换行符呢
sdjnjdxc 2010-03-11
  • 打赏
  • 举报
回复
水平+热心=高人
Andy__Huang 2010-03-09
  • 打赏
  • 举报
回复
路过................
dawugui 2010-03-05
  • 打赏
  • 举报
回复
看不懂,友情支持.......
lblclly 2010-03-03
  • 打赏
  • 举报
回复
引用 6 楼 apple_8180 的回复:
引用 3 楼 mdsorphen 的回复:版主,你实在是太过谦了。

的确我也是学习者,真正的高手很少出现在这里。
像 dkfdtf 这样的高手也很少来了。他的API功底非常高。


你们两位确实都是高手,dkfdtf 对API太熟了.
bdx808 2010-02-25
  • 打赏
  • 举报
回复
引用 11 楼 zxd518518 的回复:
版主
热心、水平高,令人佩服。我们菜鸟学习深受启发。

顶一下
zxd518518 2010-02-22
  • 打赏
  • 举报
回复
版主
热心、水平高,令人佩服。我们菜鸟学习深受启发。
yrt888 2010-02-11
  • 打赏
  • 举报
回复
学习一下好资料,预祝版主新年快乐!
lt5225262 2010-02-10
  • 打赏
  • 举报
回复
SpyLite已经上传至下面的地址
http://www.access911.net/CSDN/FileDescription.asp?id=12&mdb=2010-2-10&mode=1
十豆三 2010-02-10
  • 打赏
  • 举报
回复
引用 4 楼 lt5225262 的回复:
大哥,代码运行后主窗口的窗口ID为:0,但用SpyLite24.exe测得主窗口的窗口ID不为0


Insert Into T1 (父窗口句柄,窗口句柄,窗口ID,进程ID,窗口类名,标题文本) Values (0,m.lnHandle,0,m.lnProcessId,Left(m.lcClassName,m.lnClassLen),Left(m.lcText,m.lnTextLen))


主窗口ID我手动写的0,没有转换。
因为顶层窗口没有ID,不知道SpyLite取得的顶层窗口ID是什么。
十豆三 2010-02-10
  • 打赏
  • 举报
回复
引用 3 楼 mdsorphen 的回复:
版主,你实在是太过谦了。


的确我也是学习者,真正的高手很少出现在这里。
像 dkfdtf 这样的高手也很少来了。他的API功底非常高。
taohua300 2010-02-10
  • 打赏
  • 举报
回复
这贴必须顶!
十豆三 2010-02-10
  • 打赏
  • 举报
回复
引用 8 楼 lt5225262 的回复:
SpyLite已经上传至下面的地址
http://www.access911.net/CSDN/FileDescription.asp?id=12&mdb=2010-2-10&mode=1


我有 SpyLite ,我的意思是 SpyLite 取出的顶层窗口的 ID 不知道是什么?因为顶层窗口没有ID

当然子窗口和子控件ID是与我代码取出的一样。

用 SpyLite 取自已(SpyLite) ,得到的窗口ID就是0
lt5225262 2010-02-09
  • 打赏
  • 举报
回复
大哥,代码运行后主窗口的窗口ID为:0,但用SpyLite24.exe测得主窗口的窗口ID不为0
mdsorphen 2010-02-09
  • 打赏
  • 举报
回复
版主,你实在是太过谦了。
lc_apple 2010-02-09
  • 打赏
  • 举报
回复
引用 1 楼 acmain_chm 的回复:
引用本人水平太菜,不要见笑,如果欠佳之处,请帮忙指出。本人水平是菜中菜

我只能是菜根了!
加载更多回复(1)
相关推荐
发帖
VFP

2573

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2010-02-09 04:12
社区公告
暂无公告