使用 IShellBrowser封裝類,如何獲得Follder select event
uj5u.com熱心網友回復:
class ATL_NO_VTABLE CSyncCloudEx :public CComObjectRootEx<CComSingleThreadModel>,
public CComCoClass<CSyncCloudEx, &IID_IComponentRegistrar>,
public IDispatchImpl<IComponentRegistrar, &IID_IComponentRegistrar, &LIBID_CloudDiskLib>,
// public IPersistFile,
public IShellBrowser
{
public:
DECLARE_REGISTRY_RESOURCEID(IDR_CLOUDDISK)
DECLARE_PROTECT_FINAL_CONSTRUCT()
BEGIN_COM_MAP(CSyncCloudEx)
COM_INTERFACE_ENTRY(IComponentRegistrar)
COM_INTERFACE_ENTRY(IDispatch)
// COM_INTERFACE_ENTRY(IPersistFile)
COM_INTERFACE_ENTRY(IShellBrowser)
END_COM_MAP()
CSyncCloudEx(void);
~CSyncCloudEx(void);
public:
STDMETHOD(Load)( LPCOLESTR wszFile, DWORD dwMode );
STDMETHOD(CompareIDs)(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2);
// STDMETHOD(OnViewWindowActive)(IShellView *pshv);
// STDMETHOD(BrowseObject)(LPCITEMIDLIST pidl, UINT wflags);
// int CALLBACK BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData);
//LRESUL CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam);
// STDMETHOD(QueryService)(REFGUID guidService, REFIID riid, char ppv);
STDMETHOD(EnumObjects)(HWND hwnd, SHCONTF grfFlags, IEnumIDList **ppenumIDList);
};
uj5u.com熱心網友回復:
CSyncCloudEx::CSyncCloudEx(void){
// EnumerateFolder(LPCTSTR path)
}
CSyncCloudEx::~CSyncCloudEx(void)
{
}
STDMETHODIMP CSyncCloudEx::Load(LPCOLESTR wszFile, DWORD dwMode)
{
return S_OK;
}
STDMETHODIMP CSyncCloudEx::CompareIDs(LPARAM lParam, PCUIDLIST_RELATIVE pidl1, PCUIDLIST_RELATIVE pidl2)
{
MessageBox(NULL, L"Test event.", L"test", MB_OK);
switch(lParam)
{
case SHCIDS_ALLFIELDS:
break;
case SHCIDS_CANONICALONLY:
break;
//case PCUIDLIST_RELATIVE:
// break;
}
return S_OK;
}
//STDMETHODIMP OnViewWindowActive(IShellView *pshv)
//{
// MessageBox(NULL, L"Test event.", L"test", MB_OK);
// return 0;
//}
//STDMETHODIMP BrowseObject(LPCITEMIDLIST pidl, UINT wflags)
//{
// MessageBox(NULL, L"Test event.", L"test", MB_OK);
// return 0;
//}
//int CALLBACK CSyncCloudEx::BrowseCallbackProc(HWND hwnd,UINT uMsg,LPARAM lParam,LPARAM lpData)
//{
// MessageBox(NULL, L"Test event.", L"test", MB_OK);
//
// return 0;
//}
//STDMETHODIMP CSyncCloudEx::QueryService(REFGUID guidService, REFIID riid, char ppv)
//{
// MessageBox(NULL, L"Test event.", L"test", MB_OK);
// return 0;
//}
//LRESUL CALLBACK CSyncCloudEx::WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
//{
// return 0;
//}
STDMETHODIMP EnumObjects(HWND hwnd, SHCONTF grfFlags, IEnumIDList **ppenumIDList)
{
MessageBox(NULL, L"Test event.", L"test", MB_OK);
return 0;
}
uj5u.com熱心網友回復:
https://www.cnblogs.com/qingtian224/p/5566901.htmluj5u.com熱心網友回復:
int CALLBACK BrowserCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData){
switch (uMsg) {
case BFFM_INITIALIZED:
MessageBox(hwnd, L"Test event......1", L"test", MB_OK);
break;
case BFFM_SELCHANGED:
MessageBox(hwnd, L"Test event......2", L"test", MB_OK);
break;
case BFFM_VALIDATEFAILED:
MessageBox(hwnd, L"Test event......3", L"test", MB_OK);
break;
default:
break;
}
return 0;
}
無法獲得資源管理器(explorer)的click event
uj5u.com熱心網友回復:
int CALLBACK BrowseCallbackProc(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData) 也試過uj5u.com熱心網友回復:
如何獲得資源管理器(floder explorer) click folder/file eventuj5u.com熱心網友回復:
資源管理器自己有實作IShellBrowser不需要你再寫一個。資源管理器對IWebBrowser2的實作就是給Document屬性回傳當前的ShellFolderView。等DWebBrowserEvents2::NavigateComplete2事件觸發的時候,去往document的當前值上掛DShellFolderViewEvents::SelectionChanged就行了。當然BeforeNavigate2和退出的時候要取消對這個事件的偵聽不然會有泄漏。
從資源管理器的IShellWindows獲得IWebBrowser2的方法參考https://devblogs.microsoft.com/oldnewthing/20040720-00/?p=38393.之后就可以掛DWebBrowserEvents2了。
既然用ATL了,怎么掛事件不用人教吧。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/46938.html
上一篇:QT參考com組件的引數不匹配的
