找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 9574|回复: 7

[开源] VB6实现的自动停靠窗体

[复制链接]

1214

主题

352

回帖

11

精华

管理员

菜鸟

积分
93755

贡献奖关注奖人气王精英奖乐于助人勋章

发表于 2007-3-11 13:52:27 | 显示全部楼层 |阅读模式
1、新建EXE工程。
2、添加模块,键入以下代码:
  1. '----------- 说明 -----------------
  2. '修改Private Const Margin As Long 的值可以改变吸附距离
  3. '将本模块考入你的程序,然后在你的代码中写入Hook和Unhook即可
  4. '
  5. '----------------------------------------------------------------
  6. Public Declare Function SystemParametersInfo Lib "user32.dll" Alias "SystemParametersInfoA" ( _
  7.      ByVal uAction As Long, _
  8.      ByVal uParam As Long, _
  9.      lpvParam As Any, _
  10.      ByVal fuWinIni As Long) As Long '去掉lpvParam的Byval修饰符才可以正常工作
  11.      
  12. Public Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" ( _
  13.      ByVal hwnd As Long, _
  14.      ByVal nIndex As Long, _
  15.      ByVal dwNewLong As Long) As Long
  16. Public Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" ( _
  17.      ByVal hwnd As Long, _
  18.      ByVal nIndex As Long) As Long
  19. Public Declare Function CallWindowProc Lib "user32.dll" Alias "CallWindowProcA" ( _
  20.      ByVal lpPrevWndFunc As Long, _
  21.      ByVal hwnd As Long, _
  22.      ByVal msg As Long, _
  23.      ByVal wParam As Long, _
  24.      ByVal lParam As Long) As Long
  25. Public Declare Sub CopyMemory Lib "kernel32.dll" Alias "RtlMoveMemory" ( _
  26.    Destination As Any, _
  27.    Source As Any, _
  28.    ByVal Length As Long)
  29.      
  30.      
  31. Public Type WINDOWPOS
  32.     hwnd As Long
  33.     hWndInsertAfter As Long
  34.     x As Long
  35.     y As Long
  36.     cx As Long
  37.     cy As Long
  38.     flags As Long
  39. End Type
  40. Public Type RECT
  41.     Left As Long
  42.     Top As Long
  43.     Right As Long
  44.     Bottom As Long
  45. End Type
  46. Public Const SPI_GETWORKAREA As Long = 48
  47. Public Const GWL_WNDPROC As Long = -4
  48. Public Const WM_WINDOWPOSCHANGING As Long = &H46
  49. Global lpPrevWndProc As Long
  50. Global gHW As Long
  51. Private Const Margin As Long = 20
  52. Public Sub Hook()
  53.    lpPrevWndProc = SetWindowLong(gHW, GWL_WNDPROC, AddressOf WindowProc)
  54. End Sub
  55. Public Sub Unhook()
  56.    Dim temp As Long
  57.    temp = SetWindowLong(gHW, GWL_WNDPROC, lpPrevWndProc)
  58. End Sub
  59. Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
  60. Dim lpwndpos As WINDOWPOS
  61. Dim WorkArea As RECT
  62.     If uMsg = WM_WINDOWPOSCHANGING Then
  63.       SystemParametersInfo SPI_GETWORKAREA, 0, WorkArea, 0
  64.       CopyMemory lpwndpos, ByVal lParam, Len(lpwndpos)
  65.       
  66.       If lpwndpos.x - WorkArea.Left < Margin And WorkArea.Left - lpwndpos.x < Margin Then lpwndpos.x = 0
  67.       If lpwndpos.y - WorkArea.Top < Margin And WorkArea.Top - lpwndpos.y < Margin Then lpwndpos.y = 0
  68.       If WorkArea.Right - lpwndpos.x - lpwndpos.cx < Margin And lpwndpos.x + lpwndpos.cx - WorkArea.Right < Margin Then lpwndpos.x = WorkArea.Right - lpwndpos.cx
  69.       If WorkArea.Bottom - lpwndpos.y - lpwndpos.cy < Margin And lpwndpos.y + lpwndpos.cy - WorkArea.Bottom < Margin Then lpwndpos.y = WorkArea.Bottom - lpwndpos.cy
  70.       
  71.       CopyMemory ByVal lParam, lpwndpos, Len(lpwndpos)
  72.     End If
  73.    
  74.     WindowProc = CallWindowProc(lpPrevWndProc, hw, uMsg, wParam, lParam)
  75. End Function
复制代码
3、在Form1的代码中键入:
  1. Private Sub Form_Load()
  2.   gHW = Me.hwnd
  3.   Hook
  4. End Sub
  5. Private Sub Form_Unload(Cancel As Integer)
  6.   Unhook
  7. End Sub
复制代码
4、运行。
挺简单的。
【VB】QQ群:1422505加的请打上VB好友
【易语言】QQ群:9531809  或 177048
【FOXPRO】QQ群:6580324  或 33659603
【C/C++/VC】QQ群:3777552
【NiceBasic】QQ群:3703755

30

主题

96

回帖

0

精华

铂金会员

积分
1548
发表于 2007-3-13 11:55:07 | 显示全部楼层
<p>快速回复不能打中文字</p><p></p><p>我喜欢这代码</p>

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2007-3-14 18:52:41 | 显示全部楼层
<p>这个代码我也喜欢~~~~呵呵</p><p>中文问题,用鼠标点了一下就行的</p><p>有时焦点没有正确切换过去</p><p>因此就算看到光标在那里闪,也只能打E文,是吧</p><p></p>
我就是嗷嗷叫的老马了......

30

主题

96

回帖

0

精华

铂金会员

积分
1548
发表于 2007-3-25 11:30:08 | 显示全部楼层
怎么用啊???跟谁吸附???我怎么吸附不了??

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2007-3-26 16:35:58 | 显示全部楼层
<p>我也来一个:</p>
<p>&nbsp;</p>
<p><font face="Verdana"><a href="dispbbs.asp?boardid=28&amp;Id=1447">http://www.m5home.com/bbs/viewthread.php?tid=1447</a></font></p>
[此贴子已经被作者于2009-3-16 16:33:31编辑过]

nI8bD82C.rar

37.87 KB, 下载次数: 24978

VB6实现的自动停靠窗体

我就是嗷嗷叫的老马了......

275

主题

3017

回帖

1

精华

管理员

嗷嗷叫的老马

积分
17064

论坛牛人贡献奖关注奖最佳版主进步奖人气王疯狂作品奖精英奖赞助论坛勋章乐于助人勋章

QQ
发表于 2007-3-26 16:36:20 | 显示全部楼层
这个是仿QQ的
我就是嗷嗷叫的老马了......

0

主题

13

回帖

0

精华

铜牌会员

积分
246
发表于 2009-3-16 09:52:43 | 显示全部楼层
學習了,

15

主题

73

回帖

0

精华

金牌会员

菜鸟No.1

积分
765
发表于 2009-3-26 19:51:19 | 显示全部楼层
好东西除了要学习还要支持,支持楼主.
好好学习,天天想上!
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表