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/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路径的文件夹(资源管理器)相关推荐
- CAD怎么快速查看图纸?如何打开dwg图纸进行查看呢?
对于不少从事建筑或者设计的小伙伴们来说,平时对于各种图纸格式是再熟悉不过了.例如.psd格式,.png格式和.PDF格式,但对于dwg格式你又有多少了解呢?像我们常见的CAD格式dwg格式图纸怎么进行 ...
- 在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开
在 IntelliJ IDEA 中,如何快速将选中文件用资源管理器打开 教程的运行环境: IntelliJ IDEA 2020.1.2 (Ultimate Edition) 在 IntelliJ ...
- mysql xp cmdshell_LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句...
LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件,生成mysql的LOAD语句 LOAD语句:利用MSSQL中的xp_cmdshell功能,将指定文件夹下的指定文件 ...
- Excel VBA 打开对话框,获取文件夹路径
Excel 打开对话框,获取文件夹路径 'Window「参照」ダイアログで選択したItem 名を取得 Public Function GetFolderName(ByVal DialogType As ...
- 用迅雷下载的视频,文件夹打开是空的,文件夹有大小,也没有隐藏文件的解决办法
用迅雷下载的视频,文件夹打开是空的,文件夹有大小,也没有隐藏文件的解决办法 如果有2个文件名一样的,删除其中那个是0大小的,则另一位文件夹就有东西了.
- 打开html文件进入文件索引,打开网站网页是文件夹目录怎么办
文章简介 正常来说打开网页都可正常显示网页,却在换空间之后,打开二级目录却不是显示网站网页,而是显示服务器文件夹中的所有html文件及文件夹目录,这是一个网友问过的问题,相信不少网友也曾经碰到过类似或 ...
- IDEA打开选中文件所在资源管理器位置
方法一:用IDEA自带的打开选中文件所在资源管理器位置的功能,就在右键菜单中 方法二:将打开文件位置按钮配在工具栏上 1.显示工具栏:勾选View-Appearance-Toolbar 2.工具栏-右 ...
- cad.net 利用win32api实现一个命令开关参照面板
首先我要判断是否已经打开了参照面板. 然而cad自己没有相关的系统变量.这时我就需要利用到win32api来判断程序是否打开了参照面板了. 首先学习的是 https://blog.csdn.net/b ...
- windows系统中通过 运行(win+R) 的方式打开电脑程序或文件夹
或许你有这样的经历,在电脑(win系统)中,按下win徽标加R键会弹出 "运行对话框",里面输入 notepad,mspaint,snippingtool等后会出来系统的程序,那么 ...
最新文章
- ubuntu 修改时区、时间、同步网络时间、将时间写入硬件
- 使用Python实现真正意义上的随机数,谁能破解奖励1千万
- 《java多线程编程实战指南 核心篇》读书笔记二
- Oracle使用ini启动,python操作ini类型配置文件的实例教程
- (二)AS给button添加点击事件
- Service Mesh微服务熔断、限流的骚操作
- 计算机usb端口没反应,电脑usb端口没反应怎么办,详细教您如何处理
- ADODB.Recordset 错误 '800a0e7d' 的解决方法
- 中国石油焦市场供需态势及投资潜力预测报告2021年版
- python根据身高计算标准体重_有谁知道如何根据身高计算标准体重
- cocos creator制作微信抖音小游戏《黄金矿工》
- 高分辨率遥感卫星影像在交通方面的应用
- 用我们的奋斗和梦想扬起青春的船帆
- 【SQL注入】CTF练习题WriteUp——“百度杯”CTF比赛 九月场SQL
- leetcode每日一题第三十二天-剑指 Offer 65. 不用加减乘除做加法(easy??middle了吧)
- [《关于外婆家的一些记忆》闲笔记事集]2012年1月22日
- ansible主机清单和动态主机清单
- 盈亏计算html,外汇交易中如何计算盈亏? -
- 天津私立学校计算机教师工资,私立中学教师工资真的高,平均年薪收入最少20万...
- XXTEA加密流程分析