比如已经打开一个实例(浏览器)
这个时候点外部链接的时候
不打开新窗体,让前一实例获得焦点
这个已经做到了If gOnlyOne = 0 Then '限制打开一个主窗体
    If App.PrevInstance Then
        '找到上一实例,让他最大化
        Dim WinWnd     As Long
        WinWnd = FindWindow("ThunderRT6MDIForm", vbNullString)
    
        ShowWindow WinWnd, SW_RESTORE
        SetForegroundWindow WinWnd
        
       Exit Sub
       End
    End If
End If
然后 怎么样向前一实例发送消息?并且让他捕获消息?消息的参数为 Command
在 main函数里接受外部参数,看是否是外部打开
gCommand = Command发送消息的方法SendMessage hwnd, gCommand, 65, 0可怎么样让前一实例捕获这个消息 并做出处理?

解决方案 »

  1.   

    这个问题可以简化为浏览器一 已经在运行浏览器二打开时候怎么样 把二的外部连接地址  
    ( main函数里 Command )传递给浏览器一浏览器一 接收到 并做出处理?大虾给个思路 谢谢!
      

  2.   

    思路:在浏览器2的BeforeNavigate2事件里,取消超链接导航,即设Cancel=True,然后将URL传递给浏览器1.
    Private Sub WebBrowser2_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean)
        Cancel = True
        Me.WebBrowser1.Navigate2 URL
    End Sub
      

  3.   

    如果是跨进试,亦可按以思路进行,只不过思路改为:
    1、使用内存映射文件共享两个进程中的IE控件的URL。
    2、当第二个进程中的IE控件开始导航时,取消导航,然后传递自定义消息给第一个进程,通知它读内存映射文件取URL。
    3、第一个进程得到URL后,使用Navigate2方法导航到指定的链接。
    4、激活第一个进程。
    注意事项:1、由于需要处理跨进程通信,故不能直接使用SendMessage传递URL。
    2、如果两个进程具有父子关系,可以使用管道进行进程间通讯。
      

  4.   

    思路:在浏览器2的BeforeNavigate2事件里,取消超链接导航,即设Cancel=True,然后将URL传递给浏览器1. 
    Private Sub WebBrowser2_BeforeNavigate2(ByVal pDisp As Object, URL As Variant, Flags As Variant, TargetFrameName As Variant, PostData As Variant, Headers As Variant, Cancel As Boolean) 
        Cancel = True 
        Me.WebBrowser1.Navigate2 URL 
    End Sub这个浏览器一没给人任何消息 怎么打开url 啊?如果是跨进试,亦可按以思路进行,只不过思路改为: 
    1、使用内存映射文件共享两个进程中的IE控件的URL。 
    2、当第二个进程中的IE控件开始导航时,取消导航,然后传递自定义消息给第一个进程,通知它读内存映射文件取URL。 
    3、第一个进程得到URL后,使用Navigate2方法导航到指定的链接。 
    4、激活第一个进程。 
    注意事项:1、由于需要处理跨进程通信,故不能直接使用SendMessage传递URL。 
    2、如果两个进程具有父子关系,可以使用管道进行进程间通讯。这个是可以的 有没有进程通信的例子可以解决这个问题?
      

  5.   

    '获取分配给一个字串标识符的消息编号
    private Declare Function RegisterWindowMessage Lib "user32" _
                    Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
    看看这个吧,前几天有一个贴子,一时间还找不到了
      

  6.   

    用DDE在你的程序里做好接收端然后直接DDE发送就可以了查查MSDN,有示例代码
      

  7.   

    自己收藏个~~~还没写过,嘿嘿.'DDE通讯示例
    'BY 嗷嗷叫的老马
    'http://www.m5home.com/
    '窗体上添加一个图片框(拖大点,要显示东西的...),一个按钮,名称为默认.
    '窗体的LinkMode设置为"1".
    '编译后,运行两份,点击按钮,可以在另一份实例中看到效果.Option ExplicitPrivate Sub Command1_Click()
        DDESendMessage "DDESendMessage=" & App.ThreadID
    End SubPrivate Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
        Picture1.Print CmdStr
        Cancel = False
    End SubPrivate Sub Form_Load()
        Me.Caption = App.ThreadID
    End SubPrivate Sub DDESendMessage(ByVal Msg As String)
        Dim theTime As Long
        
        With Picture1
            .LinkMode = vbLinkNone
            .LinkTopic = "Project1|Form1"
            .LinkMode = vbLinkManual
            .LinkExecute Msg
            theTime = .LinkTimeout
            .LinkTimeout = 10           '1秒超时
            .LinkMode = vbLinkNone
            .LinkTimeout = theTime
        End With
    End Sub