现在有一个exe文件A,一个Active exe文件E和一个dll文件D,
1,A引用E和D,
2,E有一个窗体E1
3,D有一个窗体D1我想完成的功能是当E1显示在桌面上的时候,D1不能显示出来,只有当E1不在桌面的时候,D1才显示出来,请问用哪个Api,怎么实现?

解决方案 »

  1.   

    api:
    GetWindowThreadProcessId “获取与指定窗口关联在一起的一个进程和线程标识符”
    GetModuleHandle “获取一个应用程序或动态链接库的模块句柄”
     TerminateProcess "结束一个进程"
    就是查找进程,然后关闭.
      

  2.   

    不是关闭进程,让Active exe保存在系统托盘下,然后dll的窗体出来
      

  3.   

    //现在有一个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
      

  4.   

    下面是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创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符
      

  5.   

    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)里有一些代码初始化。是不是有关系???????????
      

  6.   

    //E1和D1在Form_Load()和Form_Unload(Cancel As Integer)里有一些代码初始化。是不是有关系???????????应该是的,你可以把E1和D1的所有代码都去掉,只留下我写的这些代码,然后看看结果
      

  7.   

    还是不行。我的代码是写在一起的。我是先调用active exe 的一个方法,用弹出E1,在E1弹出以后,下面的代码继续执行的话会弹出D1,我以前是用timer控制的,不过不是好办法。
    我就想让E1在桌面的时候,下面的代码不执行。。
      

  8.   

    没这么复杂吧,查找窗体句柄嘛,或者查找进程句柄,自己的东西还不好找?
    调用DL时查找EL在不在,在时不显示不就完工了