一个程序只有一个窗体a
另一个程序也只有一个窗体b.
a先运行,窗体隐藏。
当b运行后,a捕获到b的句柄并依附在b的下面。当b移动a也跟着b移动,类似磁性窗体.b对外界透露的始终只有它的句柄...上述过程怎么能够实现...
谢谢各位了...
在线等...

解决方案 »

  1.   

    别说是用VB,就算是用C++做起来也不容易。
      

  2.   

    A和B存在于两个不同的进程当中,如果A和B都是自己写的,那么应该说至少可以有三种方法。
    1.相对简单也比较容易实现,就是他们移动的消息进行“互通”从而完成特定的功能,这个可以通过自定义消息或者网络通讯等方式完成;
    2.子类化这个不需要A做改动,但是由于牵涉到两个进程,所以要进行子类化需要一个中间的DLL,植入到A所在进程,这个比较好理解,但是实现难度会比较大;
    3.通过消息钩子,这个也不需要A做改动,但由于某些消息钩子的需求,也跟2差不多需要一个中间DLL来完成,相比之下应该比2稍简单一点(通过全局消息钩子植入,比创建远程线程要容易完成)。
      

  3.   

    用VB做跨进程的子类不容易的。
    或者可以用简单的办法,在A中拿到B的窗口句柄,轮询B的状态,然后调整A。
      

  4.   

    Timer+ API GetWindowRect(用于取得对方在屏幕上的位置)
      

  5.   

    需要的时候使用SetWindowPos更新本窗体在屏蔽上的位置。
      

  6.   

    Timer比较占资源
    如果不用timer 能不能用其他的东西了?
      

  7.   

    能不能贴点示例代码出来啊
    我主要是做asp.net的
    由工作需要 又要弄vb
    谢谢给位...
      

  8.   

    让对方发消息告诉你。
    如果是双向联动的话,任何一方在自己的窗体收到WM_WINDOWPOSCHANGING消息的时候禁止联动机制,直到收到WM_WINDOWPOSCHANGED.
    联动操作只由某一方来进行,另一方面收到WM_WINDOWPOSCHANGED消息之后就只需要发一个消息告诉对方自己的位置产生了改变即可。
      

  9.   

    呵呵 
    还是用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轮询怎么加上去???
      

  10.   


    对于现在的硬件来说,Timer占的那点资源可以忽略,除非代码写的特别糟糕。
      

  11.   

    动态调整 Timer.InterVal 大小,兼顾平滑移动和CPU耗用
    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
      

  12.   

    新手请看看 http://community.csdn.net/IndexPage/SmartQuestion.aspx
    标题要直白