0

WebBrowser コントロールを備えた Windows フォーム デスクトップ アプリケーションがあります。サーバー上のディレクトリに移動して、webBrowser1.Navigate(new Uri("\\\\srvername\\share\\directory\\"))ユーザーがそのディレクトリからファイルを開くことができるようにします。

ここに画像の説明を入力

ファイルをダブルクリックすると、毎回 Windows セキュリティ メッセージが表示されます。

ここに画像の説明を入力

[OK] をクリックすると、必要に応じてファイルが開きます。

ローカル ディレクトリへの移動を設定するとwebBrowser1.Navigate(new Uri("C:\\Temp\\"));、メッセージが表示されません。

これが表示されないようにするプログラム的な方法はありますか、それとも信頼できるサイトとしてブラウザに追加する必要がありますか? ネットワークの標準ユーザーには、信頼済みサイトを追加するためのアクセス権がありません。IE のローカル イントラネット セクションにある [すべてのネットワーク パス UNC を含める] を確認しようとしました。

私が試してみました

webBrowser1.ScriptErrorsSuppressed = true;

しかし、コントロールに表示された Web ページからスクリプト エラーが発生することを意図しているように見えるため、これは機能しません。

4

1 に答える 1

0

さて、私は私の質問に対して2つの解決策を見つけました。

出来ますか?@jacobと私のすべての調査が示唆しているように、そうではないと思います。WebBrowser コントロールを使用してローカルまたは UNC パスを表示する場合は、IE のセキュリティを変更するか、開いているすべてのファイルのメッセージを処理する必要があります。

解決策 #1
IE のセキュリティ設定を変更します。私の組織ではすべてがロックされているため、IE 設定の変更はグループ ポリシーを介してのみ行うことができます。

  1. file://servername/*目的のドメイン OU のグループ ポリシーを介してイントラネット ゾーンに追加します。
  2. 目的のドメイン OU のグループ ポリシーを介して、IE 設定の「IFRAME 内のアプリケーションとファイルの起動」ポリシーを有効にします。

解決策 #2
アプリの webBrowser コントロールを、同じ機能を実行できる他のコントロールに置き換えます。これは私が行ったものなので、ファイルとディレクトリのすべての作業をより詳細に制御できます。また、セキュリティ設定とグループ ポリシーの適用が正しく、正しく機能していることを心配する必要もありません。また、これらの領域の変化が私に影響を与えることを心配する必要もありません。

始めた時の記事はこちら

そのままのウォークスルーはかなりうまく機能します。プロジェクトに統合する前に、1回限りのプロジェクトでそれを試しました。自分に合うようにいくつか変更する必要があります。これが私のコードです。いくつかの変更を加え、いくつかの選択/クリック イベントを追加しました。

    Boolean FocusTreeview = false;

    public frmMain()
    {
        InitializeComponent();
        treeView1.NodeMouseClick += new TreeNodeMouseClickEventHandler(treeView1_NodeMouseClick);
    }

    // Start by calling this.
    private void PopulateTreeView()
    {
        TreeNode rootNode;

        treeView1.Nodes.Clear();
        listView1.Items.Clear();

        DirectoryInfo info = new DirectoryInfo("Pass the root folder here.");

        // Add the root directory.
        if (info.Exists)
        {
            rootNode = new TreeNode(info.Name);
            rootNode.Tag = info;
            GetDirectories(info.GetDirectories(), rootNode);
            treeView1.Nodes.Add(rootNode);
            treeView1.Nodes[0].Expand();
            // This selects the root directory
            NodeSelect(rootNode);
        }
    }

    /********************************************/

    private void GetDirectories(DirectoryInfo[] subDirs, TreeNode nodeToAddTo)
    {
        // This will list all the directories and subdirectories
        TreeNode aNode;
        DirectoryInfo[] subSubDirs;
        foreach (DirectoryInfo subDir in subDirs)
        {
            aNode = new TreeNode(subDir.Name, 0, 0);
            aNode.Name = subDir.ToString();
            aNode.Tag = subDir;
            aNode.ImageKey = "Directory";
            subSubDirs = subDir.GetDirectories();
            if (subSubDirs.Length != 0)
            {
                GetDirectories(subSubDirs, aNode);
            }
            nodeToAddTo.Nodes.Add(aNode);
        }
    }

    /********************************************/

    private void NodeSelect(TreeNode newSelected)
    {
        //Load all the files and directorys in the selected node from the treeview
        listView1.Items.Clear();
        DirectoryInfo nodeDirInfo = (DirectoryInfo)newSelected.Tag;
        ListViewItem.ListViewSubItem[] subItems;
        ListViewItem item = null;

        foreach (DirectoryInfo dir in nodeDirInfo.GetDirectories())
        {
            item = new ListViewItem(dir.Name, 0);
            subItems = new ListViewItem.ListViewSubItem[]
              {new ListViewItem.ListViewSubItem(item, "Directory"), 
               new ListViewItem.ListViewSubItem(item, 
            dir.LastAccessTime.ToShortDateString())};
            item.SubItems.AddRange(subItems);
            listView1.Items.Add(item);
        }
        foreach (FileInfo file in nodeDirInfo.GetFiles())
        {
            item = new ListViewItem(file.Name, 1);
            subItems = new ListViewItem.ListViewSubItem[] { new ListViewItem.ListViewSubItem(item, "File"), new ListViewItem.ListViewSubItem(item, file.LastAccessTime.ToShortDateString()) };

            item.SubItems.AddRange(subItems);
            listView1.Items.Add(item);
        }

        listView1.AutoResizeColumns(ColumnHeaderAutoResizeStyle.HeaderSize);
    }

    /********************************************/

    void treeView1_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
    {
        TreeNode newSelected = e.Node;
        NodeSelect(newSelected);
    }

    /********************************************/

    private void listView1_SelectedIndexChanged(object sender, EventArgs e)
    {
        // When something is selected load it's contents to the listview if it is a directory
        if (listView1.SelectedItems.Count > 0)
        {
            var item = listView1.SelectedItems[0];

            // Don't do anything if it's just a file
            if (item.SubItems[1].Text == "File")
            {
                return;
            }

            TreeNode[] tns = treeView1.Nodes.Find(item.Text, true);
            if (tns.Length > 0)
            {
                treeView1.Focus();
                NodeSelect(tns[0]);
                treeView1.SelectedNode = tns[0];
                tns[0].Expand();
                FocusTreeview = true;
            }
        }
    }

    /********************************************/

    private void listView1_MouseUp(object sender, MouseEventArgs e)
    {
        // This needs to be done so the directory appears to stay selected in the treeview
        if (FocusTreeview == true)
        {
            treeView1.Focus();
            FocusTreeview = false;
        }
    }

    /********************************************/

    private void listView1_DoubleClick(object sender, EventArgs e)
    {
        // This will open the files that are double clicked on
        if (listView1.SelectedItems.Count > 0)
        {
            var item = listView1.SelectedItems[0];

            // Don't do anything for directories
            if (item.SubItems[1].Text == "Folder")
            {
                return;
            }

            // Open the selected file
            Process.Start(globals.szJobFolderPath + item.Text);

        }
    }

こんな感じに仕上がりました。

ここに画像の説明を入力

Word ドキュメントなどの既知のファイルのアイコンは失われますが、それは私にとって大したことではありません。画像リストに必要な既知のファイル タイプのアイコンを追加し、リストビューに項目を追加するセクションに if ステートメントを配置する (またはケースを切り替える) ことができます。ファイル拡張子を分析するだけです。

これがいつか誰かに役立つことを願っています!

于 2016-01-20T21:25:04.977 に答える