HI,各位;
请问如何编写程序识别同一程序已运行?
比如我打开了一个软件:a.exe
下次我不小心又去打开它,这个时候程序先判断a.exe是否在运行,如何运行了,则不能再打开第二个a.exe了。有谁知道如何去实现它呀?最好有现成的代码!!先谢了!
请问如何编写程序识别同一程序已运行?
比如我打开了一个软件:a.exe
下次我不小心又去打开它,这个时候程序先判断a.exe是否在运行,如何运行了,则不能再打开第二个a.exe了。有谁知道如何去实现它呀?最好有现成的代码!!先谢了!
解决方案 »
- 如何排除文件中TAB(高人指点)
- @@@@@@@@@@@ 今天就结贴:VB 通过XMLHTTP用 URL 传递中文到编码为UTF-8的ASP页面乱码@@@@@@@@@@@
- 如何取得WebBrowser控件中加载的网页中由脚本生成的链接?
- 请问,如果更换webbrowser控件的光标(鼠标)?谢谢!
- 为什么mciSendString函数在win2000下会出错?急!
- 请问如何访问共享资源?
- 我想在窗体.SHOW之前判断一下它是否已经SHOW了,如果已经SHOW了,我就不SHOW了,请问怎么写这个判断呢?
- 情赶紧帮忙,在线等待。
- 请问怎样实现菜单的渐变?就是鼠标移动到一个菜单的时候就出现一个渐变的选单背景。谢了。
- 如何屏蔽键盘的作用!!!!!球专家的解答!!!谢谢!!!
- 请教关于窗口问题...
- 使用哪个api可以更改IE的主页?
你好, Darkay_Lee() 你那有这样的程序吗?能否提供给我参考呀?
if app.***** (省略) then
....
else
...
end if
mail:[email protected]
End '表明已运行
End If
'**模 块 名:Module1
'**说 明:判断程序是否运行,如运行切换到前台
'**创 建 人:寒江雪
'**日 期:2006-05-27 22:50:28
'**修 改 人:
'**日 期:
'**描 述:在工程属性里设置从这个模块启动,即sub main。
'**版 本:V1.0.0
'*************************************************************************Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function OpenIcon Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As LongPrivate Sub Main()
Dim h '声明句柄变量
h = FindWindow(vbNullString, "form1") '取得窗体句柄
If h <> 0 Then '判断窗体是否存在
OpenIcon h '将最小化的窗体还原
SetForegroundWindow h '将窗体切换到前台
End
Else
Load Form1 '若窗体不存在则加载窗体
Form1.Show '显示窗体
End If
End Sub
msgbox "loaded!"
else
msgbox "not loaded!"
End Ifend subApp.PrevInstance就是看之前有没有程序的副本被运行过
请问这句中的“form1”是当前运行的窗体名称吗?还是可执行文件?我用的MDI窗体啥不好用嫩?
If App.PrevInstance = True Then
msgbox app.title & ".exe is running"
form1.windowstate=0
else
Load form1
form1.show
End If
end sub
ProcessFirst获取进程名
ProcessNext获取下一个进程名
用上面函数列出全部系统进程。如果已经存在你要运行的进程名,那么就关闭后一个。用ExitProcess就可以了。
如果你无法终止后一个进程,那么需要提升你的应用程序的权限(不是优先级),可以用AdjustTokenPrivileges函数
Private Declare Function EnumProcessModules Lib "psapi.dll" (ByVal hProcess As Long, ByRef lphModule As Long, ByVal cb As Long, ByRef cbNeeded As Long) As Long
Private Declare Function GetModuleFileNameExA Lib "psapi.dll" (ByVal hProcess As Long, ByVal hModule As Long, ByVal ModuleName As String, ByVal nSize As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long
'根据进程号获取进程路径函数,原创:
Function GetProcessPathByProcessID(ByVal PID As Long) As String
On Error GoTo Z
Dim cbNeeded As Long
Dim szBuf(1 To 250) As Long
Dim Ret As Long
Dim szPathName As String
Dim nSize As Long
Dim hProcess As Long
hProcess = OpenProcess(&H400 Or &H10, 0, PID)
If hProcess <> 0 Then
Ret = EnumProcessModules(hProcess, szBuf(1), 250, cbNeeded)
If Ret <> 0 Then
szPathName = Space(260)
nSize = 500
Ret = GetModuleFileNameExA(hProcess, szBuf(1), szPathName, nSize)
GetProcessPathByProcessID = Left(szPathName, Ret)
End If
End If
Ret = CloseHandle(hProcess)
If GetProcessPathByProcessID = "" Then
GetProcessPathByProcessID = "SYSTEM"
End If
Exit Function
Z:
End Function
'我的系统VB进程ID为2256
'下面的结果显示了VB进程的路径为:D:\Microsoft Visual Studio\VB98\VB6.EXE
Private Sub Command1_Click()
MsgBox GetProcessPathByProcessID(2256)
End Sub
Private Const MAX_PATH = 260
Private Type PROCESSENTRY32
dwSize As Long
cntUsage As Long
th32ProcessID As Long
th32DefaultHeapID As Long
th32ModuleID As Long
cntThreads As Long
th32ParentProcessID As Long
pcPriClassBase As Long
dwFlags As Long
szExeFile As String * MAX_PATH
End TypePrivate Declare Function CreateToolhelp32Snapshot Lib "kernel32" (ByVal dwFlags As Long, ByVal th32ProcessID As Long) As Long
Private Declare Function Process32First Lib "kernel32" (ByVal hSnapshot As Long, lppe As Any) As Long
Private Declare Function Process32Next Lib "kernel32" (ByVal hSnapshot As Long, lppe As Any) As LongPrivate Const TH32CS_SNAPHEAPLIST = &H1
Private Const TH32CS_SNAPPROCESS = &H2
Private Const TH32CS_SNAPTHREAD = &H4
Private Const TH32CS_SNAPMODULE = &H8
Private Const TH32CS_SNAPALL = (TH32CS_SNAPHEAPLIST + TH32CS_SNAPPROCESS + TH32CS_SNAPTHREAD + TH32CS_SNAPMODULE)
Private Const TH32CS_INHERIT = &H80000000Private Sub Command1_Click()
'查找进程
Dim hSnapshot As Long, P As PROCESSENTRY32
Dim exitCode As Long
Dim myProcess As Long P.dwSize = Len(P)
hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPALL, ByVal 0)
If hSnapshot Then
lRet = Process32First(hSnapshot, P)
Do While lRet
If InStr(P.szExeFile, "calc.exe") <> 0 Then
MsgBox P.th32ProcessID
End If
lRet = Process32Next(hSnapshot, P)
Loop
End If
End Sub
要是本文件改名了 那么再次打开也是算没有打开过的呀
sub main()If App.PrevInstance = True Then
msgbox "loaded!"
else
msgbox "not loaded!"
End Ifend sub
求教!