イベント関連の調整(Tablacus Explorer)
今回のTablacus Explorerのイベント関連の調整では、イベントのDShellFolderViewEventsを処理するようにしました。
DShellFolderViewEventsのイベントを処理できるようにする為には
1.取得しているIShellViewからGetItemObject(SVGIO_BACKGROUND, ...)を使ってIDispatch(IShellFolderViewDual)を取得
2.取得したIDispatchからQueryInterfaceでIConnectionPointContainerを取得(これ以下の処理は自作のteAdvise関数を使用)
3.取得したIConnectionPointContainerからFindConnectionPoint(DIID_DShellFolderViewEvents, ...)を使ってIConnectionPointを取得
4.取得したIConnectionPointを使って自分のIDispatchを持ったコントロールをAdviseすればOK
これで、AdviseしたIDispatchのInvokeにイベントが飛んできます。
Tablacus Explorerで使っているイベントは
1.DISPID_SELECTIONCHANGED
シェルブラウザだけならIShellBrowser::OnStateChangeで選択が変わったイベントは取得できていたのですが、エクスプローラブラウザでは受け取れなかったので前のバージョンではListViewのメッセージを受信して処理していました。
2.DISPID_FILELISTENUMDONE
シェルブラウザでのナビゲート完了のタイミングを知るために使っています。エクスプローラブラウザではIExplorerBrowserEvents::OnNavigationCompleteを使っています。
3.DISPID_VIEWMODECHANGED
表示モードを切り替えると一行選択の解除がリセットされてしまうので、前は表示モードが変わりそうな場所に一行選択の解除を入れていました。マウスで使う場合は絶対に一行選択は使いにくいと思うんだけどなぁ……
詳しくはTablacus Explorerのソースコードを見て下さい。