> 最小化中にタスクトレイのイベントをとる部分だけは現在使用しています。 > しかし、疑問があるのです。 > サブクラス化って、複数のプロシージャに対して同時に状態作成、解放を > 行っても問題ないのでしょうか? > (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増強作戦に)
|