急...超难度挑战的问题...消息,API...在线等...

evjen 2008-12-17 11:20:13
一个程序只有一个窗体a
另一个程序也只有一个窗体b.
a先运行,窗体隐藏。
当b运行后,a捕获到b的句柄并依附在b的下面。

当b移动a也跟着b移动,类似磁性窗体.

b对外界透露的始终只有它的句柄...

上述过程怎么能够实现...
谢谢各位了...
在线等...
...全文
154 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
Tiger_Zhao 2008-12-18
  • 打赏
  • 举报
回复
新手请看看 http://community.csdn.net/IndexPage/SmartQuestion.aspx
标题要直白
evjen 2008-12-17
  • 打赏
  • 举报
回复
呵呵 谢谢啊
Tiger_Zhao 2008-12-17
  • 打赏
  • 举报
回复
动态调整 Timer.InterVal 大小,兼顾平滑移动和CPU耗用
Option Explicit

Private rcLast As RECT
Private EqualCount As Long

Private Sub Form_Load()
Timer1.Interval = 100
Timer1.Enabled = True
End Sub

Private 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
evjen 2008-12-17
  • 打赏
  • 举报
回复
实现了
但是看起来效果不太好
感觉抖动很厉害 没有磁性窗体那种效果
fj182 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 evjen 的回复:]
Timer比较占资源
如果不用timer 能不能用其他的东西了?
[/Quote]

对于现在的硬件来说,Timer占的那点资源可以忽略,除非代码写的特别糟糕。
evjen 2008-12-17
  • 打赏
  • 举报
回复
呵呵
还是用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

轮询怎么加上去???
僵哥 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 evjen 的回复:]
Timer比较占资源
如果不用timer 能不能用其他的东西了?
[/Quote]
让对方发消息告诉你。
如果是双向联动的话,任何一方在自己的窗体收到WM_WINDOWPOSCHANGING消息的时候禁止联动机制,直到收到WM_WINDOWPOSCHANGED.
联动操作只由某一方来进行,另一方面收到WM_WINDOWPOSCHANGED消息之后就只需要发一个消息告诉对方自己的位置产生了改变即可。
evjen 2008-12-17
  • 打赏
  • 举报
回复
能不能贴点示例代码出来啊
我主要是做asp.net的
由工作需要 又要弄vb
谢谢给位...
evjen 2008-12-17
  • 打赏
  • 举报
回复
Timer比较占资源
如果不用timer 能不能用其他的东西了?
僵哥 2008-12-17
  • 打赏
  • 举报
回复
需要的时候使用SetWindowPos更新本窗体在屏蔽上的位置。
僵哥 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 evjen 的回复:]
也可以做成楼上的效果
句柄可以取到,那么轮询状态怎么做啊???
[/Quote]
Timer+ API GetWindowRect(用于取得对方在屏幕上的位置)
evjen 2008-12-17
  • 打赏
  • 举报
回复
也可以做成楼上的效果
句柄可以取到,那么轮询状态怎么做啊???
fj182 2008-12-17
  • 打赏
  • 举报
回复
用VB做跨进程的子类不容易的。
或者可以用简单的办法,在A中拿到B的窗口句柄,轮询B的状态,然后调整A。
僵哥 2008-12-17
  • 打赏
  • 举报
回复
其实2和3只是说法上面或者入手的角度有所差别,所须的技术和达到的效果是一样的。
僵哥 2008-12-17
  • 打赏
  • 举报
回复
A和B存在于两个不同的进程当中,如果A和B都是自己写的,那么应该说至少可以有三种方法。
1.相对简单也比较容易实现,就是他们移动的消息进行“互通”从而完成特定的功能,这个可以通过自定义消息或者网络通讯等方式完成;
2.子类化这个不需要A做改动,但是由于牵涉到两个进程,所以要进行子类化需要一个中间的DLL,植入到A所在进程,这个比较好理解,但是实现难度会比较大;
3.通过消息钩子,这个也不需要A做改动,但由于某些消息钩子的需求,也跟2差不多需要一个中间DLL来完成,相比之下应该比2稍简单一点(通过全局消息钩子植入,比创建远程线程要容易完成)。
僵哥 2008-12-17
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 evjen 的回复:]
僵哥 能贴点代码出来吗
最好写个简单的例子
分不够可以加...
谢谢...
[/Quote]
别说是用VB,就算是用C++做起来也不容易。
evjen 2008-12-17
  • 打赏
  • 举报
回复
僵哥 能贴点代码出来吗
最好写个简单的例子
分不够可以加...
谢谢...
jinjazz 2008-12-17
  • 打赏
  • 举报
回复
真难...低调飘过
僵哥 2008-12-17
  • 打赏
  • 举报
回复
窗口子类化可以完成。

1,488

社区成员

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

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