cad.net 利用win32api实现不重复打开dwg路径的文件夹(资源管理器)

这里地址的方法也是可用的,但是net3.5不能使用  

为此我选择使用win32api的方式来遍历当前桌面所有资源管理器

 

        /// <summary>
        /// 不重复打开dwg路径的资源管理器
        /// </summary>
        [CommandMethod("JJ_OpenDwgFilePath")]
        public static void JJ_OpenDwgFilePath()
        {
            Database db = HostApplicationServices.WorkingDatabase;//当前的数据库
            Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
            ed.WriteMessage("\n****惊惊盒子-打开当前Dwg的目录");
            try
            {
                string dwgname = CadSystem.Getvar("dwgname");

                var filename1 = Intranet.GetUNCPath(db.Filename);
                var filename2 = CadSystem.Getvar("dwgprefix") + dwgname;

                var regex = new Regex(".dwt");//正则 
                //符合.dwt默认面板 || 文件不存在(这个才支持局域网)
                if (regex.IsMatch(filename1) || !File.Exists(filename2))
                {
                    ed.WriteMessage("\n你没有保存文件!");
                }
                else
                {
                    ShellWindows wins = new ShellWindows();//这个名字是为了兼容高版本(没想到吧
                    foreach (InternetExplorer item in wins)
                    {
                        if (item.LocationURL + "\\" + dwgname == filename2)
                        {
                            item.Quit();//关闭 
                        }
                    }
                    Process.Start("explorer", "/select," + filename2);//重开一个,防止选择状态被改变 
                }
            }
            catch (System.Exception e)
            {
                ed.WriteMessage(e.Message);
                throw e;
            }
        }

 

 

迭代器使用:

    public struct InternetExplorer
    {
        public IntPtr HWND { get; set; }//句柄
        public string LocationURL { get; set; }//文件夹路径
        public void Quit()//关闭文件夹
        {
            Win32api.QuitToolbar(HWND);
        }
    }

    /// <summary>
    /// 遍历桌面资源管理器
    /// </summary>
    public class ShellWindows : IEnumerable
    {
        private readonly ArrayList list;
        public IEnumerator GetEnumerator()
        {
            return (list as IEnumerable).GetEnumerator();
        }

        /// <summary>
        /// 获取桌面所有文件夹的路径
        /// </summary>
        /// <returns></returns>
        public ShellWindows()
        {
            var allDesktopWindows = Win32api.GetAllDesktopWindows();
            var lst = new List<InternetExplorer>();
            foreach (var item in allDesktopWindows)
            {
                if (item.className == "CabinetWClass")
                {
                    string a = item.windowName;
                    var fi = Win32api.FindWindowEx(item.hwnd, 0, "WorkerW", null);
                    if (fi != IntPtr.Zero)
                    {
                        fi = Win32api.FindWindowEx(fi, 0, "ReBarWindow32", null);
                        if (fi != IntPtr.Zero)
                        {
                            fi = Win32api.FindWindowEx(fi, 0, "Address Band Root", null);
                            if (fi != IntPtr.Zero)
                            {
                                fi = Win32api.FindWindowEx(fi, 0, "msctls_progress32", null);
                                if (fi != IntPtr.Zero)
                                {
                                    fi = Win32api.FindWindowEx(fi, 0, "Breadcrumb Parent", null);
                                    if (fi != IntPtr.Zero)
                                    {
                                        fi = Win32api.FindWindowEx(fi, 0, "ToolbarWindow32", null);//资源管理器
                                        //知识:toolbar上的按钮没有handler,要用发送通知信息
                                        if (fi != IntPtr.Zero)
                                        {
                                            StringBuilder sb = new StringBuilder(256);
                                            //获取窗口名称-路径地址
                                            Win32api.GetWindowText(fi, sb, sb.Capacity);
                                            string path = sb.ToString();
                                            path = path.Substring(4, path.Length - 4);//4表示"地址: "长度

                                            InternetExplorer ie = new InternetExplorer
                                            {
                                                HWND = item.hwnd,
                                                LocationURL = path
                                            };
                                            lst.Add(ie);
                                        }
                                    }
                                }
                            }
                        }

                    }
                }
            }
            list = new ArrayList(lst);
        }
    }
