如何在Winforms ListView中获取资源管理器右键菜单?

发布于 2024-08-22 05:13:13 字数 126 浏览 7 评论 0原文

我正在使用 Winforms ListView 来显示一些文件,但除了像资源管理器那样显示文件之外,我还希望在右键单击其中的项目时获得相同的资源管理器右键单击菜单。

这可能吗?如何为我的 ListView 应用程序启用它?

I am using a Winforms ListView to show some files, but other than showing the files like explorer does, I want to have the same explorer right click menu when you get when you right click an item inside.

Is this possible? How do I enable it for my ListView app?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

守不住的情 2024-08-29 05:13:13

我知道执行此操作的唯一方法是使用 pinvoke 和 COM 来执行此操作。我认为您想要的非托管 API 是 SHCreateDefaultContextMenu() 。完成互操作后(首先检查 pinvoke.net),您可以对 DEFCONTEXTMENU。这并不容易。欢迎来到 PIDL 的土地。

The only way I know of to do this is to use pinvoke and COM to do it. The unmanaged API you want, I think, is SHCreateDefaultContextMenu(). Once you get the interop done (check pinvoke.net first), you can do the interop for all the other things required by DEFCONTEXTMENU. It won't be easy. Welcome to the land of PIDLs.

如歌彻婉言 2024-08-29 05:13:13

实际上,我在右键单击时无法显示自定义上下文菜单:来自的不稳定行为ContextMenu

我的实现仍然略有不同:

    private void lstModules_MouseDown(object sender , MouseEventArgs e)
    {
        hitTest = lstModules.HitTest(e.Location);

        switch (e.Button)
        {
            case MouseButtons.Right:
                if (hitTest != null && hitTest.Item != null)
                {
                    // right clicking an item in the listview
                    selectedModule = hitTest.Item.Name;

                    lstModules.ContextMenuStrip = mnuContext_OptionsA;
                }
                else
                { 
                    // right clicking in white area of listview
                    lstModules.ContextMenuStrip = mnuContext_OptionsB; 
                }
                break;
        }
    }

I was actually having trouble getting a custom context menu to show with a right click: Erratic Behavior from ContextMenu

I still implemented slightly different:

    private void lstModules_MouseDown(object sender , MouseEventArgs e)
    {
        hitTest = lstModules.HitTest(e.Location);

        switch (e.Button)
        {
            case MouseButtons.Right:
                if (hitTest != null && hitTest.Item != null)
                {
                    // right clicking an item in the listview
                    selectedModule = hitTest.Item.Name;

                    lstModules.ContextMenuStrip = mnuContext_OptionsA;
                }
                else
                { 
                    // right clicking in white area of listview
                    lstModules.ContextMenuStrip = mnuContext_OptionsB; 
                }
                break;
        }
    }
咽泪装欢 2024-08-29 05:13:13

您将需要 IContextMenu 界面。另请参阅这个非常有用的系列

You would need the IContextMenu interface. Also see this very useful series.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文