vb怎么样让前一实例捕获这个消息 并做出处理?

jiangqiaohua 2008-03-21 10:42:02
比如已经打开一个实例(浏览器)
这个时候点外部链接的时候
不打开新窗体,让前一实例获得焦点
这个已经做到了

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

可怎么样让前一实例捕获这个消息 并做出处理?
...全文
120 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗷嗷叫的老马 2008-03-22
  • 打赏
  • 举报
回复
自己收藏个~~~还没写过,嘿嘿.

'DDE通讯示例
'BY 嗷嗷叫的老马
'http://www.m5home.com/
'窗体上添加一个图片框(拖大点,要显示东西的...),一个按钮,名称为默认.
'窗体的LinkMode设置为"1".
'编译后,运行两份,点击按钮,可以在另一份实例中看到效果.

Option Explicit

Private Sub Command1_Click()
DDESendMessage "DDESendMessage=" & App.ThreadID
End Sub

Private Sub Form_LinkExecute(CmdStr As String, Cancel As Integer)
Picture1.Print CmdStr
Cancel = False
End Sub

Private Sub Form_Load()
Me.Caption = App.ThreadID
End Sub

Private 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
嗷嗷叫的老马 2008-03-22
  • 打赏
  • 举报
回复
用DDE

在你的程序里做好接收端

然后直接DDE发送就可以了

查查MSDN,有示例代码
zzyong00 2008-03-21
  • 打赏
  • 举报
回复
'获取分配给一个字串标识符的消息编号
private Declare Function RegisterWindowMessage Lib "user32" _
Alias "RegisterWindowMessageA" (ByVal lpString As String) As Long
看看这个吧,前几天有一个贴子,一时间还找不到了
jiangqiaohua 2008-03-21
  • 打赏
  • 举报
回复
思路:在浏览器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、如果两个进程具有父子关系,可以使用管道进行进程间通讯。

这个是可以的 有没有进程通信的例子可以解决这个问题?
lyserver 2008-03-21
  • 打赏
  • 举报
回复
如果是跨进试,亦可按以思路进行,只不过思路改为:
1、使用内存映射文件共享两个进程中的IE控件的URL。
2、当第二个进程中的IE控件开始导航时,取消导航,然后传递自定义消息给第一个进程,通知它读内存映射文件取URL。
3、第一个进程得到URL后,使用Navigate2方法导航到指定的链接。
4、激活第一个进程。
注意事项:1、由于需要处理跨进程通信,故不能直接使用SendMessage传递URL。
2、如果两个进程具有父子关系,可以使用管道进行进程间通讯。
lyserver 2008-03-21
  • 打赏
  • 举报
回复
思路:在浏览器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
Sandrer 2008-03-21
  • 打赏
  • 举报
回复
子类化要处理该消息的窗口
jiangqiaohua 2008-03-21
  • 打赏
  • 举报
回复
这个问题可以简化为

浏览器一 已经在运行

浏览器二打开时候怎么样 把二的外部连接地址  
( main函数里 Command )

传递给浏览器一

浏览器一 接收到 并做出处理?

大虾给个思路 谢谢!

1,486

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