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