有两个窗体,form1、form2form1中三个按钮,command1、command2、command3,一个timer1要实现窗体闪烁,但有两个问题:
1、如何在form2获得焦点时,停止闪烁?(在窗体点击事件中写代码停止是可以的,但如果假设有n个控件,那不是每个控件都要写点击事件去停止吗?)
2、为什么每次停止闪烁时,窗体都会处于灰色状态?怎么变成焦点状态?代码如下
Private Declare Function FlashWindow Lib "user32" (ByVal hWnd As Long, ByVal bInvert As Long) As LongPrivate Sub Command1_Click()
    Form2.Show
End SubPrivate Sub Command2_Click()
    Timer1.Enabled = True
End SubPrivate Sub Command3_Click()
    Timer1.Enabled = False
End SubPrivate Sub Form_Load()
    Timer1.Enabled = False
End SubPrivate Sub Timer1_Timer()
    Call FlashWindow(Form2.hWnd, True)
End Sub

解决方案 »

  1.   

    可以在form2的获得焦点的事件中写代码停止定时器.Private Sub Form_GotFocus()
    Form1.Timer1.Enabled = False
    End Sub
      

  2.   

    2.
    停止的时候 使form2获得焦点.Private Sub Command3_Click()
    Form2.SetFocus
    Timer1.Enabled = False
    End Sub
      

  3.   

    在点击command3的时候把焦点放在from2上:
    Private Sub Command3_Click()
        Timer1.Enabled = False
        Form2.SetFocus
    End Sub
      

  4.   

    ' 模块中的
    Public 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 SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Private loldWnd As Long
    Public Const WM_COMMAND = &H111
    Public Const GWL_WNDPROC = (-4)Public Function WindowProc(ByVal hwnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
        If Msg = WM_COMMAND Then
            Form1.Timer1.Enabled = False
        End If
        WindowProc = CallWindowProc(loldWnd, hwnd, Msg, wParam, lParam)   '执行窗体原有过程
    End Function
    Public Function HookWindow(ByVal hwnd As Long) As Long
        loldWnd = SetWindowLong(hwnd, GWL_WNDPROC, AddressOf WindowProc)  '子类化窗体
    End Function
    Public Function UnHook(ByVal hwnd As Long) As Long
        SetWindowLong hwnd, GWL_WNDPROC, loldWnd
    End Function
      

  5.   

    ' from2的
    Private Sub Form_Load()
        HookWindow Me.hwnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
        UnHook Me.hwnd
    End Sub' form1的Private Declare Function BringWindowToTop Lib "user32" (ByVal hwnd As Long) As Long
    Private Declare Function FlashWindow Lib "user32" (ByVal hwnd As Long, ByVal bInvert As Long) As Long
    Private Sub Command1_Click()
        Form2.Show
    End Sub
    Private Sub Command2_Click()
        Timer1.Interval = 300
        Timer1.Enabled = True
    End Sub
    Private Sub Command3_Click()
        Timer1.Enabled = False
        BringWindowToTop Form2.hwnd
    End Sub
    Private Sub Form_Load()
        Timer1.Enabled = False
    End Sub
    Private Sub Timer1_Timer()
        Call FlashWindow(Form2.hwnd, True)
    End Sub
      

  6.   

    晕啊,wwqna(york)的方法还不错,可是单独一个项目测试就很好用,放到我的项目中就出问题
    BringWindowToTop 好像在两个窗体之间才有用,如果只有一个form,需要在模块中BringWindowToTop ,则没有效果哦,不知道怎么一回事
      

  7.   

    tztz520的方法测试过,如果form2中有其它控件,好像就不行,form2是空白的才行
      

  8.   

    wwqna(york)的方法为什么一定要hook呢?好像不要hook一样可以有那样的效果
      

  9.   

    楼主的问题主要能获得form2获得焦点的事件就可解决.可以用子类来获得form2的"获得焦点"事件
      

  10.   

    tztz520 你说的很对,那么怎么才能做到“可以用子类来获得form2的"获得焦点"事件”呢?
    麻烦你贴个代码出来学习一下,谢谢!
      

  11.   

    //BringWindowToTop ,则没有效果哦,不知道怎么一回事
    不行的话改成  showwindow me.hwnd, SW_SHOWNOACTIVATE
    //好像不要hook一样可以有那样的效果
    这也不是什么hook,只是子类化,其它还有什么好的办法我还没有想到。
      

  12.   

    这里是我写的程序的源代码:
    http://www.wtobase.com/download/demo1.rar
    他实现了检测是否有一个实例在运行,如果运行,则打开前一个实例的功能
    另外,他实现了弹出气球的功能。现在的问题有:1、运行一个Demo.exe,将其最小化,再运行一个Demo.exe,则会将前面最小化的程序打开,并闪烁。但出现的问题是:闪烁完毕后,窗口停在灰色状态(我希望停在焦点状态);另外,有时候不能打开前面最小化的程序。2、单击Command1,弹出气球,单击气球的X键,即关闭按钮,则窗体会闪动(我希望能不闪动),如果注释掉让该窗体处于Foreground的代码,则窗体会是灰色(我希望会是焦点状态)3、单击Command2,窗体会闪烁,我已经限制闪烁4次,但是我希望如果我在窗体中单击一下,或者任何使窗体处于焦点状态的方法,窗体就停止闪烁(这个要求跟Microsoft公司的附带效果是一样的)
    希望大虾能帮我解决问题后,发回我的邮箱,谢谢!!!
      

  13.   

    用子类处理窗体失去焦点跟获得焦点.'建一个模块,以下是模块的代码.
    Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
    ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPublic Declare Function DefWindowProc Lib "user32" Alias "DefWindowProcA" (ByVal hWnd As Long, ByVal _
    wMsg As Long, ByVal wParam As Integer, ByVal lParam As Long) As LongPublic 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 LongPublic Const WM_NCACTIVATE = &H86
    Public Const GWL_WNDPROC = (-4)
    Public OldWndProc&
    Public Function Hook&(ByVal hWnd1&)
    OldWndProc = SetWindowLong(hWnd1, GWL_WNDPROC, AddressOf NewWndProc)
    Hook = OldWndProc
    End FunctionPublic Sub UnHook(ByVal hWnd1&)
    SetWindowLong hWnd1, GWL_WNDPROC, OldWndProc
    End SubPublic Function NewWndProc&(ByVal hWnd1&, ByVal uMsg&, ByVal wParam&, ByVal lParam&)
    If uMsg = WM_NCACTIVATE Then
       If wParam = 0 Then '失去焦点
          
          Debug.Print "失去焦点"
       Else
          Debug.Print "获得焦点" '在这里处理获得焦点的事件
       End If
    End If
    NewWndProc = CallWindowProc(OldWndProc, hWnd1, uMsg, wParam, lParam)
    End Function'窗体代码.
    Private Sub Form_Load()
    Hook Me.hWnd
    End SubPrivate Sub Form_Unload(Cancel As Integer)
    UnHook Me.hWnd
    End Sub
      

  14.   

    天啊,晕倒!这点小事情还用子类?
    ' Form2 中的代码 , 注意是Activate 事件而不是 GotFocus 事件
    Private Sub Form_Activate()
        Form1.Timer1.Enabled = False
    End Sub
    ' Form1 中的代码
    Private Declare Function FlashWindow Lib "user32" (ByVal hWnd As Long, ByVal bInvert As Long) As LongPrivate Sub Command1_Click()
        Form2.Show
    End SubPrivate Sub Command2_Click()
        Timer1.Enabled = True
    End SubPrivate Sub Command3_Click()
        Timer1.Enabled = False
        Form2.SetFocus
    End SubPrivate Sub Form_Load()
        Timer1.Enabled = False
    End SubPrivate Sub Timer1_Timer()
        Call FlashWindow(Form2.hWnd, True)
    End Sub
      

  15.   

    呵呵,希望大家能帮我看看我的源代码,谢谢这里是我写的程序的源代码:
    http://www.wtobase.com/download/demo1.rar
    他实现了检测是否有一个实例在运行,如果运行,则打开前一个实例的功能
    另外,他实现了弹出气球的功能。现在的问题有:1、运行一个Demo.exe,将其最小化,再运行一个Demo.exe,则会将前面最小化的程序打开,并闪烁。但出现的问题是:闪烁完毕后,窗口停在灰色状态(我希望停在焦点状态);另外,有时候不能打开前面最小化的程序。2、单击Command1,弹出气球,单击气球的X键,即关闭按钮,则窗体会闪动(我希望能不闪动),如果注释掉让该窗体处于Foreground的代码,则窗体会是灰色(我希望会是焦点状态)3、单击Command2,窗体会闪烁,我已经限制闪烁4次,但是我希望如果我在窗体中单击一下,或者任何使窗体处于焦点状态的方法,窗体就停止闪烁(这个要求跟Microsoft公司的附带效果是一样的)
    希望大虾能帮我解决问题后,发回我的邮箱,谢谢!!!