废话不说!大神直接飘过、
直接简介;
代码语言:Visual Basic
代码作用:本代码直接采用重载Wndproc的方式构造一个可以吸附在屏幕顶部的窗口
'模块代码==========================================================
Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcA" (ByVal lpPrevWndFunc As Long, ByVal hwnd As Long, ByVal Msg As Long, _
ByVal wParam As Long, ByVal lParam As Long) As Long
Declare Sub CopyMemory Lib "KERNEL32" Alias "RtlMoveMemory" ( lpvDest As Any, lpvSource As Any, ByVal cbCopy As Long)
Public Const GWL_WNDPROC = (-4)
Public Const WM_WINDOWPOSCHANGING = &H46
Type WINDOWPOS
hwnd As Long
hWndInsertAfter As Long
x As Long
y As Long
cx As Long
cy As Long
flags As Long
End Type
Public preWinProc As Long
Public Function wndproc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
Dim lwd As Long, hwd As Long
If Msg = WM_WINDOWPOSCHANGING Then
Dim WPOS As WINDOWPOS
CopyMemory WPOS, ByVal lParam, Len(WPOS)
If WPOS.y < 20 Then WPOS.y = 0
CopyMemory ByVal lParam, WPOS, Len(WPOS)
End If
wndproc = CallWindowProc(preWinProc, hwnd, Msg, wParam, lParam)
End Function
'窗口代码===========================================================
Private Sub Form_Load()
Dim ret As Long
preWinProc = GetWindowLong(Me.hwnd, GWL_WNDPROC)
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, AddressOf wndproc)
End Sub
Private Sub Form_Unload(Cancel As Integer)
Dim ret As Long
ret = SetWindowLong(Me.hwnd, GWL_WNDPROC, preWinProc)
End Sub
‘==================================================================
相信很多人看到代码都是一个想法,直接贴到程序里,这里我还是希望大家注意代码的理解;
这样你可以做到的不仅仅是代码能够实现的功能,你可以常识这改代码,然后写属于自己的代码,来实现更多的功能!
对于以上代码不做解释;可以修改If WPOS.y < 20 Then WPOS.y = 0
这个判断条件来实现更多的功能,相信经过一番尝试就会懂的!提示注意消息WM_WINDOWPOSCHANGING 的结构;
可以查查各个参数的含义,当然猜也猜得到!