Private Sub Form_Load()
十年的峨山縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整峨山縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。創(chuàng)新互聯(lián)從事“峨山縣網(wǎng)站設(shè)計(jì)”,“峨山縣網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。
If App.PrevInstance Then
End
End If
End Sub
用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()
If App.PrevInstance Then
MsgBox "你已經(jīng)運(yùn)行這個(gè)應(yīng)用程序了"
End ' 退出新運(yùn)行的程序
End If
End Sub
這樣如果你運(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編寫的程序中還行,但在VB中工作量太大,并且容易發(fā)生“一般保護(hù)行錯(cuò)誤”使VB崩潰,不太可取(當(dāng)然,如果你有足夠的信心和不怕崩潰的精神,也可以試一下 ^_^ )。
3、使用DDE技術(shù)。
所謂DDE技術(shù),就是動(dòng)態(tài)數(shù)據(jù)交換技術(shù)。也許你很奇怪,這與本文所討論的內(nèi)容有什么相干的?
且聽(tīng)我慢慢講來(lái)。
為了實(shí)現(xiàn)拒絕運(yùn)行并把已經(jīng)運(yùn)行的程序激活并實(shí)現(xiàn)各種功能,我們可以先用本文開頭提到的方法,檢測(cè)一下程序有沒(méi)有被運(yùn)行過(guò),如果沒(méi)有,就正常運(yùn)行,如果已經(jīng)被運(yùn)行過(guò),就打通與它的DDE通道,傳給它一個(gè)(或一些)數(shù)據(jù),然后由已經(jīng)運(yùn)行的程序?qū)?shù)據(jù)進(jìn)行處理,再去實(shí)現(xiàn)各種“意想不到”的功能,這時(shí)也許就有人對(duì)這你的程序喊:“酷、酷……” ^_^
好了,耳聽(tīng)為虛,眼見(jiàn)為實(shí),下面讓我們動(dòng)點(diǎn)真格的。
打開VB,新建一個(gè)工程,選擇菜單中的“工程-工程1 屬性”,把工程名稱改為“P1”(我愛(ài)偷懶,能短則短 ^_^ ),把已有的一個(gè)窗體的“LinkTopic”屬性改為“FormDDE”,把“LinkMode”屬性改為“1 - Source”,添加一個(gè)PictureBox控件作為DDE執(zhí)行控件,命名為picDDE。然后添加一個(gè)TextBox控件,命名為“txtInfo”,并把“MultiLine”屬性設(shè)置為“True”,以便顯示多行文本,作為消息顯示控件。
最后在窗體代碼區(qū)輸入以下代碼:
Const COMMANDLINE = "CommandLine=" ' 還是為了省事,定義一個(gè)常量
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程序傳送過(guò)來(lái)的參數(shù)
Case "Max"
Me.WindowState = 2
Info = Info + vbNewLine + "窗體已被最大化"
Case "ShowTime"
Info = Info + vbNewLine + "最后一次運(yùn)行這個(gè)程序的時(shí)間是:" + Str(Now)
Case "Count"
lngCount = lngCount + 1
Info = Info + vbNewLine + "你已經(jīng)第" + Str(lngCount) + "次重復(fù)調(diào)用這個(gè)程序。" _
+ vbNewLine + "但怕您不多給工資,所以只運(yùn)行了一個(gè) ^_^"
End Select
If Left(CmdStr, Len(COMMANDLINE)) = COMMANDLINE Then
Info = Info + vbNewLine + "新程序曾以命令行形式運(yùn)行" + vbNewLine + "命令行為:" _
+ vbNewLine + Right(CmdStr, Len(CmdStr) - Len(COMMANDLINE))
End If
txtInfo.Text = Info ' 把信息顯示出來(lái)
Cancel = False
End Sub
Private Sub LinkAndSendMessage(ByVal Msg As String)
Dim t As Long
picDDE.LinkMode = 0 '--
picDDE.LinkTopic = "P1|FormDDE" ' |______連接DDE程序并發(fā)送數(shù)據(jù)/參數(shù)
picDDE.LinkMode = 2 ' | “|”為管道符,是“退格鍵”旁邊的豎線,
picDDE.LinkExecute Msg '-- 不是字母或數(shù)字!
t = picDDE.LinkTimeout '--
picDDE.LinkTimeout = 1 ' |______終止DDE通道。當(dāng)然,也可以用別的方法
picDDE.LinkMode = 0 ' | 這里用的是超時(shí)強(qiáng)制終止的方法
picDDE.LinkTimeout = t '--
End Sub
Private Sub Form_Load()
If App.PrevInstance Then ' 程序是否已經(jīng)運(yùn)行
Me.LinkTopic = "" ' 這兩行用于清除新運(yùn)行的程序的DDE服務(wù)器屬性,
Me.LinkMode = 0 ' 否則在連接DDE程序時(shí)會(huì)出亂子的
LinkAndSendMessage "Max" '--
LinkAndSendMessage "Count" ' |-----連接DDE接受程序并傳送數(shù)據(jù)/參數(shù)
LinkAndSendMessage "ShowTime" '--
If Command "" Then ' 如果有命令行參數(shù),就傳遞過(guò)去
LinkAndSendMessage COMMANDLINE + Command
End If
End ' 結(jié)束新程序的運(yùn)行
End If
End Sub
測(cè)試一下:
把工程“P1”編譯成EXE文件(設(shè)名稱為 P1.EXE )
1、打開“我的電腦”,找到 P1.EXE 并執(zhí)行。可以看到程序正常運(yùn)行了。
2、再運(yùn)行一次,這次新程序沒(méi)有運(yùn)行成功,而原來(lái)運(yùn)行的程序卻被最大化了,而且文本框中有以下
字符:
窗體已被最大化
你已經(jīng)第 1次重復(fù)調(diào)用這個(gè)程序。
但怕您不多給工資,所以只運(yùn)行了一個(gè) ^_^
最后一次運(yùn)行這個(gè)程序的時(shí)間是:00-2-6 7:11:01
3、打開 MS-DOS方式 ,用命令行方式再次運(yùn)行程序,如 “P1 How Are You?”
這時(shí)原來(lái)運(yùn)行的程序文本框中又多了幾行字:
窗體已被最大化
你已經(jīng)第 2次重復(fù)調(diào)用這個(gè)程序。
但怕您不多給工資,所以只運(yùn)行了一個(gè) ^_^
最后一次運(yùn)行這個(gè)程序的時(shí)間是:00-2-6 7:14:32
新程序曾以命令行形式運(yùn)行
命令行為:
How Are You?
OK,運(yùn)行完全正確,然后你就可以把它應(yīng)用的你的程序中了。
Imports System.Runtime.InteropServices
Module Module1
Sub Main()
Dim instance As Process = RunningInstance()
If instance IsNot Nothing Then
ShowWindowAsync(instance.MainWindowHandle, 3) '調(diào)用api函數(shù),正常顯示窗口
Return
End If
Dim F1 As New Form1
Application.Run(F1) '顯示窗體
End Sub
DllImport("User32.dll")
Public Function ShowWindowAsync(ByVal hWnd As System.IntPtr, ByVal cmdShow As Integer) As Boolean
End Function
Private Function RunningInstance() As Process '返回進(jìn)程中已經(jīng)打開的程序
Dim current As Process = Process.GetCurrentProcess()
Dim processes As Process() = Process.GetProcessesByName(current.ProcessName)
For Each process As Process In processes
If process.Id current.Id Then
If process.MainModule.FileName = current.MainModule.FileName Then
Return process
End If
End If
Next
Return Nothing
End Function
End Module
這個(gè)提供進(jìn)程即可以判斷程序是否已經(jīng)啟動(dòng)
這個(gè)是最一般的方法了
希望能幫到你
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim MyInfo As String = "系統(tǒng)正在運(yùn)行的程序" + vbCrLf
Dim MyProcesses() As Process = Process.GetProcesses()
For Each MyProcess As Process In MyProcesses
If (MyProcess.MainWindowTitle.Length 0) Then
MyInfo += MyProcess.MainWindowTitle + vbCrLf
End If
Next
Me.Label1.Text = MyInfo
End Sub
用process.GetProcesses()
或者process.GetProcessByid() 獲取進(jìn)程信息,
標(biāo)題名稱:vb.net檢測(cè)程序運(yùn)行,c語(yǔ)言檢測(cè)程序運(yùn)行
URL地址:http://vcdvsql.cn/article32/hsecpc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供電子商務(wù)、網(wǎng)站設(shè)計(jì)、標(biāo)簽優(yōu)化、商城網(wǎng)站、外貿(mào)網(wǎng)站建設(shè)、軟件開發(fā)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)