在窗体代碼區輸入以下代碼: Const COMMANDLINE = "CommandLine=" Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) Static lngCount As Long Dim Info As String Info = txtInfo.Text '保留原有信息 Select Case CmdStr 'CmdStr是DDE程序傳送過來的參數 Case "Max" Me.WindowState = 2 Info = Info + vbNewLine + "窗体已被最大化" Case "ShowTime" Info = Info + vbNewLine + "最后一次運行這個程序的時間是:" + Str(Now) Case "Count" lngCount = lngCount + 1 Info = Info + vbNewLine + "你已經第" + Str(lngCount) + "次重复調用這個程序。" _ + vbNewLine + "但怕您不多給工資,所以只運行了一個 ^_^" End Select If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then Info = Info + vbNewLine + "新程序曾以命令行形式運行" + vbNewLine + "命令行為:" _ + vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE)) End If txtInfo.Text = Info '把信息顯示出來 Cancel = False End SubSub LinkAndSendMessage(ByVal Msg As String) Dim t As Long picDDE.LinkMode = 0 picDDE.LinkTopic = "P1|FormDDE" '連接DDE程序并發送數据/參數("|"為管道符) picDDE.LinkMode = 2 picDDE.LinkExecute Msg t = picDDE.LinkTimeout picDDE.LinkTimeout = 1 '終止DDE通道(這里用的是超時強制終止的方法) picDDE.LinkMode = 0 picDDE.LinkTimeout = t End SubSub Form_Load() If App.PrevInstance Then '程序是否已經運行 Me.LinkTopic = "" '這兩行用于清除新運行的程序的DDE服務器屬性, Me.LinkMode = 0 '否則在連接DDE程序時會出亂子的 LinkAndSendMessage "Max" LinkAndSendMessage "Count" '連接DDE接受程序并傳送數据/參數 LinkAndSendMessage "ShowTime" If Command <> "" Then '如果有命令行參數 , 就傳遞過去 LinkAndSendMessage COMMANDLINE + Command End If End '結束新程序的運行 End If End Sub
測試: 把工程"P1"編譯成EXE文件(設名稱為P1.EXE) 1、打開"我的電腦",找到P1.EXE并執行。可以看到程序正常運行了。 2、再運行一次,這次新程序沒有運行成功,而原來運行的程序卻被最大化了,而且文本框中有以 下字符:(省略) 3、打開MS-DOS方式,用命令行方式再次運行程序,如P1.Exe "How Are You?"
然后sendMessage
使用SENDMESSAGE简单
Const HWND_NOTOPMOST = 1
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function SendMessage Lib "user32.dll" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lparam As Any) 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 LongPrivate Sub send_message()
Dim SOFT_Handle, BWND_TXT, BWND As Double
Dim s, txtstring As String
Dim str(256) As Byte
SOFT_Handle = FindWindow("#32770", "载入图象文件")
If SOFT_Handle <> 0 And Len(Text1.Text) <> 0 Then
BWND_TXT = FindWindowEx(SOFT_Handle, ByVal 0&, "edit", vbNullString)
s = Trim(Text1.Text)
Clipboard.SetText s
SendMessage BWND_TXT, WM_PASTE, 0&, ByVal 0&
'**********************************************判断发送是否成功,不成功则再发
str(1) = 1 '最大允许存放256个字符
SendMessage BWND_TXT, EM_GETLINE, 2, str(0)
txtstring = StrConv(str, vbUnicode)
If InStr(1, txtstring, "*.Tga") <> 0 Then SendMessage BWND_TXT, WM_PASTE, 0&, ByVal 0&
'*******************************************************************************
BWND = FindWindowEx(SOFT_Handle, ByVal 0&, "Button", "打开(&O)")
SendMessage BWND, BM_CLICK, 0, ByVal 0& '最后一个参数byref传递也可
Text1.Text = ""
Exit Sub
Else
SOFT_Handle = FindWindow("#32770", "保存当前图象到此文件")
If SOFT_Handle <> 0 Then
BWND_TXT = FindWindowEx(SOFT_Handle, ByVal 0&, "edit", vbNullString)
new_dir = Trim(Text1.Text)
Clipboard.SetText new_dir
SendMessage BWND_TXT, WM_PASTE, 0&, ByVal 0& '把Text1.hwnd换成你的句柄
'**********************************************判断发送是否成功,不成功则再发
str(1) = 1 '最大允许存放256个字符
SendMessage BWND_TXT, EM_GETLINE, 2, str(0)
txtstring = StrConv(str, vbUnicode)
If InStr(1, txtstring, "NEW") = 0 Then SendMessage BWND_TXT, WM_PASTE, 0&, ByVal 0&
'*******************************************************************************
BWND = FindWindowEx(SOFT_Handle, ByVal 0&, "Button", "保存(&S)")
SendMessage BWND, BM_CLICK, 0, ByVal 0& '最后一个参数byref传递也可
Text1.Text = ""
End If
End If
End Sub
编程余地要大一些。
没办法细说,加我qq :397667325,我给你写个例子程序算了
實現不同應用程序之間的消息傳遞
兩個VB程序之間如何實現A程序執行某操作后傳遞相應的消息到B程序,B程序根据消息執行相應的
函數。
打開VB,新建一個工程,選擇菜單中的"工程->工程1->屬性",把工程名稱改為"P1",把已有的一
個窗体的"LinkTopic"屬性改為"FormDDE",把"LinkMode"屬性改為"1-Source",添加一個 PictureBox
控件作為DDE執行控件,命名為picDDE。然后添加一個TextBox控件,命名為"txtInfo",并把"MultiLine"
屬性設置為"True",以便顯示多行文本,作為消息顯示控件。
在窗体代碼區輸入以下代碼:
Const COMMANDLINE = "CommandLine="
Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Static lngCount As Long
Dim Info As String
Info = txtInfo.Text '保留原有信息
Select Case CmdStr 'CmdStr是DDE程序傳送過來的參數
Case "Max"
Me.WindowState = 2
Info = Info + vbNewLine + "窗体已被最大化"
Case "ShowTime"
Info = Info + vbNewLine + "最后一次運行這個程序的時間是:" + Str(Now)
Case "Count"
lngCount = lngCount + 1
Info = Info + vbNewLine + "你已經第" + Str(lngCount) + "次重复調用這個程序。" _
+ vbNewLine + "但怕您不多給工資,所以只運行了一個 ^_^"
End Select
If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then
Info = Info + vbNewLine + "新程序曾以命令行形式運行" + vbNewLine + "命令行為:" _
+ vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE))
End If
txtInfo.Text = Info '把信息顯示出來
Cancel = False
End SubSub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
picDDE.LinkMode = 0
picDDE.LinkTopic = "P1|FormDDE" '連接DDE程序并發送數据/參數("|"為管道符)
picDDE.LinkMode = 2
picDDE.LinkExecute Msg
t = picDDE.LinkTimeout
picDDE.LinkTimeout = 1 '終止DDE通道(這里用的是超時強制終止的方法)
picDDE.LinkMode = 0
picDDE.LinkTimeout = t
End SubSub Form_Load()
If App.PrevInstance Then '程序是否已經運行
Me.LinkTopic = "" '這兩行用于清除新運行的程序的DDE服務器屬性,
Me.LinkMode = 0 '否則在連接DDE程序時會出亂子的
LinkAndSendMessage "Max"
LinkAndSendMessage "Count" '連接DDE接受程序并傳送數据/參數
LinkAndSendMessage "ShowTime"
If Command <> "" Then '如果有命令行參數 , 就傳遞過去
LinkAndSendMessage COMMANDLINE + Command
End If
End '結束新程序的運行
End If
End Sub
測試:
把工程"P1"編譯成EXE文件(設名稱為P1.EXE)
1、打開"我的電腦",找到P1.EXE并執行。可以看到程序正常運行了。
2、再運行一次,這次新程序沒有運行成功,而原來運行的程序卻被最大化了,而且文本框中有以
下字符:(省略)
3、打開MS-DOS方式,用命令行方式再次運行程序,如P1.Exe "How Are You?"
运行错误 ‘282’
无外部应用程序响应 DDE 初始化
而且我不明白这怎么对话?? 只有一个程序?? 我是想两个程序对话啊
1、打開"我的電腦",找到P1.EXE并執行。可以看到程序正常運行了。
2、再運行一次,這次新程序沒有運行成功,而原來運行的程序卻被最大化了,而且文本框中有以
下字符:(省略)
用你的方法出现错误啊
运行错误 ‘282’
无外部应用程序响应 DDE 初始化
而且我不明白这怎么对话?? 只有一个程序?? 我是想两个程序对话啊