PDA

View Full Version : Advice: Determine Excel in Edit Mode



Emily
02-02-2008, 09:49 PM
I found this code in China, may be somewhere else.
The code displays "Excel in edit mode ...." if Excel is in edit mode


'---------------------------------------------------------------------------------------
' Module : Module1
' DateTime :
' Author : wangmingbai
' Source : http://www.officefans.net/cdb/viewthread.php?tid=89034&extra=page%3D1
' Purpose : Determine Excel edit mode
'---------------------------------------------------------------------------------------

'//Get Class
Private Declare Function GetClassName _
Lib "user32" _
Alias "GetClassNameA" ( _
ByVal hwnd As Long, _
ByVal lpClassName As String, _
ByVal nMaxCount As Long) As Long

'//Define Hook
Public Declare Function SetWindowsHookEx _
Lib "user32" _
Alias "SetWindowsHookExA" ( _
ByVal idHook As Long, _
ByVal lpfn As Long, _
ByVal hmod As Long, _
ByVal dwThreadId As Long) As Long

'//End Hook
Public Declare Function UnhookWindowsHookEx _
Lib "user32" (ByVal hHook As Long) As Long

''//Next Hook
Public Declare Function CallNextHookEx _
Lib "user32" ( _
ByVal hHook As Long, _
ByVal nCode As Long, _
ByVal wParam As Long, _
lparam As Any) As Long

'' Get Current ID
Public Declare Function GetCurrentThreadId _
Lib "kernel32" () As Long
Public Const HCBT_SETFOCUS = 9
Public Const WH_CBT = 5
Public IHook As Long
Public IThreadId As Long
Public ClassName As String

'Set hook
Public Sub EnableHook()
If IHook = 0 Then
IThreadId = GetCurrentThreadId
IHook = SetWindowsHookEx(WH_CBT, AddressOf HookProc, Application.Hinstance, IThreadId)
End If
End Sub

' Cancel Hook
Public Sub FreeHook()
If IHook <> 0 Then
Call UnhookWindowsHookEx(IHook)
IHook = 0
End If
End Sub

'Show status
Public Function HookProc(ByVal nCode As Long, ByVal wParam As Long, ByVal lparam As Long) As Long
If nCode < 0 Then
HookProc = CallNextHookEx(IHook, nCode, wParam, lparam)
Exit Function
End If
If nCode = HCBT_SETFOCUS Then
ClassName = String(255, Chr(0))
GetClassName wParam, ClassName, 255
ClassName = Left(ClassName, InStr(ClassName, vbNullChar) - 1)
If ClassName = "EXCEL<" Or ClassName = "EXCEL6" Then
Application.StatusBar = "Excel in Edit mode....."
Else
Application.StatusBar = False
End If
End If
HookProc = CallNextHookEx(IHook, nCode, wParam, lparam)
End Function