从IShellView实例获取列表视图控件句柄

时间:2019-02-01 14:47:28

标签: windows winapi

据我所知,文件资源管理器使用列表视图控件来显示文件。 (例如How do I arrange or sort the desktop icons in c#?)。

如果我有一个实现import requireGraphQLFile from 'require-graphql-file'; import {makeExecutableSchema } from 'apollo-server'; const schema1= requireGraphQLFile('./schema/schema1'); const schema2= requireGraphQLFile('./schema/schema2'); const schema3= requireGraphQLFile('./schema/schema3'); const schema = makeExecutableSchema({ typeDefs: [schema1,schema2, schema3], resolvers }); 的对象,是否可以获取可用于LVM消息的窗口句柄?像这样的https://docs.microsoft.com/en-us/windows/desktop/Controls/bumper-list-view-control-reference-messages这样的LVM消息需要将类型为HWND的句柄发送给消息。

2 个答案:

答案 0 :(得分:0)

就像Raymond Chen在其评论中解释的那样,除了在桌面上,不再使用ListView。

答案 1 :(得分:0)

在网上找到的以下函数将 DirectUIHWND 控件重新分类为熟悉的 SysListView32。但是,在您双击列表视图项并手动更改目录之前,更改不会传播。

请注意,每次转到不同的目录时,为该目录显示的列表视图都有不同的句柄,这使得对控件进行子类化的任务具有挑战性。

我仍然需要弄清楚如何使用以下功能恢复列表视图并刷新而不必使用鼠标双击。

void RevertExplorerToListView(HWND explorerHandle)

{ IShellWindows* shellWindow;

if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL, IID_IShellWindows,
    reinterpret_cast<void**>(&shellWindow))))
{
    VARIANT v;
    V_VT(&v) = VT_I4;
    IDispatch* dispatch;
    BOOL found = FALSE;

    for (V_I4(&v) = 0; !found && shellWindow->Item(v, &dispatch) == S_OK; V_I4(&v)++)
    {
        IWebBrowserApp* browserApp;

        if (SUCCEEDED
        (dispatch->QueryInterface(IID_IWebBrowserApp, reinterpret_cast<void**>(&browserApp))))
        {
            HWND appHandle;
            
            if(SUCCEEDED
            (browserApp->get_HWND(reinterpret_cast<LONG_PTR*>(&appHandle))) && appHandle == explorerHandle)
            {
                found = TRUE;
                IServiceProvider* provider;

                if (
                    SUCCEEDED(browserApp->QueryInterface(IID_IServiceProvider, reinterpret_cast<void**>(&provider))))
                {
                    IShellBrowser* browser;

                    if (
                        SUCCEEDED(provider->QueryService(SID_STopLevelBrowser, IID_IShellBrowser, reinterpret_cast<void**>(&browser))))
                    {
                        IFolderViewOptions* options;
                        if (SUCCEEDED(browser->QueryInterface(IID_IFolderViewOptions,
                            reinterpret_cast<void**>(&options))))
                        {
                            if (FAILED(options->SetFolderViewOptions(FVO_VISTALAYOUT, FVO_VISTALAYOUT)))
                            {
                            }
                            options->Release();
                        }
                        browser->Release();
                    }
                    provider->Release();
                }
            }
            browserApp->Release();
        }
    }
    shellWindow->Release();
}

}