下面的过程序是用来监控串口扫描仪的输入,然后输出到另外一个当前激活窗口的文本框处。
现在的问题是,尽管当前激活窗口的文本框已经获得焦点(可以看到光标在文本框处闪烁),但是仍然需要用鼠标点击一下文本框,否则不能把扫描仪的输出显示到文本框。
请问如何不用鼠标点击,就能直接输出到文本框?Private Sub MSComm1_OnComm()
Dim Pos As POINTAPI
Dim hResult As Long
Dim HWnd As Long
Dim str As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
'获得当前光标位置
hResult = GetCursorPos(Pos)
'获得光标对应窗口的句柄
HWnd = WindowFromPoint(Pos.x, Pos.y)
str = MSComm1.Input
'当激活窗口不是监控程序所处的窗口时,输出扫描仪输入
If HWnd <> frmScanner.HWnd Then
For i = 1 To Len(str)
SendMessage HWnd, WM_IME_CHAR, Asc(Mid(str, i, 1)), 1
Next
End If
End Select
End Sub
现在的问题是,尽管当前激活窗口的文本框已经获得焦点(可以看到光标在文本框处闪烁),但是仍然需要用鼠标点击一下文本框,否则不能把扫描仪的输出显示到文本框。
请问如何不用鼠标点击,就能直接输出到文本框?Private Sub MSComm1_OnComm()
Dim Pos As POINTAPI
Dim hResult As Long
Dim HWnd As Long
Dim str As String
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
'获得当前光标位置
hResult = GetCursorPos(Pos)
'获得光标对应窗口的句柄
HWnd = WindowFromPoint(Pos.x, Pos.y)
str = MSComm1.Input
'当激活窗口不是监控程序所处的窗口时,输出扫描仪输入
If HWnd <> frmScanner.HWnd Then
For i = 1 To Len(str)
SendMessage HWnd, WM_IME_CHAR, Asc(Mid(str, i, 1)), 1
Next
End If
End Select
End Sub
你可以用当前鼠标坐标来判断是不是在frmScanner这个窗体上啊。
GetCursoPos返回的只是是鼠标的坐标。
有两个程序,scanMonitor.exe 和 dbApp.exe。
dbApp.exe是一个数据库应用程序,有一个文本框,用于条形码的输入。
scanMonitor是串口扫描枪的接口程序,在后台运行,当扫描枪的有输入的时候,把条形码输入到dbApp.exe的文本框上。
现在的问题在于,dbApp.exe上的文本框虽然获得焦点,可以看看光标(|)在文本框闪烁,但是一定要用鼠标点一下文本框,条形码才能输出到文本框。
我想实现的是,只要dbApp.exe或者其他应用程序上的文本框获得焦点,不需要鼠标点,即可把条形码输到文本框上。以上描述相当罗嗦,希望你能看得明白,呵呵
用鼠标点击是为了通过WindowFromPoint获得文本框的句柄,现在想实现的就是不用鼠标点击也能获得激活文本框的句柄。“麻烦啊,直接捕捉到dbApp.exe程式文本框的句柄,只要检测到是扫描枪事件时,把读取得内容直接指定到该句柄就行了。”
如何能获得激活文本框的句柄呢?
我原来是想通过以下API来获得句柄的:
getCaretPos --返回光标的Client Coodinate
clientToSceen --把Client Coodinate转化为Screen Coordinate
WindowFromPoint --从Screen Coordinate获得句柄
但是发现clientToScreen是需要提供hwnd参数的,结果变成一个循环。