vb防止一個程序多次運行 ,系統啟動另一個實例時,自動把命令參數轉到第一個實例
當前位置:點晴教程→知識管理交流
→『 技術文檔交流 』
用DDE實現窗體防止運行多個實例并傳遞命令 上網的朋友一定都用過網絡螞蟻(Net Ants)的吧?不知你在使用過程中有沒有注意過,那就是如果你想調動兩個“螞蟻”為您效力是不可能的——它總會把新運行的關閉。這點在VB中很容易實現: Private Sub Form_Load() 這樣如果你運行這個程序后在運行它,它會彈出一個消息框并拒絕再次運行。這非常容易。 而“螞蟻”程序的妙處就在于:在重復運行“螞蟻”時它不僅拒絕運行,而且能把已經運行的“螞蟻”激活,這樣用上面的程序就無能為力了。但事實上實現拒絕運行并激活已運行的 1、用FindWindow函數得到已經運行窗體的句柄(HWND),然后用SetActiveWindow等API函數將其激活。其缺點也很明顯,那就是沒法傳遞參數。 2、用FindWindow函數得到已運行窗體的句柄后用SendMessage的方法給窗體傳送一個自定義消息(附帶參數),然后在窗體中攔截并進行處理,但這樣做要修改窗體的標準消息處理程序,用在VC,BC或DELPHI編寫的程序中還行,但在VB中工作量太大,并且容易發生“一般保護行錯誤”使VB崩潰,不太可取(當然,如果你有足夠的信心和不怕崩潰的精神,也可以試一下 ^_^ )。 3、使用DDE技術。 所謂DDE技術,就是動態數據交換技術。也許你很奇怪,這與本文所討論的內容有什么相干的? 好了,耳聽為虛,眼見為實,下面讓我們動點真格的。 打開VB,新建一個工程,選擇菜單中的“工程->工程1 屬性”,把工程名稱改為“P1”(我愛偷懶,能短則短 ^_^ ),把已有的一個窗體的“LinkTopic”屬性改為“FormDDE”,把“LinkMode”屬性改為“1 - Source”,添加一個PictureBox控件作為DDE執行控件,命名為picDDE。然后添加一個TextBox控件,命名為“txtInfo”,并把“MultiLine”屬性設置為“True”,以便顯示多行文本,作為消息顯示控件。 最后在窗體代碼區輸入以下代碼:
Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer) Info = txtInfo.Text ' 保留原有信息 Select Case CmdStr ' CmdStr 是DDE程序傳送過來的參數 If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then txtInfo.Text = Info ' 把信息顯示出來 Cancel = False
t = picDDE.LinkTimeout '--
Me.LinkTopic = "" ' 這兩行用于清除新運行的程序的DDE服務器屬性, LinkAndSendMessage "Max" '-- If Command <> "" Then ' 如果有命令行參數,就傳遞過去 測試一下: 窗體已被最大化 3、打開 MS-DOS方式 ,用命令行方式再次運行程序,如 “P1 How Are You?” 窗體已被最大化 OK,運行完全正確,然后你就可以把它應用的你的程序中了。 該文章在 2014/3/14 0:18:25 編輯過 |
關鍵字查詢
相關文章
正在查詢... |