//现在有一个exe文件A,一个Active exe文件E和一个dll文件D, 1,A引用E和D, 2,E有一个窗体E1 3,D有一个窗体D1我想完成的功能是当E1显示在桌面上的时候,D1不能显示出来,只有当E1不在桌面的时候,D1才显示出来用互斥体,给你的窗体d1和e1都加上下面的代码即可:Option Explicit Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long Private Type SECURITY_ATTRIBUTES nLength As Long lpSecurityDescriptor As Long bInheritHandle As Long End Type Private Const ERROR_ALREADY_EXISTS = 183& Dim hMutex As Long Dim flag As Boolean Private Sub Form_Load() Dim sa As SECURITY_ATTRIBUTES sa.bInheritHandle = 1 sa.lpSecurityDescriptor = 0 sa.nLength = Len(sa) 'Try to create a new Mutex hMutex = CreateMutex(sa, 1, "only one") If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then flag = True Unload Me Exit Sub Else flag = False End If End SubPrivate Sub Form_Unload(Cancel As Integer) If flag = False Then If hMutex <> 0 Then CloseHandle hMutex End If End If End Sub
下面是CreateMutex的说明: 【VB声明】 Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long【别名】 CreateMutexA【说明】 创建一个互斥体(MUTEX) 【返回值】 Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS 【备注】 一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象 进程中止前,一定要释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序【参数表】 lpMutexAttributes - SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符 bInitialOwner -- Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 lpName --------- String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
to rainstormmaster(暴风雨 v2.0) 加上你的代码后,E1就显示不出来了。。 Private Sub Form_Load() Dim sa As SECURITY_ATTRIBUTES sa.bInheritHandle = 1 sa.lpSecurityDescriptor = 0 sa.nLength = Len(sa) 'Try to create a new Mutex hMutex = CreateMutex(sa, 1, "only one") If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then====这个条件成立就退出了 flag = True Unload Me Exit Sub Else flag = False End If End SubE1和D1在Form_Load()和Form_Unload(Cancel As Integer)里有一些代码初始化。是不是有关系???????????
//E1和D1在Form_Load()和Form_Unload(Cancel As Integer)里有一些代码初始化。是不是有关系???????????应该是的,你可以把E1和D1的所有代码都去掉,只留下我写的这些代码,然后看看结果
GetWindowThreadProcessId “获取与指定窗口关联在一起的一个进程和线程标识符”
GetModuleHandle “获取一个应用程序或动态链接库的模块句柄”
TerminateProcess "结束一个进程"
就是查找进程,然后关闭.
1,A引用E和D,
2,E有一个窗体E1
3,D有一个窗体D1我想完成的功能是当E1显示在桌面上的时候,D1不能显示出来,只有当E1不在桌面的时候,D1才显示出来用互斥体,给你的窗体d1和e1都加上下面的代码即可:Option Explicit
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long
Private Type SECURITY_ATTRIBUTES
nLength As Long
lpSecurityDescriptor As Long
bInheritHandle As Long
End Type
Private Const ERROR_ALREADY_EXISTS = 183&
Dim hMutex As Long
Dim flag As Boolean
Private Sub Form_Load()
Dim sa As SECURITY_ATTRIBUTES
sa.bInheritHandle = 1
sa.lpSecurityDescriptor = 0
sa.nLength = Len(sa)
'Try to create a new Mutex
hMutex = CreateMutex(sa, 1, "only one")
If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then
flag = True
Unload Me
Exit Sub
Else
flag = False
End If
End SubPrivate Sub Form_Unload(Cancel As Integer)
If flag = False Then
If hMutex <> 0 Then
CloseHandle hMutex
End If
End If
End Sub
【VB声明】
Private Declare Function CreateMutex Lib "kernel32" Alias "CreateMutexA" (lpMutexAttributes As SECURITY_ATTRIBUTES, ByVal bInitialOwner As Long, ByVal lpName As String) As Long【别名】
CreateMutexA【说明】
创建一个互斥体(MUTEX) 【返回值】
Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。即使返回的是一个有效句柄,但倘若指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS 【备注】
一旦不再需要,注意必须用CloseHandle函数将互斥体句柄关闭。从属于它的所有句柄都被关闭后,就会删除对象
进程中止前,一定要释放互斥体,如不慎未采取这个措施,就会将这个互斥体标记为废弃,并自动释放所有权。共享这个互斥体的其他应用程序也许仍然能够用它,但会接收到一个废弃状态信息,指出上一个所有进程未能正常关闭。这种状况是否会造成影响取决于涉及到的具体应用程序【参数表】
lpMutexAttributes - SECURITY_ATTRIBUTES,指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal
As Long,并传递零值),表示使用不允许继承的默认描述符 bInitialOwner -- Long,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有 lpName --------- String,指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
加上你的代码后,E1就显示不出来了。。
Private Sub Form_Load()
Dim sa As SECURITY_ATTRIBUTES
sa.bInheritHandle = 1
sa.lpSecurityDescriptor = 0
sa.nLength = Len(sa)
'Try to create a new Mutex
hMutex = CreateMutex(sa, 1, "only one")
If (Err.LastDllError = ERROR_ALREADY_EXISTS) Then====这个条件成立就退出了
flag = True
Unload Me
Exit Sub
Else
flag = False
End If
End SubE1和D1在Form_Load()和Form_Unload(Cancel As Integer)里有一些代码初始化。是不是有关系???????????
我就想让E1在桌面的时候,下面的代码不执行。。
调用DL时查找EL在不在,在时不显示不就完工了