程序1(p1)用shell调用了程序2(p2),并且p2用setwindowpos显示在了p1上面,但是点击p1窗体上的按钮仍然能够得到响应,我想让p1不响应任何事件直到p2结束为止。
    其功能就像在form1里写了“form2.show vbmodal”。
    希望高手指教!!!

解决方案 »

  1.   

    难~
    用Shell执行的外部程序执行成功后和调用Shell的程序基本没有任何关系,除了你能拿到它的hInstance.其实你在程序(P1)里调用Shell执行了P2,和你让P1运行着,然后手动执行P2没啥区别.如果P1和P2都是你自己写的,可以让两个程序通过一些方法进行通信,比如说P2启动后通知P1不要响应用户操作;P2退出时再通知P1.如果P2不是你写的...那就没辙了~
      

  2.   

    模块中输入:
    Option ExplicitPublic Const SYNCHRONIZE = &H100000
    Public Const INFINITE = &HFFFFFFFF
    Public Const WAIT_TIMEOUT = &H102&Declare Function OpenProcess Lib "kernel32" (ByVal dwDesiredAccess As Long, ByVal bInheritHandle As Long, ByVal dwProcessId As Long) As Long
    Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
    Declare Function WaitForSingleObject Lib "kernel32" (ByVal hHandle As Long, ByVal dwMilliseconds As Long) As Long
    调用例子:Option ExplicitPrivate Sub Command1_Click()
        Dim pId As Long, pHnd As Long    pId = Shell("Notepad", vbNormalFocus)
        pHnd = OpenProcess(SYNCHRONIZE, 0, pId)
        If pHnd <> 0 Then
            WaitForSingleObject pHnd, INFINITE
            CloseHandle pHnd
        End If
    End Sub楼主最好考虑清楚再用这种方法,因为这种方法会让p1在等待p2结束期间完全不做任何事(不接受键盘鼠标输入、不处理窗口的描绘工作,甚至不接收任何消息),结果会让用户觉得p1好象死掉一样
      

  3.   

    用 MsgWaitForMultipleObjects 的话可以响应消息。
      

  4.   

    Declare Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As Long) As Long
    p1内代码
    WinExec p2,0 '执行外部程序
    SaveSetting "句并文件", "句并", "文件", text1.hwnd  '将句柄保存起来p2内代码
    aa = GetSetting("句并文件", "句并1", "文件", "") '从注册表中取出窗体句柄
    SendMessage aa, &HC2, 16, "Timer"
    p1内代码
    当text1.text接收到数据
    EnableWindow p1.hwnd, 1完成后
    EnableWindow p1.hwnd, 0
    [email protected]