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
Public Declare Function AttachThreadInput Lib "user32" (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As LongPublic Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long这两个忘记贴了
首先,你的编程环境是什么? 我的是XP SP2, vbsp6 (需要mscomm控件) , win7的话用管理员身份运行试试 其次,你查找下 Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long 这句有没有定义错再次,直接运行编译好的程序会出现这样的问题吗? 我在多部机调试过无问题(要把mscomm控件复制到system32文件夹),win7只需要管理员权限
当然,实际上写外部程序窗口(包括记事本界面)不一定非用键盘消息,可以通过 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
我这是实时显示的,只要主机B的运行就可以了,其他就是串口有数据就立刻在主机B的记事本上显示,主机B的VB程序不再需要操作了。
A机器只管发送信息,这个不用说
B机器接收信息的进程后台运行,在接收信息的过程中,通过写键盘端口来实现模拟键盘输入功能。这样只要文本框具有输入焦点,就能接收到串口的信息。如同键盘一样。写端口的例子:http://download.csdn.net/detail/veron_04/2884653至于串口通信,不在此讨论。
Public Declare Function GetCaretPos Lib "user32" (lpPoint As POINTAPI) As Long
你好,这句我运行的时候显示用户定义类型未定义
x As Long
y As Long
End Type用 API Viewer 工具查一下就可以得到了。
你好。
能不能给我用VB给我编一下呢,这个今天下午就要用了,VB我才学没有多长时间,上面的一些代码我不是很懂的。
界面的设计如下图就可以了: 按下《确定》按钮,通过串口传来的数据就可以显示在记事本上了
没空新做哦 我上传了 一个类似的,都是抄来抄去的, 你在 HIDONE 过程中改改 端口,波特率 就可以用了 按+号则输出串口数据,同时接收,接收完毕后会把串口关闭,建议你把串口关闭的那行删掉,就可以了
http://download.csdn.net/detail/sosoben/4830423
大侠,我用了你的程序,但是显示“编译错误,函数或接口标记为限制的,或函数使用了visual basic中不支持的自动类型”,错误的句子是 hwnd = windowfrompoint(pos.x,pos.y),hwnd处高亮。请教是怎么回事,谢谢!
其次,你查找下
Public Declare Function WindowFromPoint Lib "user32" (ByVal xPoint As Long, ByVal yPoint As Long) As Long
这句有没有定义错再次,直接运行编译好的程序会出现这样的问题吗? 我在多部机调试过无问题(要把mscomm控件复制到system32文件夹),win7只需要管理员权限