已解决问题

VB 发送字符到指定控件

[ 标签:vb 控件,字符,控件 ]

我想请教下,

我想向指定的外部程序发送一条消息 ,
消息是中文的比如“张三”
发送到 窗口标题是“管理员管理”类名是“#32770”上面的TEXT控件里 控件类名“Edit”控件窗口ID“1057”的控件里
由于里面有很多TEXT我要准确的发送到我指定的那个控件里该怎么写啊
求大家帮忙在百度搜索也没有一点头绪

还有:

一个窗口上有5个TEXT我要找到第三个有什么办法啊

/pch聚缘书生 回答:1 人气:20 解决时间:2009-11-19 20:59
满意答案

先找到父窗口 管理员管理 这个窗体的句柄,然后再根据父窗口句柄找出它的子窗口

最后发送一条消息就可以了

可以用下面的API函数

查找窗口可用FindWindowEx

发送消息用SendMessage

方法不止这一种 ,窗口句柄还可以通枚举的方式也可以获取

给你两个API

EnumWindows

EnumChildWindows

提问人的追问   2009-11-19 16:58
具体增么实现 怎么找到字窗口
回答人的补充   2009-11-19 17:49

代码我写好了 你按我的说法测试一下 成功后就你可以仿照这个做了

模块代码

Option Explicit

Public Declare Function EnumChildWindows Lib "user32" (ByVal hWndParent As Long, ByVal lpEnumFunc As Long, ByVal lParam As Long) As Long
Public Declare Function GetClassName Lib "user32" Alias "GetClassNameA" (ByVal hwnd As Long, ByVal lpClassName As String, ByVal nMaxCount As Long) As Long
Public Declare Function SendMessage& Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long

Public Const WM_SETTEXT = &HC


Public TextHwnd(5) As Long
Public EnumCount As Integer

Public Function WinProc(ByVal hwnd As Long, ByVal lParam As Long) As Long
Dim tmpStr As String
Dim sLen As Integer
sLen = Len("ThunderRT6TextBox")
tmpStr = Space(sLen)
GetClassName hwnd, tmpStr, sLen + 1
If InStr(tmpStr, "ThunderRT6TextBox") > 0 Then
TextHwnd(EnumCount) = hwnd
End If
EnumCount = EnumCount + 1
WinProc = 1
End Function

窗体代码

Private Sub Command1_Click()
Dim t As Long
Dim c As Long
Dim tmp As String

t = FindWindow(vbNullString, "我的测试窗口")

If t <= 0 Then MsgBox "false"
EnumCount = 0
EnumChildWindows t, AddressOf WinProc, 0

tmp = “asdfqwerdfg”
SendMessage TextHwnd(0), WM_SETTEXT, 0, ByVal tmp
tmp = "123456789"
SendMessage TextHwnd(1), WM_SETTEXT, 0, ByVal tmp

End Sub

然后再新建一个工程,w做为测试窗体,窗体上放两个TEXT控件。窗体的名称Caption设置为"我的测试窗口",然后将这个空程序生成EXE,生成完成后运行这个窗体名叫 我的测试窗口 的EXE

然后再运行上面的那个工作,点击按钮,程序会自动搜索 窗体名为 “我的测试窗口”的EXE文件的窗口,并且设置这个窗口里的文本框一和文本框二的内容

提问人的追问   2009-11-19 19:05

在此先谢谢你能够帮助我

但是我把你的代码测试了一下可以 也有一些地方不懂

如果窗口上有三个TEXT就不能准确发送了

还有就是有三个按钮 三个TEXT这个就会无效了

在此请教

回答人的补充   2009-11-19 19:29

呵呵 刚才疏忽了

把这句代码写在IF判断里边

因为EnumCount是做数组下标用的

EnumCount = EnumCount + 1

原句

If InStr(tmpStr, "ThunderRT6TextBox") > 0 Then
TextHwnd(EnumCount) = hwnd
End If
EnumCount = EnumCount + 1

改成下面这样就OK了

If InStr(tmpStr, "ThunderRT6TextBox") > 0 Then
TextHwnd(EnumCount) = hwnd

EnumCount = EnumCount + 1
End If

只有找到一个TEXT文本框的时候 才让数组的下标加1,不然这个句柄就不会保存到数组下标为0 和 1 里面了

提问人的追问   2009-11-19 20:31
还是没有搞懂  你可以加我QQ吗?      370907531  非常感激
回答采纳率:47.4% 2009-11-19 16:51
评价答案
  • 是否解决问题(参与评价0次)
  • 5
  • 0
  • 0
  • 是否原创答案(参与评价0次)
  • 5
  • 0
/pch聚缘书生的感言:
非常好

相关内容