上网的朋友一定都用过网络蚂蚁(Net   Ants)的吧?不知你在使用过程中有没有注意过,  
  那就是如果你想调动两个“蚂蚁”为您效力是不可能的——它总会把新运行的关闭。  
    
          而“蚂蚁”程序的妙处就在于:在重复运行“蚂蚁”时它不仅拒绝运行,而且能把已经运  
  行的“蚂蚁”激活,这样用上面的程序就无能为力了。但事实上实现拒绝运行并激活已运行的  
  程序有多种方法:  
    
          1、用FindWindow函数得到已经运行窗体的句柄(HWND),然后用SetActiveWindow等API函  
                数将其激活。其缺点也很明显,那就是没法传递参数。  
    
          2、用FindWindow函数得到已运行窗体的句柄后用SendMessage的方法给窗体传送一个自定义  
                消息(附带参数),然后在窗体中拦截并进行处理,但这样做要修改窗体的标准消息处理  
                程序,用在VC,BC或DELPHI编写的程序中还行,但在VB中工作量太大,并且容易发生“一  
                般保护行错误”使VB崩溃,不太可取(当然,如果你有足够的信心和不怕崩溃的精神,也  
                可以试一下   ^_^   )。  
    
          3、使用DDE技术。  
    
          所谓DDE技术,就是动态数据交换技术。也许你很奇怪,这与本文所讨论的内容有什么相干的?  
  且听我慢慢讲来。  
          为了实现拒绝运行并把已经运行的程序激活并实现各种功能,我们可以先用本文开头提到的方  
  法,检测一下程序有没有被运行过,如果没有,就正常运行,如果已经被运行过,就打通与它的  
  DDE通道,传给它一个(或一些)数据,然后由已经运行的程序对数据进行处理,再去实现各种  
  “意想不到”的功能,这时也许就有人对这你的程序喊:“酷、酷……”     ^_^  
          好了,耳听为虚,眼见为实,下面让我们动点真格的。  
    
          打开VB,新建一个工程,选择菜单中的“工程->工程1   属性”,把工程名称改为“P1”(我爱  
  偷懒,能短则短   ^_^   ),把已有的一个窗体的“LinkTopic”属性改为“FormDDE”,把“LinkMode”  
  属性改为“1   -   Source”,添加一个PictureBox控件作为DDE执行控件,命名为picDDE。然后添加一个  
  TextBox控件,命名为“txtInfo”,并把“MultiLine”属性设置为“True”,以便显示多行文本,作为  
  消息显示控件。  
    
  最后在窗体代码区输入以下代码:  
    
    
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次重复调用这个程序。  
  但怕您不多给工资,所以只运行了一个   ^_^  
  最后一次运行这个程序的时间是:00-2-6   7:11:01  
    
          3、打开   MS-DOS方式   ,用命令行方式再次运行程序,如   “P1   How   Are   You?”  
                这时原来运行的程序文本框中又多了几行字:  
    
  窗体已被最大化  
  你已经第   2次重复调用这个程序。  
  但怕您不多给工资,所以只运行了一个   ^_^  
  最后一次运行这个程序的时间是:00-2-6   7:14:32  
  新程序曾以命令行形式运行  
  命令行为:  
  How   Are   You?  
    
  OK,运行完全正确,然后你就可以把它应用的你的程序中了。  
    
  当然,这只是一些个人心得,如有疏漏之出,还请各位大虾指正。  
    
    
            以上代码保存于:   SourceCode   Explorer(源代码数据库)  
                        复制时间:   2005-09-12   13:03:45  
                        软件版本:   1.0.880  
                        软件作者:   Shawls  
                            E-Mail:   ShawFile@163.com  
                                    QQ:   9181729