有一窗体,上面有几个按钮及文本框等控件。现在我想在这个窗体失去焦点的时候,也就是单击这个窗体以外的任何一个地方(肯定不在这个窗体的范围之内),这个窗体就自动 unload me
我在窗体的LostFocus事件中加入 unload me,但不管用。我调用API函数SetCapture,捕捉鼠标的位置,然后再ReleaseCapture,这样倒是可以卸载,但窗体内的几个其它的控件失效了,就在SetCapture后失效了,苦思不得解决,不知哪位大侠可以指点一二?

解决方案 »

  1.   

    Deactivate事件中加入unload me]  由于当前的焦点不是窗体,而是窗体的某个控件,所以窗体的LostFocus事件并不响应!
      

  2.   

    可用SendMessage函数,当窗体失去焦点后向windows发送一个消息,卸载窗体!
      

  3.   

    to hulianchi(需要帮助):这样不可以,因为LostFocus事件在Deactivate事件之前发生,放在LostFocus事件中都不行,何况Deactivate事件呢?to muchtrouble2003(难题多多):
    SendMessage函数需要指定一个要接收消息的那个窗口的句柄,我不能确定下一个得到焦点的是哪一个窗口,也许是其它程序的窗口。所以这两种方法都行不通,请大家再指点!
      

  4.   

    Private Sub Form_Load()
      OldWindowProc = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf NewWindowProc) '设置相关的窗口信息
    End Sub
    ’模块Public OldWindowProc 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 Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Const GWL_WNDPROC = (-4)
    Public Const WM_ACTIVATE = &H6
    Public Const WA_ACTIVE = 1
    Public Const WA_CLICKACTIVE = 2
    Public Const WA_INACTIVE = 0Public Function NewWindowProc(ByVal hwnd As Long, ByVal msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long '注意不要在这里面运行类似 Form1Show 或 End 等等破坏性的操作
        If msg = WM_ACTIVATE Then
            If (wParam = WA_ACTIVE Or wParam = WA_CLICKACTIVE) Then
                Form1.Caption = "活动窗口"   '窗口得到焦点时
            Else
                Form1.Caption = "非活动窗口"  '窗口失去焦点时
                Unload Form1   '关闭
            End If
        End If
      NewWindowProc = CallWindowProc(OldWindowProc, hwnd, msg, wParam, lParam)
    End Function