如何发送字符串到外部程序,并不因外部程序卡死而卡死呢?

时间:2022-06-13 20:16:33
如题,我知道用SENDMESSAGE可以发送字符,但容易因为外部程序卡死而导致本身程序也被卡死,如果用POSTMESSAGE却不能发送字符内容(已经在网上找过,但测试后发现都不行),请问究竟有什么更好的方法实现此操作呢??谢谢!!!

13 个解决方案

#1


SENDMESSAGETIMEOUT

#2


POSTMESSAGE 应该可以的。代码有问题吧。

#3


引用 1 楼 hpygzhx520 的回复:
SENDMESSAGETIMEOUT


如何发送字符呢?

#4


引用 3 楼 penguinhzf 的回复:
Quote: 引用 1 楼 hpygzhx520 的回复:

SENDMESSAGETIMEOUT


如何发送字符呢?


直接复制粘贴的.要不就是贴出来已经有问题了.

#5


PostMessage 绝对可以。
PostMessage和SendMessage的区别就是一个异步,一个同步。

#6


引用 5 楼 caozhy 的回复:
PostMessage 绝对可以。
PostMessage和SendMessage的区别就是一个异步,一个同步。


问题是怎么发呢???

#7


你要发给谁?接收方是你自己写的子类化过程,还是默认的某些系统控件?

如果是系统的不可改变的目标,则PostMessage发不了字符串,因为字符串是指针,而PostMessage仅仅是做消息投递,换句话说就是消息被处理的时机并不确定,因此无法确认到时那个指针还有效。

而SendMessage不同,它能保证函数返回时消息一定是已经被处理了的,因此才能使用COPY_DATA之类的消息进行传递指针及其它数据。

所以这里的关键点是在于你的接收方是谁,这一点不确定的话,解答无从谈起啊。

#8


引用 7 楼 myjian 的回复:
你要发给谁?接收方是你自己写的子类化过程,还是默认的某些系统控件?

如果是系统的不可改变的目标,则PostMessage发不了字符串,因为字符串是指针,而PostMessage仅仅是做消息投递,换句话说就是消息被处理的时机并不确定,因此无法确认到时那个指针还有效。

而SendMessage不同,它能保证函数返回时消息一定是已经被处理了的,因此才能使用COPY_DATA之类的消息进行传递指针及其它数据。

所以这里的关键点是在于你的接收方是谁,这一点不确定的话,解答无从谈起啊。


也是自建程序,只是因为该程序访问的数据量比较大,而且容易卡死,所以想用另一个程序发送相关指令,如果该程序没卡死,就执行发来的指令而已。

#9


其实你的是进程通讯问题,干嘛不用DDE,VB里面用起来很简单的,还稳定。
当然,你如果要用Windows消息也是可以的,就楼上说的PostMessage就没问题。
还有,PostMessage的使用方法和SendMessage是一样的,不清楚你就百度一下“PostMessage”。

#10


接收既然是自己的,就好办了。

接收只管接收,收到后放入队列,结束。
处理过程定时从队列读,有就处理。

#11


恰巧做过类似的功能,问题的关键在于要得到接收字符串的控件的句柄

Public Const WM_CHAR = &H102
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1

Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'****************************************************************************************
'过程功能:将一个字符串通过PostMessage传送出去
'功能描述:
'****************************************************************************************
Public Sub subPostString(ByVal lngHandle As Long, ByVal strP As String)
    Dim intP As Integer
    Dim intK As Integer
    Dim lngAsc As Long
    Dim lngP As Long
    Dim strT As String
On Error GoTo errSub
    For intP = 0 To Len(strP) - 1
        strT = Mid(strP, intP + 1, 1)
        If Asc(strT) <= 0 Then
            lngAsc = AscW(StrConv(strT, 128))
            If lngAsc < 0 Then
                lngAsc = lngAsc + 65536 '2^16
            End If
        Else
            lngAsc = Asc(strT)
        End If
        lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0)
    Next intP
    Exit Sub
errSub:

End Sub

#12


引用 11 楼 Veron_04 的回复:
恰巧做过类似的功能,问题的关键在于要得到接收字符串的控件的句柄

Public Const WM_CHAR = &H102
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1

Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'****************************************************************************************
'过程功能:将一个字符串通过PostMessage传送出去
'功能描述:
'****************************************************************************************
Public Sub subPostString(ByVal lngHandle As Long, ByVal strP As String)
    Dim intP As Integer
    Dim intK As Integer
    Dim lngAsc As Long
    Dim lngP As Long
    Dim strT As String
On Error GoTo errSub
    For intP = 0 To Len(strP) - 1
        strT = Mid(strP, intP + 1, 1)
        If Asc(strT) <= 0 Then
            lngAsc = AscW(StrConv(strT, 128))
            If lngAsc < 0 Then
                lngAsc = lngAsc + 65536 '2^16
            End If
        Else
            lngAsc = Asc(strT)
        End If
        lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0)
    Next intP
    Exit Sub
errSub:

End Sub


不错不错,正是我想要的.谢谢!!

#13


结贴......

#1


