这里地址的方法也是可用的,但是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/50930221public 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-closeconst 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);//获得HWNDwnd.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

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

  1. CAD怎么快速查看图纸?如何打开dwg图纸进行查看呢?

    对于不少从事建筑或者设计的小伙伴们来说,平时对于各种图纸格式是再熟悉不过了.例如.psd格式,.png格式和.PDF格式,但对于dwg格式你又有多少了解呢?像我们常见的CAD格式dwg格式图纸怎么进行 ...

  2. 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开

    在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开 教程的运行环境: IntelliJ IDEA 2020.1.2 (Ultimate Edition)   在 IntelliJ ...

  3. mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...

    LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件 ...

  4. Excel VBA 打开对话框,获取文件夹路径

    Excel 打开对话框,获取文件夹路径 'Window「参照」ダイアログで選択したItem 名を取得 Public Function GetFolderName(ByVal DialogType As ...

  5. 用迅雷下载的视频,文件夹打开是空的,文件夹有大小,也没有隐藏文件的解决办法

    用迅雷下载的视频,文件夹打开是空的,文件夹有大小,也没有隐藏文件的解决办法 如果有2个文件名一样的,删除其中那个是0大小的,则另一位文件夹就有东西了.

  6. 打开html文件进入文件索引,打开网站网页是文件夹目录怎么办

    文章简介 正常来说打开网页都可正常显示网页,却在换空间之后,打开二级目录却不是显示网站网页,而是显示服务器文件夹中的所有html文件及文件夹目录,这是一个网友问过的问题,相信不少网友也曾经碰到过类似或 ...

  7. IDEA打开选中文件所在资源管理器位置

    方法一:用IDEA自带的打开选中文件所在资源管理器位置的功能,就在右键菜单中 方法二:将打开文件位置按钮配在工具栏上 1.显示工具栏:勾选View-Appearance-Toolbar 2.工具栏-右 ...

  8. cad.net 利用win32api实现一个命令开关参照面板

    首先我要判断是否已经打开了参照面板. 然而cad自己没有相关的系统变量.这时我就需要利用到win32api来判断程序是否打开了参照面板了. 首先学习的是 https://blog.csdn.net/b ...

  9. windows系统中通过 运行(win+R) 的方式打开电脑程序或文件夹

    或许你有这样的经历,在电脑(win系统)中,按下win徽标加R键会弹出 "运行对话框",里面输入 notepad,mspaint,snippingtool等后会出来系统的程序,那么 ...

最新文章

  1. ubuntu 修改时区、时间、同步网络时间、将时间写入硬件
  2. 使用Python实现真正意义上的随机数,谁能破解奖励1千万
  3. 《java多线程编程实战指南 核心篇》读书笔记二
  4. Oracle使用ini启动,python操作ini类型配置文件的实例教程
  5. (二)AS给button添加点击事件
  6. Service Mesh微服务熔断、限流的骚操作
  7. 计算机usb端口没反应,电脑usb端口没反应怎么办,详细教您如何处理
  8. ADODB.Recordset 错误 '800a0e7d' 的解决方法
  9. 中国石油焦市场供需态势及投资潜力预测报告2021年版
  10. python根据身高计算标准体重_有谁知道如何根据身高计算标准体重
  11. cocos creator制作微信抖音小游戏《黄金矿工》
  12. 高分辨率遥感卫星影像在交通方面的应用
  13. 用我们的奋斗和梦想扬起青春的船帆
  14. 【SQL注入】CTF练习题WriteUp——“百度杯”CTF比赛 九月场SQL
  15. leetcode每日一题第三十二天-剑指 Offer 65. 不用加减乘除做加法(easy??middle了吧)
  16. [《关于外婆家的一些记忆》闲笔记事集]2012年1月22日
  17. ansible主机清单和动态主机清单
  18. 盈亏计算html,外汇交易中如何计算盈亏? -
  19. 天津私立学校计算机教师工资,私立中学教师工资真的高,平均年薪收入最少20万...
  20. XXTEA加密流程分析

热门文章

  1. apache ii评分怎么评_APACHEII评分说明
  2. 七自由度机械臂设计分析——待更新
  3. 全屏功能-实现全屏-图标切换
  4. 去TB!登上了上海最高峰!
  5. 在网站中使用一些字体是否会构成侵权?
  6. 根据出生年月日算出实际的月龄
  7. 微信分享内容给朋友、朋友圈、QQ、QQ空间等
  8. IT男潘加宇:老婆在孩子班级群里怒怼数学老师
  9. 微信小程序 - 修改 button 边框和背景色
  10. xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx