微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 C# 中找到 CurrentViewMode 的等价物

如何解决在 C# 中找到 CurrentViewMode 的等价物

我正在浏览 webbrowser 控件中的本地文件夹,并且我使用的是 .NET 4.7:

webbrowser1.Navigate("C:/some_folder");

文件夹以垂直线显示 pdf,其中包含上次更新、大小和类型。 我只需要找到允许我在“马赛克视图”中显示此列表的属性,图标更大,并且没有任何额外信息,如上次更新、大小或文档类型...... 经过一番挖掘,我发现一些 vb.net 用户获得了属性 webbrowser.Document.Currentviewmode。我确实有 webbrowser.Document 但没有像 Currentviewmode 这样的东西......我想这应该是一件愚蠢的事情,因为这相当于右键单击并选择显示文档列表属性......)

感谢您的帮助

解决方法

根据我的研究,我在 webbrower.document 中找不到名为 CurrentViewMode 的直接属性。

但是,我找到了另一种方法来更改网络浏览器的视图。

这是您可以参考的代码示例。

 public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private const int LV_VIEW_ICON = 0x0;

        private const int LV_VIEW_DETAILS = 0x1;

        private const int LV_VIEW_SMALLICON = 0x2;

        private const int LV_VIEW_LIST = 0x3;

        private const int LV_VIEW_TILE = 0x4;

        private const int EM_HIDEBALLOONTIP = 0x1504;

        private const int LVM_SETVIEW = 0x108E;

        private const string ListViewClassName ="SysListView32";
        private static readonly HandleRef NullHandleRef = new HandleRef(null,IntPtr.Zero);

        [DllImport("user32.dll")]
        [return: MarshalAs(UnmanagedType.Bool)]
        private static extern bool EnumChildWindows(HandleRef hwndParent,EnumChildrenCallback lpEnumFunc,HandleRef  lParam);

        [DllImport("user32.dll")]
        private static extern IntPtr SendMessage(IntPtr hWnd,int Msg,IntPtr wParam,IntPtr lParam);

        [DllImport("user32.dll")]
        static extern uint RealGetWindowClass(IntPtr hwnd,[Out] StringBuilder pszType,uint cchType);

        private delegate bool EnumChildrenCallback(IntPtr hwnd,IntPtr lParam);

        private HandleRef listViewHandle;

        private void FindListViewHandle()
        {
            this.listViewHandle = NullHandleRef;

            EnumChildrenCallback lpEnumFunc = new EnumChildrenCallback(EnumChildren);

            EnumChildWindows(new HandleRef(this.webBrowser1,this.webBrowser1.Handle),lpEnumFunc,NullHandleRef);
        }
        private bool EnumChildren(IntPtr hwnd,IntPtr lparam)
        {
            StringBuilder sb = new StringBuilder(100);

            RealGetWindowClass(hwnd,sb,100);

            if (sb.ToString() == ListViewClassName)
                this.listViewHandle = new HandleRef(null,hwnd);

            return true;
        }

        private void Form1_Load(object sender,EventArgs e)
        {
            webBrowser1.Navigate("D:/pdf");
            comboBox1.Items.Add(LV_VIEW_ICON);
            comboBox1.Items.Add(LV_VIEW_DETAILS);
            comboBox1.Items.Add(LV_VIEW_SMALLICON);
            comboBox1.Items.Add(LV_VIEW_LIST);
            comboBox1.Items.Add(LV_VIEW_TILE);

        }

        private void button1_Click(object sender,EventArgs e)
        {
            FindListViewHandle();

            int view = Convert.ToInt32(comboBox1.SelectedItem);

            SendMessage((IntPtr)this.listViewHandle,LVM_SETVIEW,(IntPtr)view,(IntPtr)0);
        }
    }

更新代码说明:

首先,我们使用FindListViewHandle()在webbrowser中找到listview控件的句柄(listViewHandle),所以我使用EnumChildWindows方法来迭代子控件。

其次,我们可以使用combobox1来存储不同的listview样式。

第三,消息LVM_SETVIEW表示设置列表视图控件的视图。

最后,SendMessage 方法将在 webbrowser 中找到 listviewcontrol 并设置 list-view 控件的视图并通过组合框值设置其样式。

这里有一些参考资料来自 Microsoft doc,您可以参考。

LVM_SETVIEW message

EnumChildWindows

SendMessage

结果:

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?