下面的过程序是用来监控串口扫描仪的输入,然后输出到另外一个当前激活窗口的文本框处。
现在的问题是,尽管当前激活窗口的文本框已经获得焦点(可以看到光标在文本框处闪烁),但是仍然需要用鼠标点击一下文本框,否则不能把扫描仪的输出显示到文本框。
请问如何不用鼠标点击,就能直接输出到文本框?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

解决方案 »

  1.   

    你这一句HWnd = WindowFromPoint(Pos.x, Pos.y)有问题吧,因为当鼠标指向frmScanner上某个控件时,它获得的是这个控件的hwnd而不是整个窗体的hwnd,你再用If HWnd <> frmScanner.HWnd Then就不对了。
    你可以用当前鼠标坐标来判断是不是在frmScanner这个窗体上啊。
      

  2.   

    frmScanner是监控程序所在的窗口,If HWnd <> frmScanner.HWnd 是指扫描器的输入不能输出在监控程序本身。我原来的表述有点问题,我实际需要获得的是闪烁光标(|)的坐标,而不是鼠标的坐标。
    GetCursoPos返回的只是是鼠标的坐标。
      

  3.   

    happy_sea:你好!Screen.ActiveControl.hWnd 好像不行。我把问题重新描述一下:
    有两个程序,scanMonitor.exe 和 dbApp.exe。
    dbApp.exe是一个数据库应用程序,有一个文本框,用于条形码的输入。
    scanMonitor是串口扫描枪的接口程序,在后台运行,当扫描枪的有输入的时候,把条形码输入到dbApp.exe的文本框上。
    现在的问题在于,dbApp.exe上的文本框虽然获得焦点,可以看看光标(|)在文本框闪烁,但是一定要用鼠标点一下文本框,条形码才能输出到文本框。
    我想实现的是,只要dbApp.exe或者其他应用程序上的文本框获得焦点,不需要鼠标点,即可把条形码输到文本框上。以上描述相当罗嗦,希望你能看得明白,呵呵
      

  4.   

    麻烦啊,直接捕捉到dbApp.exe程式文本框的句柄,只要检测到是扫描枪事件时,把读取得内容直接指定到该句柄就行了。
      

  5.   

    "当串口有扫描枪数据来的时候先向那个文本框发送鼠标点击的消息试试行不行"
    用鼠标点击是为了通过WindowFromPoint获得文本框的句柄,现在想实现的就是不用鼠标点击也能获得激活文本框的句柄。“麻烦啊,直接捕捉到dbApp.exe程式文本框的句柄,只要检测到是扫描枪事件时,把读取得内容直接指定到该句柄就行了。”
    如何能获得激活文本框的句柄呢?
    我原来是想通过以下API来获得句柄的:
    getCaretPos --返回光标的Client Coodinate
    clientToSceen --把Client Coodinate转化为Screen Coordinate
    WindowFromPoint --从Screen Coordinate获得句柄
    但是发现clientToScreen是需要提供hwnd参数的,结果变成一个循环。