有两个窗体,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获得焦点时,停止闪烁?(在窗体点击事件中写代码停止是可以的,但如果假设有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
Form1.Timer1.Enabled = False
End Sub
停止的时候 使form2获得焦点.Private Sub Command3_Click()
Form2.SetFocus
Timer1.Enabled = False
End Sub
Private Sub Command3_Click()
Timer1.Enabled = False
Form2.SetFocus
End Sub
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
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
BringWindowToTop 好像在两个窗体之间才有用,如果只有一个form,需要在模块中BringWindowToTop ,则没有效果哦,不知道怎么一回事
麻烦你贴个代码出来学习一下,谢谢!
不行的话改成 showwindow me.hwnd, SW_SHOWNOACTIVATE
//好像不要hook一样可以有那样的效果
这也不是什么hook,只是子类化,其它还有什么好的办法我还没有想到。
http://www.wtobase.com/download/demo1.rar
他实现了检测是否有一个实例在运行,如果运行,则打开前一个实例的功能
另外,他实现了弹出气球的功能。现在的问题有:1、运行一个Demo.exe,将其最小化,再运行一个Demo.exe,则会将前面最小化的程序打开,并闪烁。但出现的问题是:闪烁完毕后,窗口停在灰色状态(我希望停在焦点状态);另外,有时候不能打开前面最小化的程序。2、单击Command1,弹出气球,单击气球的X键,即关闭按钮,则窗体会闪动(我希望能不闪动),如果注释掉让该窗体处于Foreground的代码,则窗体会是灰色(我希望会是焦点状态)3、单击Command2,窗体会闪烁,我已经限制闪烁4次,但是我希望如果我在窗体中单击一下,或者任何使窗体处于焦点状态的方法,窗体就停止闪烁(这个要求跟Microsoft公司的附带效果是一样的)
希望大虾能帮我解决问题后,发回我的邮箱,谢谢!!!
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
' 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
http://www.wtobase.com/download/demo1.rar
他实现了检测是否有一个实例在运行,如果运行,则打开前一个实例的功能
另外,他实现了弹出气球的功能。现在的问题有:1、运行一个Demo.exe,将其最小化,再运行一个Demo.exe,则会将前面最小化的程序打开,并闪烁。但出现的问题是:闪烁完毕后,窗口停在灰色状态(我希望停在焦点状态);另外,有时候不能打开前面最小化的程序。2、单击Command1,弹出气球,单击气球的X键,即关闭按钮,则窗体会闪动(我希望能不闪动),如果注释掉让该窗体处于Foreground的代码,则窗体会是灰色(我希望会是焦点状态)3、单击Command2,窗体会闪烁,我已经限制闪烁4次,但是我希望如果我在窗体中单击一下,或者任何使窗体处于焦点状态的方法,窗体就停止闪烁(这个要求跟Microsoft公司的附带效果是一样的)
希望大虾能帮我解决问题后,发回我的邮箱,谢谢!!!