Re[3]: 最小化イベントの取得方法


[コメントツリー表示を見る] [発言時刻順表示を見る]

Posted by Uz on 2000/11/06 10:37:12

In Reply to: Re[2]: 最小化イベントの取得方法 Posted by HIRAKIN on 2000/11/06 09:53:54


    > 最小化中にタスクトレイのイベントをとる部分だけは現在使用しています。
    > しかし、疑問があるのです。
    > サブクラス化って、複数のプロシージャに対して同時に状態作成、解放を
    > 行っても問題ないのでしょうか?
    > (Windowsの横取りしたいイベント処理を同時に複数作成して、
    > 後で全部元に戻してやれば問題ないのでしょうか?)

    「複数のプロシージャ」ってとこがいまいちよくわかんないんですが、
    複数のhWndをサブクラス化したいってことでしょうか?
    つまり、WindowProcの処理をする関数を複数作りたい?
    だったら、多分Public変数に持っている
    デフォルトのウィンドウプロシージャのアドレスの保存を
    別の変数にすればいいと思いますよ。

    対象のhWndの数が可変であれば
    GWL_USERDATAを使ってフォーム自体にWindowProcを持たせて、
    デフォルトのウィンドウプロシージャのアドレスの保存もフォーム
    に持たせることも出来ます。

    ちょっと処理が難しいので、例をあげると

    ----標準モジュール-------
    Public Function frmProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Dim frm As Form
    Dim pObj As Long

    pObj = GetWindowLong(hWnd, GWL_USERDATA)
    CopyMemory frm, pObj, 4
    frmProc = frm.WindowProc(hWnd, uMsg, wParam, lParam)
    CopyMemory frm, 0&, 4
    End Function

    ----フォーム-------
    Private m_wndprcNext As Long

    Private Sub SubClass()
    UnSubClass
    Debug.Assert GetWindowLong(hWnd, GWL_USERDATA) = 0
    SetWindowLong hWnd, GWL_USERDATA, ObjPtr(Me)
    m_wndprcNext = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf frmProc)
    End Sub

    Private Sub UnSubClass()
    If m_wndprcNext Then
    SetWindowLong hWnd, GWL_WNDPROC, m_wndprcNext
    SetWindowLong hWnd, GWL_USERDATA, 0&
    m_wndprcNext = 0
    End If
    End Sub

    Friend Function WindowProc(ByVal hWnd As Long, ByVal uMsg As Long, ByVal wParam As Long, ByVal lParam As Long) As Long
    Select Case uMsg
    Case WM_LBUTTONDBLCLK
    Debug.Print "WM_LBUTTONDBLCLK"
    End Select
    WindowProc = CallWindowProc(m_wndprcNext, hWnd, uMsg, wParam, ByVal lParam)
    End Function



    > イマイチ安定性の面で確信が持てないのです。
    確かにサブクラス化は極力避けるべきでしょうね。
    ある種、VBの壁を強引に越えてますから。

    p.s.ちなみにタスクトレイのイベント取得にMouseMoveイベントを
      代用するテクニックもありますよ。(VB増強作戦に)


記事スレッド一覧