zoukankan      html  css  js  c++  java
  • FolderBrowserDialogがWindows7環境で選択されたFolderを適切ないように表示事象

    一つの銀行内部システムがUpdateして、そもそもXPシステムの場合、順調で来たのに。

     Windows7の場合、 FolderBrowserDialogがうまく動作してなかった。

    調べて結果が、仕方ない。Windows Systemの既存Bugです。

     色々調査を書けて、結論として二つの対応方針があります。


    1、Windowチーム開発されたWindowsAPICodePack をDownloadして、

    そのMicrosoft.WindowsAPICodePack.Dialogsを参照して、下記の例にするばよい。

    CommonOpenFileDialog dialog = new CommonOpenFileDialog();
                dialog.InitialDirectory = @"C:UserswangjDocumentsWeChat Fileswxid_mw93g8weqm3e11Msg";
                dialog.IsFolderPicker = true;
                if (dialog.ShowDialog() == CommonFileDialogResult.Ok)
                {
                    textBox1.Text = dialog.FileName;
                }

    2、Windows APIを利用して。

        public static class FolderBrowserLauncher
        {
            /// <summary>
            /// Using title text to look for the top level dialog window is fragile.
            /// In particular, this will fail in non-English applications.
            /// </summary>
            const string _topLevelSearchString = "Browse For Folder";
            /// <summary>
            /// These should be more robust.  We find the correct child controls in the dialog
            /// by using the GetDlgItem method, rather than the FindWindow(Ex) method,
            /// because the dialog item IDs should be constant.
            /// </summary>
            const int _dlgItemBrowseControl = 0;
            const int _dlgItemTreeView = 100;
            [DllImport("user32.dll", SetLastError = true)]
            static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
            [DllImport("user32.dll")]
            static extern IntPtr GetDlgItem(IntPtr hDlg, int nIDDlgItem);
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            static extern IntPtr SendMessage(IntPtr hWnd, UInt32 Msg, IntPtr wParam, IntPtr lParam);
            /// <summary>
            /// Some of the messages that the Tree View control will respond to
            /// </summary>
            private const int TV_FIRST = 0x1100;
            private const int TVM_SELECTITEM = (TV_FIRST + 11);
            private const int TVM_GETNEXTITEM = (TV_FIRST + 10);
            private const int TVM_GETITEM = (TV_FIRST + 12);
            private const int TVM_ENSUREVISIBLE = (TV_FIRST + 20);
            private const int WM_CLOSE = 0x0010;
            /// <summary>
            /// Constants used to identity specific items in the Tree View control
            /// </summary>
            private const int TVGN_ROOT = 0x0;
            private const int TVGN_NEXT = 0x1;
            private const int TVGN_CHILD = 0x4;
            private const int TVGN_FIRSTVISIBLE = 0x5;
            private const int TVGN_NEXTVISIBLE = 0x6;
            private const int TVGN_CARET = 0x9;
            /// <summary>
            /// Calling this method is identical to calling the ShowDialog method of the provided
            /// FolderBrowserDialog, except that an attempt will be made to scroll the Tree View
            /// to make the currently selected folder visible in the dialog window.
            /// </summary>
            /// <param name="dlg"></param>
            /// <param name="parent"></param>
            /// <returns></returns>
            public static DialogResult ShowFolderBrowser(FolderBrowserDialog dlg, IWin32Window parent = null)
            {
                DialogResult result = DialogResult.Cancel;
                Thread t3 = new Thread(() => 
                {
                    int i = 30;
                    while (i>0)
                    {
                        i--;
                        System.Threading.Thread.Sleep(100);
                        IntPtr hwndDlg = FindWindow((string)null, _topLevelSearchString);
                        if (hwndDlg != IntPtr.Zero)
                        {
                            IntPtr hwndFolderCtrl = GetDlgItem(hwndDlg, _dlgItemBrowseControl);
                            if (hwndFolderCtrl != IntPtr.Zero)
                            {
                                IntPtr hwndTV = GetDlgItem(hwndFolderCtrl, _dlgItemTreeView);
                                if (hwndTV != IntPtr.Zero)
                                {
                                    IntPtr item = SendMessage(hwndTV, (uint)TVM_GETNEXTITEM, new IntPtr(TVGN_CARET), IntPtr.Zero);
                                    if (item != IntPtr.Zero)
                                    {
                                        //SendMessage(hwndTV, WM_CLOSE, IntPtr.Zero, item);
                                        SendMessage(hwndTV, TVM_ENSUREVISIBLE, IntPtr.Zero, item);
                                        //if(i>20)
                                        //    SendMessage(hwndTV, 0x0000, IntPtr.Zero, IntPtr.Zero);
                                        //retries = 0;
                                        //SendKeys.Send("{TAB}{TAB}{RIGHT}");
                                        
                                    }
                                }
                            }
                        }
                    }
                });
                t3.Start();
                result = dlg.ShowDialog(parent);
                return result;
            }
        }
    Love it, and you live without it
  • 相关阅读:
    js替换问题replace和replaceAll
    CSS截取标题...
    MVC FormCollection collection
    IE和FF判断浏览器是否安装了flash插件
    Uploadify上传插件不兼容FF、Chrome等Netscape浏览器
    jquery错误消息: “Date”未定义,“String”未定义
    正则表达式取出指定字符窜之间的字符窜
    WPF 开发前学习(二)
    WPF 中的树应用
    WCF 数据传输遇到的问题
  • 原文地址:https://www.cnblogs.com/tomclock/p/8040573.html
Copyright © 2011-2022 走看看