VB编写应用程序,将串口数据转换为键盘口的输出

天若海愚 2012-11-28 11:42:09
通过一台计算机的串口向另一台计算机的记事本中输入数据。也就是说主机A不断通过自己的串口发数据,这些数据以主机B键盘的形式显示在主机B的记事本上。

也就是主机B先接收串口数据,然后转为为键盘的输出,再在记事本上显示出来。
...全文
814 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
sosoben 2013-01-14
  • 打赏
  • 举报
回复
首先,你的编程环境是什么? 我的是XP SP2, vbsp6 (需要mscomm控件) , win7的话用管理员身份运行试试 其次,你查找下 Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long 这句有没有定义错 再次,直接运行编译好的程序会出现这样的问题吗? 我在多部机调试过无问题(要把mscomm控件复制到system32文件夹),win7只需要管理员权限
引用 17 楼 hanson4270 的回复:
引用 5 楼 sosoben 的回复:Public Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long Public Declare Function Send……
hanson4270 2013-01-12
  • 打赏
  • 举报
回复
引用 5 楼 sosoben 的回复:
Public Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long Public Declare Function SendMessage Lib "user32……
大侠,我用了你的程序,但是显示“编译错误,函数或接口标记为限制的,或函数使用了visual basic中不支持的自动类型”,错误的句子是 hwnd = windowfrompoint(pos.x,pos.y),hwnd处高亮。请教是怎么回事,谢谢!
天若海愚 2012-11-30
  • 打赏
  • 举报
回复
引用 12 楼 sosoben 的回复:
引用 11 楼 TianRuoHaiYu 的回复:
引用 10 楼 sosoben 的回复:引用 6 楼 of123 的回复:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Lo……


你好。
能不能给我用VB给我编一下呢,这个今天下午就要用了,VB我才学没有多长时间,上面的一些代码我不是很懂的。
界面的设计如下图就可以了: 按下《确定》按钮,通过串口传来的数据就可以显示在记事本上了

sosoben 2012-11-30
  • 打赏
  • 举报
回复
引用 15 楼 TianRuoHaiYu 的回复:
引用 12 楼 sosoben 的回复:引用 11 楼 TianRuoHaiYu 的回复: 引用 10 楼 sosoben 的回复:引用 6 楼 of123 的回复: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, By……
没空新做哦 我上传了 一个类似的,都是抄来抄去的, 你在 HIDONE 过程中改改 端口,波特率 就可以用了 按+号则输出串口数据,同时接收,接收完毕后会把串口关闭,建议你把串口关闭的那行删掉,就可以了 http://download.csdn.net/detail/sosoben/4830423
sosoben 2012-11-29
  • 打赏
  • 举报
回复
引用 11 楼 TianRuoHaiYu 的回复:
引用 10 楼 sosoben 的回复:引用 6 楼 of123 的回复: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private De……
引用 4 楼 sosoben 的回复:
引用 3 楼 TianRuoHaiYu 的回复:VB编程的,如何通过API直接将串口的数据显示在记事本上呢,麻烦了 我可以用VB接收到数据,但是怎样将接收到的数据通过API直接显示在记事本上呢 Visual Basic code?123456789101112131415161718192021222324252627282930313233343536373……
我不是贴了吗 4 5楼啊 !!!
天若海愚 2012-11-29
  • 打赏
  • 举报
回复
引用 10 楼 sosoben 的回复:
引用 6 楼 of123 的回复: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "……
你的代码能贴上来吗?谢谢!
of123 2012-11-29
  • 打赏
  • 举报
回复
POINTAPI 类型需要声明: Public Type POINTAPI x As Long y As Long End Type 用 API Viewer 工具查一下就可以得到了。
天若海愚 2012-11-29
  • 打赏
  • 举报
回复
引用 12 楼 sosoben 的回复:
引用 11 楼 TianRuoHaiYu 的回复: 引用 10 楼 sosoben 的回复:引用 6 楼 of123 的回复: Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Lo……
Public Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As Long 你好,这句我运行的时候显示用户定义类型未定义
of123 2012-11-28
  • 打赏
  • 举报
回复
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private 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

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_PASTE = &H302
Private Const WM_SETTEXT = &HC

Private Sub Command1_Click()
Dim TemphWnd As Long

