SetCapture试试看
或者拦截鼠标的消息。

解决方案 »

  1.   

    回复人: junwhj(junwhj.51.net) (  ) 信誉:100  2002-6-19 13:17:34  得分:150  
     
     
      '窗体
    VERSION 5.00
    Begin VB.Form Form1 
       Caption         =   "Form1"
       ClientHeight    =   1650
       ClientLeft      =   60
       ClientTop       =   345
       ClientWidth     =   4350
       LinkTopic       =   "Form1"
       ScaleHeight     =   1650
       ScaleWidth      =   4350
       StartUpPosition =   3  '窗口缺省
       Begin VB.CommandButton Command1 
          Caption         =   "Popup"
          Height          =   375
          Left            =   1440
          TabIndex        =   1
          Top             =   600
          Width           =   1455
       End
       Begin VB.PictureBox Picture1 
          Appearance      =   0  'Flat
          BackColor       =   &H80000005&
          ForeColor       =   &H80000008&
          Height          =   2295
          Left            =   360
          ScaleHeight     =   2265
          ScaleWidth      =   1785
          TabIndex        =   0
          Top             =   1920
          Visible         =   0   'False
          Width           =   1815
          Begin VB.TextBox Text1 
             Height          =   315
             Left            =   120
             TabIndex        =   2
             Top             =   120
             Width           =   1575
          End
       End
    End
    Attribute VB_Name = "Form1"
    Attribute VB_GlobalNameSpace = False
    Attribute VB_Creatable = False
    Attribute VB_PredeclaredId = True
    Attribute VB_Exposed = False
    Option ExplicitPrivate Sub Form_Load()
        m_Hwnd = Me.hwnd
    End SubPrivate Sub Command1_Click()
        Dim rc As RECT
        Call Hook
        GetWindowRect Command1.hwnd, rc
        SetWindowLong Picture1.hwnd, GWL_STYLE, WS_POPUP Or WS_BORDER
        SetWindowLong Picture1.hwnd, GWL_EXSTYLE, WS_EX_TOPMOST Or WS_EX_TOOLWINDOW
        SetParent Picture1.hwnd, 0
        Picture1.Move rc.Left * Screen.TwipsPerPixelX, (rc.Bottom + 2) * Screen.TwipsPerPixelY, Picture1.Width, Picture1.Height
        Picture1.Visible = True
        Call SetCapture(Picture1.hwnd)
    End SubPrivate Sub Picture1_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single)
        Picture1.Visible = False
        Call ReleaseCapture
        Call Unhook
    End SubPrivate Sub Picture1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If X > Text1.Left And X < Text1.Left + Text1.Width _
            And Y > Text1.Top And Y < Text1.Top + Text1.Height Then
            Call ReleaseCapture
            Call SetCapture(Text1.hwnd)
        Else
            Call SetCapture(Picture1.hwnd)
        End If
    End SubPrivate Sub Text1_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single)
        If X < 0 Or X > Text1.Width Or Y < 0 Or Y > Text1.Height Then
            Call ReleaseCapture
            Call SetCapture(Picture1.hwnd)
        End If
    End Sub
    '模块
    Option ExplicitPublic 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
    Public Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As Long
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
    Public Declare Function SetCapture Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare Function ReleaseCapture Lib "user32" () As Long
    Public Declare Function GetWindowRect Lib "user32" (ByVal hwnd As Long, lpRect As RECT) As LongPublic Type RECT
            Left As Long
            Top As Long
            Right As Long
            Bottom As Long
    End TypePublic Type POINTAPI
            X As Long
            Y As Long
    End TypePublic Const GWL_EXSTYLE = (-20)
    Public Const GWL_STYLE = (-16)
    Public Const GWL_HWNDPARENT = (-8)
    Public Const GWL_WNDPROC = (-4)Public Const WS_THICKFRAME = &H40000
    Public Const WS_VISIBLE = &H10000000
    Public Const WS_POPUP = &H80000000
    Public Const WS_BORDER = &H800000Public Const WS_EX_TOPMOST = &H8
    Public Const WS_EX_TOOLWINDOW = &H80Public Const WM_NCACTIVATE = &H86
    Public Const WM_ACTIVATEAPP = &H1CPublic m_Hwnd As Long
    Public m_Hook As Boolean
    Private m_PrevWndProc As LongPublic Sub Hook()
        If Not m_Hook Then
            m_PrevWndProc = SetWindowLong(m_Hwnd, GWL_WNDPROC, AddressOf WindowProc)
            m_Hook = True
        End If
    End SubPublic Sub Unhook()
        If m_Hook Then
            Call SetWindowLong(m_Hwnd, GWL_WNDPROC, m_PrevWndProc)
            m_Hook = False
        End If
    End SubPrivate Function WindowProc(ByVal hw As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        Select Case uMsg
            Case WM_NCACTIVATE
                WindowProc = CallWindowProc(m_PrevWndProc, hw, uMsg, 1, lParam)
            
            Case Else
                WindowProc = CallWindowProc(m_PrevWndProc, hw, uMsg, wParam, lParam)
                
        End Select
    End Function