专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »VB教程 » vbdde:VB中使用DDE技术为应用程序增辉 »正文

vbdde:VB中使用DDE技术为应用程序增辉

来源: 发布时间:星期四, 2009年1月15日 浏览:100次 评论:0
  上网朋友定都用过网络蚂蚁(Net Ants)吧?不知你在使用过程中有没有注意过那就是如果你想调动两个“蚂蚁”为您效力是不可能——它总会把新运行关闭 而“蚂蚁”妙处就在于:在重复运行“蚂蚁”时它不仅拒绝运行而且能把已经运行“蚂蚁”激活这样用上面就无能为力了但事实上实现拒绝运行并激活已运行有多种思路方法:

  1、用FindWindow得到已经运行窗体句柄(HWND)然后用SetActiveWindow等API将其激活其缺点也很明显那就是没法传递参数

  2、用FindWindow得到已运行窗体句柄后用SendMessage思路方法给窗体传送个自定义消息(附带参数)然后在窗体中拦截并进行处理但这样做要修改窗体标准消息处理用在VCBC或DELPHI编写中还行但在VB中工作量太大并且容易发生“

  般保护行”使VB崩溃不太可取(当然如果你有足够信心和不怕崩溃精神也可以试下)

  3、使用DDE技术

  所谓DDE技术就是动态数据交换技术也许你很奇怪这和本文所讨论内容有什么相干?且听我慢慢讲来

  为了实现拒绝运行并把已经运行激活并实现各种功能我们可以先用本文开头提到思路方法检测有没有被运行过如果没有就正常运行如果已经被运行过就打通和它DDE通道传给它个(或些)数据然后由已经运行对数据进行处理再去实现各种“意想不到”功能这时也许就有人对这你喊:“酷、酷……”

  好了耳听为虚眼见为实下面让我们动点真格

  打开VB新建个工程选择菜单中“工程->工程1 属性”把工程名称改为“P1”把已有个窗体“LinkTopic”属性改为“FormDDE”把“LinkMode”属性改为“1 - Source”添加个PictureBoxControl控件作为DDE执行Control控件命名为picDDE然后添加个 TextBoxControl控件命名为“txtInfo”并把“MultiLine”属性设置为“True”以便显示多行文本作为消息显示Control控件

  最后在窗体代码区输入以下代码:

  Const COMMANDLINE = "CommandLine=" 注释: 还是为了省事定义个常量
Private 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 Sub
Private Sub 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 Sub
Private Sub 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、再运行这次新没有运行成功而原来运行却被最大化了而且文本框中有以下:

  窗体已被最大化

  你已经第 1次重复这个

  但怕您不多给工资所以只运行了

  最后次运行这个时间是:05-2-6 7:11:01

  3、打开 MS-DOS方式 用命令行方式再次运行如 “P1 How Are You?”这时原来运行文本框中又多了几行字:

  窗体已被最大化

  你已经第 2次重复这个

  但怕您不多给工资所以只运行了

  最后次运行这个时间是:05-2-6 7:14:32

  新曾以命令行形式运行

  命令行为:

  How Are You?

  OK运行完全正确然后你就可以把它应用中了



0

相关文章

读者评论

发表评论

  • 昵称:
  • 内容: