• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    用DDE實現窗體防止運行多個實例并傳遞命令

    發布: 2007-7-14 20:28 | 作者: 佚名    | 來源: 網絡轉載     | 查看: 24次 | 進入軟件測試論壇討論

    領測軟件測試網     上網的朋友一定都用過網絡螞蟻(Net Ants)的吧?不知你在使用過程中有沒有注意過,
    那就是如果你想調動兩個“螞蟻”為您效力是不可能的——它總會把新運行的關閉。這點在VB
    中很容易實現:
        Private Sub Form_Load()
           If App.PrevInstance Then
              MsgBox "你已經運行這個應用程序了"
              End      ' 退出新運行的程序
           End If
        End Sub
        這樣如果你運行這個程序后在運行它,它會彈出一個消息框并拒絕再次運行。這非常容易。
        而“螞蟻”程序的妙處就在于:在重復運行“螞蟻”時它不僅拒絕運行,而且能把已經運
    行的“螞蟻”激活,這樣用上面的程序就無能為力了。但事實上實現拒絕運行并激活已運行的
    程序有多種方法:

        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,運行完全正確,然后你就可以把它應用的你的程序中了。

    當然,這只是一些個人心得,如有疏漏之出,還請各位大蝦指正。

    文章來源于領測軟件測試網 http://www.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備10010545號-5
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>