View Code

 

win32api使用:

#if !HC2019
#else
using GrxCAD.DatabaseServices;
using GrxCAD.EditorInput;
using GrxCAD.Geometry;
using GrxCAD.ApplicationServices;
using GrxCAD.Runtime;
#endif
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
namespace JingJingBoxDD
{ 
    public class Win32api
    {
        // https://blog.csdn.net/bcbobo21cn/article/details/50930221

        public delegate bool WNDENUMPROC(IntPtr hwnd, int lParam);

        /// <summary>
        /// 置前窗口
        /// </summary>
        /// <param name="hwnd"></param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool SetForegroundWindow(IntPtr hwnd);

        /// <summary>
        /// 枚举窗口 
        /// </summary>
        /// <param name="lpEnumFunc"></param>
        /// <param name="lParam"></param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool EnumWindows(WNDENUMPROC lpEnumFunc, int lParam);

        /// <summary>
        /// 获取窗口Text 
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="lpString"></param>
        /// <param name="nMaxCount"></param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int GetWindowText(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

        /// <summary>
        /// 获取窗口类名
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="lpString"></param>
        /// <param name="nMaxCount"></param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int GetClassName(IntPtr hwnd, [MarshalAs(UnmanagedType.LPWStr)]StringBuilder lpString, int nMaxCount);

        /// <summary>
        /// 窗口隐藏
        /// </summary>
        /// <param name="hwnd">窗口句柄</param>
        /// <returns></returns>
        [DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern bool IsWindowVisible(IntPtr hwnd);

        /// <summary>
        /// 查找子窗口
        /// </summary>
        /// <param name="hwnd"></param>
        /// <param name="hwndChildAfter"></param>
        /// <param name="lpszClass"></param>
        /// <param name="lpszWindow"></param>
        /// <returns></returns>
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(IntPtr hwnd, uint hwndChildAfter, string lpszClass, string lpszWindow);

        ///https://jingyan.baidu.com/article/c45ad29cd5fb58051653e278.html
        /// <summary>
        /// 发送消息
        /// </summary> 
        /// <returns></returns>  
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);

        /// <summary>
        /// 发送消息
        /// </summary> 
        /// <returns></returns>  
        [DllImport("user32.dll", SetLastError = true, CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, ref Rectangle lParam);

        /// <summary>
        /// 关闭文件夹
        /// </summary>
        /// <param name="hwnd"></param>
        public static void QuitToolbar(IntPtr hwnd)
        {
            // https://docs.microsoft.com/zh-cn/windows/desktop/winmsg/wm-close
            const int WM_CLOSE = 0x0010;
            SendMessage(hwnd, WM_CLOSE, IntPtr.Zero, IntPtr.Zero);
        }

        //窗口样式 
        public struct WindowInfo
        {
            public IntPtr hwnd;
            public string windowName;
            public string className;
        }

        /// <summary>
        /// 枚举所有桌面窗口
        /// </summary>
        /// <returns></returns>
        public static WindowInfo[] GetAllDesktopWindows()
        {
            //用来保存窗口对象 列表
            var wndList = new List<WindowInfo>();

            //枚举所有桌面窗口
            EnumWindows(delegate (IntPtr hWnd, int lParam)
            {
                WindowInfo wnd = new WindowInfo();
                StringBuilder sb = new StringBuilder(256);

                //获得HWND
                wnd.hwnd = hWnd;

                //获取窗口名称
                GetWindowText(hWnd, sb, sb.Capacity);
                wnd.windowName = sb.ToString();

                //获取窗口类
                GetClassName(hWnd, sb, sb.Capacity);
                wnd.className = sb.ToString();

                //添加到列表中
                wndList.Add(wnd);
                return true;
            }, 0);

            return wndList.ToArray();
        }
    }

}
View Code

 

这里有讨论如何通过shell32设置选择文件夹,但是我的程序是关掉所有相同的,再打开一个新的.就没有实现了

https://stackoverflow.com/questions/8182494/how-can-i-set-an-existing-explorer-exe-instance-to-select-a-file
//然后置前窗口 Win32api.SetForegroundWindow(item.HWND); 

转载于:https://www.cnblogs.com/JJBox/p/10383427.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值