一个程序只有一个窗体a
另一个程序也只有一个窗体b.
a先运行,窗体隐藏。
当b运行后,a捕获到b的句柄并依附在b的下面。当b移动a也跟着b移动,类似磁性窗体.b对外界透露的始终只有它的句柄...上述过程怎么能够实现...
谢谢各位了...
在线等...
另一个程序也只有一个窗体b.
a先运行,窗体隐藏。
当b运行后,a捕获到b的句柄并依附在b的下面。当b移动a也跟着b移动,类似磁性窗体.b对外界透露的始终只有它的句柄...上述过程怎么能够实现...
谢谢各位了...
在线等...
1.相对简单也比较容易实现,就是他们移动的消息进行“互通”从而完成特定的功能,这个可以通过自定义消息或者网络通讯等方式完成;
2.子类化这个不需要A做改动,但是由于牵涉到两个进程,所以要进行子类化需要一个中间的DLL,植入到A所在进程,这个比较好理解,但是实现难度会比较大;
3.通过消息钩子,这个也不需要A做改动,但由于某些消息钩子的需求,也跟2差不多需要一个中间DLL来完成,相比之下应该比2稍简单一点(通过全局消息钩子植入,比创建远程线程要容易完成)。
或者可以用简单的办法,在A中拿到B的窗口句柄,轮询B的状态,然后调整A。
如果不用timer 能不能用其他的东西了?
我主要是做asp.net的
由工作需要 又要弄vb
谢谢给位...
如果是双向联动的话,任何一方在自己的窗体收到WM_WINDOWPOSCHANGING消息的时候禁止联动机制,直到收到WM_WINDOWPOSCHANGED.
联动操作只由某一方来进行,另一方面收到WM_WINDOWPOSCHANGED消息之后就只需要发一个消息告诉对方自己的位置产生了改变即可。
还是用timer吧
关键是轮询 不知道怎么判断
Private Sub Form_Load()
Dim hand, rt As Long
Dim rc As RECT
hand = FindWindow(vbNullString, "b")
If hand Then
rt = GetWindowRect(hand, rc)
rc.Left = rc.Left * Screen.TwipsPerPixelX
rc.Right = rc.Right * Screen.TwipsPerPixelX
rc.Top = rc.Top * Screen.TwipsPerPixelY
rc.Bottom = rc.Bottom * Screen.TwipsPerPixelY
If rt > 0 Then
Me.Move rc.Left, rc.Bottom, rc.Right - rc.Left
End If
End If
End Sub轮询怎么加上去???
对于现在的硬件来说,Timer占的那点资源可以忽略,除非代码写的特别糟糕。
Option ExplicitPrivate rcLast As RECT
Private EqualCount As LongPrivate Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = True
End SubPrivate Sub Timer1_Timer()
Dim hand As Long, rc As RECT
hand = FindWindow(vbNullString, "b")
If hand <> 0 Then
Debug.Print Now(), Timer1.Interval, EqualCount
Call GetWindowRect(hand, rc)
If EqualRect(rc, rcLast) = 0 Then
rcLast = rc
rc.Left = rc.Left * Screen.TwipsPerPixelX
rc.Right = rc.Right * Screen.TwipsPerPixelX
rc.Top = rc.Top * Screen.TwipsPerPixelY
rc.bottom = rc.bottom * Screen.TwipsPerPixelY
Me.Move rc.Left, rc.bottom, rc.Right - rc.Left
'有移动就减小定时间隔
EqualCount = 0
If Timer1.Interval <> 1 Then Timer1.Interval = 1
Else
If EqualCount < 100 Then
EqualCount = EqualCount + 1
If EqualCount = 100 Then '0.1 秒没移动就增大定时间隔
Timer1.Interval = 100
End If
End If
End If
Else
If Timer1.Interval <> 100 Then Timer1.Interval = 100
End If
End Sub
标题要直白