SENDMESSAGETIMEOUT

#2


POSTMESSAGE 应该可以的。代码有问题吧。

#3


引用 1 楼 hpygzhx520 的回复:
SENDMESSAGETIMEOUT


如何发送字符呢?

#4


引用 3 楼 penguinhzf 的回复:
Quote: 引用 1 楼 hpygzhx520 的回复:

SENDMESSAGETIMEOUT


如何发送字符呢?


直接复制粘贴的.要不就是贴出来已经有问题了.

#5


PostMessage 绝对可以。
PostMessage和SendMessage的区别就是一个异步,一个同步。

#6


引用 5 楼 caozhy 的回复:
PostMessage 绝对可以。
PostMessage和SendMessage的区别就是一个异步,一个同步。


问题是怎么发呢???

#7


你要发给谁?接收方是你自己写的子类化过程,还是默认的某些系统控件?

如果是系统的不可改变的目标,则PostMessage发不了字符串,因为字符串是指针,而PostMessage仅仅是做消息投递,换句话说就是消息被处理的时机并不确定,因此无法确认到时那个指针还有效。

而SendMessage不同,它能保证函数返回时消息一定是已经被处理了的,因此才能使用COPY_DATA之类的消息进行传递指针及其它数据。

所以这里的关键点是在于你的接收方是谁,这一点不确定的话,解答无从谈起啊。

#8


引用 7 楼 myjian 的回复:
你要发给谁?接收方是你自己写的子类化过程,还是默认的某些系统控件?

如果是系统的不可改变的目标,则PostMessage发不了字符串,因为字符串是指针,而PostMessage仅仅是做消息投递,换句话说就是消息被处理的时机并不确定,因此无法确认到时那个指针还有效。

而SendMessage不同,它能保证函数返回时消息一定是已经被处理了的,因此才能使用COPY_DATA之类的消息进行传递指针及其它数据。

所以这里的关键点是在于你的接收方是谁,这一点不确定的话,解答无从谈起啊。


也是自建程序,只是因为该程序访问的数据量比较大,而且容易卡死,所以想用另一个程序发送相关指令,如果该程序没卡死,就执行发来的指令而已。

#9


其实你的是进程通讯问题,干嘛不用DDE,VB里面用起来很简单的,还稳定。
当然,你如果要用Windows消息也是可以的,就楼上说的PostMessage就没问题。
还有,PostMessage的使用方法和SendMessage是一样的,不清楚你就百度一下“PostMessage”。

#10


接收既然是自己的,就好办了。

接收只管接收,收到后放入队列,结束。
处理过程定时从队列读,有就处理。

#11


恰巧做过类似的功能,问题的关键在于要得到接收字符串的控件的句柄

Public Const WM_CHAR = &H102
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1

Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'****************************************************************************************
'过程功能:将一个字符串通过PostMessage传送出去
'功能描述:
'****************************************************************************************
Public Sub subPostString(ByVal lngHandle As Long, ByVal strP As String)
    Dim intP As Integer
    Dim intK As Integer
    Dim lngAsc As Long
    Dim lngP As Long
    Dim strT As String
On Error GoTo errSub
    For intP = 0 To Len(strP) - 1
        strT = Mid(strP, intP + 1, 1)
        If Asc(strT) <= 0 Then
            lngAsc = AscW(StrConv(strT, 128))
            If lngAsc < 0 Then
                lngAsc = lngAsc + 65536 '2^16
            End If
        Else
            lngAsc = Asc(strT)
        End If
        lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0)
    Next intP
    Exit Sub
errSub:

End Sub

#12


引用 11 楼 Veron_04 的回复:
恰巧做过类似的功能,问题的关键在于要得到接收字符串的控件的句柄

Public Const WM_CHAR = &H102
Public Const WM_LBUTTONDOWN = &H201
Public Const WM_LBUTTONUP = &H202
Public Const WM_KEYDOWN = &H100
Public Const WM_KEYUP = &H101

Private Const NORMAL_PRIORITY_CLASS = &H20&
Private Const STARTF_USESTDHANDLES = &H100&
Private Const STARTF_USESHOWWINDOW = &H1

Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4

Public Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long

'****************************************************************************************
'过程功能:将一个字符串通过PostMessage传送出去
'功能描述:
'****************************************************************************************
Public Sub subPostString(ByVal lngHandle As Long, ByVal strP As String)
    Dim intP As Integer
    Dim intK As Integer
    Dim lngAsc As Long
    Dim lngP As Long
    Dim strT As String
On Error GoTo errSub
    For intP = 0 To Len(strP) - 1
        strT = Mid(strP, intP + 1, 1)
        If Asc(strT) <= 0 Then
            lngAsc = AscW(StrConv(strT, 128))
            If lngAsc < 0 Then
                lngAsc = lngAsc + 65536 '2^16
            End If
        Else
            lngAsc = Asc(strT)
        End If
        lngP = PostMessage(lngHandle, WM_CHAR, lngAsc, 0)
    Next intP
    Exit Sub
errSub:

End Sub


不错不错,正是我想要的.谢谢!!

#13


结贴......