TemphWnd = FindWindow("Notepad", vbNullString)
TemphWnd = FindWindowEx(TemphWnd, 0, "Edit", vbNullString)
If TemphWnd Then
''-- 将Text1中的文本粘贴到记事本
'VB.Clipboard.SetText Text1.Text
'SendMessage TemphWnd, WM_PASTE, 0, ByVal 0&

'把记事本的内容设置为Text1中的文本
SendMessage TemphWnd, WM_SETTEXT, 0, ByVal CStr(Text1.Text)

End If

End Sub
sosoben 2012-11-28
  • 打赏
  • 举报
回复
Public Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach 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) As Long 这两个忘记贴了
sosoben 2012-11-28
  • 打赏
  • 举报
回复
引用 3 楼 TianRuoHaiYu 的回复:
VB编程的,如何通过API直接将串口的数据显示在记事本上呢,麻烦了 我可以用VB接收到数据,但是怎样将接收到的数据通过API直接显示在记事本上呢
 
Public Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As Long
Public Declare Function GetForegroundWindow Lib "user32" () As Long
Public Declare Function GetFocus Lib "user32" () As Long
Public Declare Function ClientToScreen Lib "user32" (ByVal hwnd As Long, lpPoint As POINTAPI) As Long


Private Function CaretPos() As POINTAPI
 Dim ptr As Long
 
 
 ptr = GetForegroundWindow()
  Dim p As POINTAPI
  Dim targetThreadID, localThreadID As Long
    
  '得到Caret在屏幕上的位置
  If ptr <> 0 Then
    targetThreadID = GetWindowThreadProcessId(ptr, 0)
    localThreadID = GetCurrentThreadId()

    If localThreadID <> targetThreadID Then
  
     Call AttachThreadInput(localThreadID, targetThreadID, 1)
          ptr = GetFocus()
        If (ptr <> 0) Then
           Call GetCaretPos(p)
           Call ClientToScreen(ptr, p)
                       
        End If
    Call AttachThreadInput(localThreadID, targetThreadID, 0)
    End If
 End If
 CaretPos = p
  
End Function



 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

                        '获得当前光标位置
                         Pos = CaretPos
                        '获得光标对应窗口的句柄
                        hwnd = WindowFromPoint(Pos.x, Pos.y)
                        Str = MSComm1.Input
                        '当激活窗口不是监控程序所处的窗口时,输出串口输入                    
                        If hwnd <> Me.hwnd Then
                                For i = 1 To Len(Str)
                                        SendMessage hwnd, WM_IME_CHAR, Asc(Mid(Str, i, 1)), 1
                                Next
                        End If
                         MSComm1.PortOpen = False
                  
        End Select
天若海愚 2012-11-28
  • 打赏
  • 举报
回复
VB编程的,如何通过API直接将串口的数据显示在记事本上呢,麻烦了 我可以用VB接收到数据,但是怎样将接收到的数据通过API直接显示在记事本上呢
of123 2012-11-28
  • 打赏
  • 举报
回复
当然,实际上写外部程序窗口(包括记事本界面)不一定非用键盘消息,可以通过 API 直接写的。
of123 2012-11-28
  • 打赏
  • 举报
回复
写一个程序,接收串口数据,通过 API 转成键盘消息。
sosoben 2012-11-28
  • 打赏
  • 举报
回复
引用 6 楼 of123 的回复:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32……
这个加上串口代码可以实现记事本在后台也能接受数据,但好像新数据会覆盖旧数据。用粘贴那个试试 我的代码是把串口信息输出到当前光标所在处
贝隆 2012-11-28
  • 打赏
  • 举报
回复
有个新的思路 A机器只管发送信息,这个不用说 B机器接收信息的进程后台运行,在接收信息的过程中,通过写键盘端口来实现模拟键盘输入功能。这样只要文本框具有输入焦点,就能接收到串口的信息。如同键盘一样。 写端口的例子:http://download.csdn.net/detail/veron_04/2884653 至于串口通信,不在此讨论。
天若海愚 2012-11-28
  • 打赏
  • 举报
回复
引用 6 楼 of123 的回复:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "Find……
我这是实时显示的,只要主机B的运行就可以了,其他就是串口有数据就立刻在主机B的记事本上显示,主机B的VB程序不再需要操作了。
贝隆 2012-11-28
  • 打赏
  • 举报
回复
引用 6 楼 of123 的回复:
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long Private Declare Function FindWindowEx Lib "user32" Alias "Find……
+1

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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