C# 获取当前打开的文件夹

摘要:
最近做一个项目,有一个功能点需要获取当前打开的文件夹,网上查资料+自己摸索,整理出如下代码,鉴于网上完整的代码比较少,顾贴出来,以供参考。如有更好的建议,欢迎留言。因demo,故没有完整的异常验证,转载请注明出处~win7下测试通过,xp有点不一样,具体请用spy++查看classProgram{publicdelegateboolCallBack;//该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。//回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。

最近做一个项目,有一个功能点需要获取当前打开的文件夹,网上查资料+自己摸索,整理出如下代码,鉴于网上完整的代码比较少,顾贴出来,以供参考。如有更好的建议,欢迎留言。

因demo,故没有完整的异常验证,转载请注明出处~win7下测试通过,xp有点不一样,具体请用spy++查看
class Program
{
public delegate bool CallBack(int hwnd, int y);
//该函数枚举所有屏幕上的顶层窗口,并将窗口句柄传送给应用程序定义的回调函数。
//回调函数返回FALSE将停止枚举,否则EnumWindows函数继续到所有顶层窗口枚举完为止。
[DllImport("user32.dll")]
public static extern int EnumWindows(CallBack x, int y);
//该函数将指定窗口的标题条文本(如果存在)拷贝到一个缓存区内
[DllImport("user32.dll")]
public static extern int GetWindowText(int hwnd, StringBuilder lptrString, int nMaxCount);
//该函数获得一个指定子窗口的父窗口句柄
[DllImport("user32.dll")]
public static extern int GetParent(int hwnd);
//该函数获得给定窗口的可视状态。
[DllImport("user32.dll")]
public static extern bool IsWindowVisible(int hwnd);
//获取窗体类名
[DllImport("User32.Dll ")]
public static extern void GetClassName(IntPtr hwnd, StringBuilder s, int nMaxCount);
//获取窗体的子窗体句柄
[DllImport("User32.dll ")]
public static extern IntPtr FindWindowEx(IntPtr parent, IntPtr childe, string strclass, string FrmText);
///
/// 根据句柄获取类名
///
///
///
private string GetFormClassName(IntPtr ptr)
{
StringBuilder nameBiulder = new StringBuilder(255);
GetClassName(ptr, nameBiulder, 255);
return nameBiulder.ToString();
}
///
/// 根据句柄获取窗口标题
///
///
///
private string GetFormTitle(IntPtr ptr)
{
StringBuilder titleBiulder = new StringBuilder(255);
GetWindowText((int)ptr, titleBiulder, 255);
return titleBiulder.ToString();
}
public bool Report(int hwnd, int lParam)
{
int pHwnd = GetParent(hwnd);
//如果再没有父窗口并且为可视状态的窗口,则遍历
if (pHwnd == 0 && IsWindowVisible(hwnd) == true)
{
IntPtr cabinetWClassIntPtr = new IntPtr(hwnd);
string cabinetWClassName = GetFormClassName(cabinetWClassIntPtr);
//如果类名为CabinetWClass ,则为explorer窗口,可以通过spy++查看窗口类型
if (cabinetWClassName.Equals("CabinetWClass", StringComparison.OrdinalIgnoreCase))
{
//下面为一层层往下查找,直到找到资源管理器的地址窗体,通过他获取窗体地址
IntPtr workerWIntPtr = FindWindowEx(cabinetWClassIntPtr, IntPtr.Zero, "WorkerW", null);
IntPtr reBarWindow32IntPtr = FindWindowEx(workerWIntPtr, IntPtr.Zero, "ReBarWindow32", null);
IntPtr addressBandRootIntPtr = FindWindowEx(reBarWindow32IntPtr, IntPtr.Zero, "Address Band Root", null);
IntPtr msctls_progress32IntPtr = FindWindowEx(addressBandRootIntPtr, IntPtr.Zero, "msctls_progress32", null);
IntPtr breadcrumbParentIntPtr = FindWindowEx(msctls_progress32IntPtr, IntPtr.Zero, "Breadcrumb Parent", null);
IntPtr toolbarWindow32IntPtr = FindWindowEx(breadcrumbParentIntPtr, IntPtr.Zero, "ToolbarWindow32", null);
string title = GetFormTitle(toolbarWindow32IntPtr);
Console.WriteLine(title);
int index = title.IndexOf(':');
index++;
string path = title.Substring(index, title.Length - index);
Console.WriteLine(path);
}
}
return true;
}
static void Main(string[] args)
{
EnumWindows(new Program().Report, 0);
Console.ReadKey();
}
}

免责声明:文章转载自《C# 获取当前打开的文件夹》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇MockServer的测试思想与实现C#中ASCII码与字符串的互换下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

chineseChess

最近学习了chineseChess的Qt实现,把一些东西总结一下: 实现功能: 1.人人对战 2.人机对战 3.网络版 一、基础性工作:(人人对战) 1、棋盘和棋子的绘制(QPinter,drawLine(QPoint(0,0),QPoint(0,9))):   棋盘: 10行,9列,中间有楚河汉界;九宫格;兵和炮的梅花位置。   棋子:32颗棋子都是由圆圈...

sscanf函数用法详解

名称: sscanf() - 从一个字符串中读进与指定格式相符的数据. 函数原型: Int sscanf( string str, string fmt, mixed var1, mixed var2 … ); int scanf( const char *format [,argument]… ); 说明: sscanf与scanf类似,都是用于输入的,...

Math.radom()函数获取随机数组

Math.radom()函数获取随机数组   Math.radom()函数返回的是大于或等于0.0且小于1之间随机的double数。 利用Math.radom()函数获取随机整数数组的方法: 1 int[] source = new int[20]; 2 3 //获取随机数组 4 int i=0; 5...

function类型(c++11)

1.c++五大可调用的对象   可调用的对象常常作为泛型算法的实参 1)函数 2)函数指针 函数名其实也是函数指针,只不过函数名是一个常量指针,它的值不能改变,只能指向该函数,不能改变它的值让它指向别的函数 void fun1(int a) { cout << a << endl; } void fun2(int a)...

POJ NOI0113-05 素数回文数的个数(PKU2928)

问题链接:POJ NOI0113-05 素数回文数的个数。 原题出处:PKU2928 素数回文数的个数。 总时间限制: 1000ms 内存限制: 65536kB 描述 求11到n之间(包括n),既是素数又是回文数的整数有多少个。 输入 一个大于11小于1000的整数n。 输出 11到n之间的素数回文数个数。 样例输入 23 样例输出 1 提...

LeetCode——x 的平方根/有效的完全平方数

Q:实现int sqrt(int x)函数。计算并返回x的平方根,其中x 是非负整数。由于返回类型是整数,结果只保留整数的部分,小数部分将被舍去。 示例 1:输入: 4输出: 2示例 2:输入: 8输出: 2说明: 8 的平方根是 2.82842..., 由于返回类型是整数,小数部分将被舍去。 A:题目并不难,但不同的方法里面关于边界都有大大小小的坑。最好...