|
成功例を示します。
下記コードを標準モジュールに記してください。
testを一度実行して、シャットダウン(ログアウト、再起動でも可)すると
「ついにWM_QUERYENDSESSIONを検知した!!」と表示され、OKクリックで
Bookを保存して、通常のシャットダウン処理を実行します。
ありがとうございました。
Option Explicit
'コールバック関数をセット
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'デフォルトの処理へ
Private 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
'ウィンドウのハンドルを取得
Private Declare Function FindWindow Lib "USER32.dll" Alias "FindWindowA" _
(ByVal lpClassName As Any, ByVal lpWindowName As Any) As Long
Private Const GWL_WNDPROC = (-4) '定数?
Public lngRet As Long 'デフォルトの処理のアドレス
Private Sub test()
'今回の実行用
Dim strClassName As String
Dim strWindowName As String
Dim lngHwnd As Long
'エクセル自身なので
strClassName = "XLMAIN"
'ハンドルを取得
lngHwnd = FindWindow(strClassName, strWindowName)
lngRet = SetWindowLong(lngHwnd, GWL_WNDPROC, _
AddressOf SubWindowProcedure)
End Sub
Private Function SubWindowProcedure(ByVal hWnd As Long, _
ByVal iMsg As Long, ByVal wParam As Long, _
ByVal lParam As Long) As Long
Dim lngDefProp As Long
'ここから、独自処理
Const WM_QUERYENDSESSION = &H11
If iMsg = WM_QUERYENDSESSION Then
MsgBox ("ついにWM_QUERYENDSESSIONを検知した!!")
ThisWorkbook.Save
End If
'ここまで
'デフォルトウィンドウプロシージャの実行
SubWindowProcedure = CallWindowProc(lngRet, hWnd, iMsg, _
wParam, lParam)
End Function
|
|