元スレッド EXCEL:他のソフトを使っている間に自動保存する http://okwave.jp/qa/q7600555.html
OKWaveの仕様でインデントが崩れ左寄せになるのを 直すのが面倒なので、必要な判定も削りました。
元スレッド EXCEL:他のソフトを使っている間に自動保存する http://okwave.jp/qa/q7600555.html
OKWaveの仕様でインデントが崩れ左寄せになるのを 直すのが面倒なので、必要な判定も削りました。
| Option Explicit | |
| Public m_timerid& 'タイマーID | |
| Public m_interval& 'インターバル値 | |
| Public m_flg As Boolean 'タイマーが有効/無効のフラグ | |
| Public m_hWnd As Long 'フック対象のウィンドウハンドル | |
| Public pOrgProc As Long '元のウィンドウプロシージャのアドレス | |
| 'タイマー開始 | |
| Public Declare Function SetTimer Lib "user32" _ | |
| (ByVal hWnd As Long, ByVal nIDEvent As Long, _ | |
| ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long | |
| 'タイマー終了 | |
| Public Declare Function KillTimer Lib "user32" _ | |
| (ByVal hWnd As Long, ByVal uIDEvent As Long) As Long | |
| 'ウィンドウメッセージ定数 | |
| Public Const GWL_WNDPROC = &HFFFC 'ウインドウプロシージャのアドレスを変更する | |
| '指定されたウィンドウの属性を変更する | |
| Public Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongW" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long | |
| '指定されたウィンドウプロシージャにメッセージ情報を渡す | |
| Public Declare Function CallWindowProc Lib "user32" Alias "CallWindowProcW" (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long | |
| Public Function DeactiveSaveStart() As Integer | |
| 'サブクラス化を開始する | |
| Dim hWnd As Long | |
| m_interval = 10000 'インターバル設定(1分) | |
| 'ウィンドウハンドルを取得する | |
| hWnd = Application.hWnd | |
| 'メッセージフックを開始する | |
| pOrgProc = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf DeactiveSaveProc) | |
| End Function | |
| Public Sub DeactiveSaveStop() | |
| 'サブクラス化を終了する | |
| Dim lngRet As Long | |
| KillTimer 0, m_timerid | |
| lngRet = SetWindowLong(Application.hWnd, GWL_WNDPROC, pOrgProc) | |
| pOrgProc = 0 | |
| m_flg = False | |
| End Sub | |
| Public Function DeactiveSaveProc(ByVal hWnd As Long, ByVal Msg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long | |
| 'ウインドウプロシージャにメッセージを渡す前にそれを横取りして必要な処理を実行する | |
| Dim intFlagActive As Integer | |
| Const WM_ACTIVATE = &H6 | |
| Const WA_INACTIVE = 0 | |
| If Msg = WM_ACTIVATE Then | |
| intFlagActive = wParam And &HFFFF& | |
| If intFlagActive = WA_INACTIVE Then | |
| Debug.Print "a" | |
| If Not m_flg Then | |
| Debug.Print "b" | |
| m_flg = True | |
| m_timerid = SetTimer(0, 0, m_interval, AddressOf TimerProc) | |
| End If | |
| End If | |
| End If | |
| 'デフォルトウィンドウプロシージャを呼び出す | |
| DeactiveSaveProc = CallWindowProc(pOrgProc, hWnd, Msg, wParam, lParam) | |
| End Function | |
| Public Sub TimerProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal idEvent As Long, ByVal dwTime As Long) | |
| KillTimer 0, idEvent | |
| Debug.Print "test1" | |
| m_flg = False | |
| End Sub |