1、电脑上安装了Clover,故资源管理器与一般电脑上不一样。Clover:http://cn.ejie.me/ 但是,想法应该是类似的。
2、Spy++:是一个基于 Win32(最新版本支持Win64) 的实用工具,它提供系统的进程、线程、窗口和窗口消息的图形视图。
用到的函数介绍:
EnumWindows:枚举所有屏幕上的顶层窗口
EnumChildWindows:枚举一个父窗口的所有子窗口
有了上述两个函数,可以先找到资源管理器的窗口,然后再找到子窗口地址栏所对应的那个窗口获取地址栏内地址。
代码:
1 /* 2 Test_5 - 无界面,获取当前目录,复制到剪贴板 3 ——20130516 4 */ 5 6 #include <windows.h> 7 8 #define MAXSIZE 100 9 10 BOOL CALLBACK lpEnumFunc(HWND hwnd, LPARAM lParam); //枚举窗口回调函数 11 BOOL CALLBACK lpEnumChildFunc(HWND hwnd,LPARAM lParam); //枚举子窗口回调函数 12 void CopyToClipboard(char *cd,HWND hwnd); //复制地址到剪贴板 13 14 char *name=NULL; //路径名保存数组 15 16 int main() 17 { 18 while (1) 19 { 20 EnumWindows(lpEnumFunc,0); 21 Sleep(1000); 22 } 23 24 return 0; 25 } 26 27 28 void CopyToClipboard(char *str,HWND hwnd) 29 { 30 GLOBALHANDLE hGlobal; 31 PTSTR pGlobal; 32 int length=strlen(str); 33 34 hGlobal=GlobalAlloc(GHND|GMEM_SHARE,length+1); 35 pGlobal=(char *)GlobalLock(hGlobal); 36 37 for(int i=0;i<length;i++) 38 *pGlobal++=*str++; 39 40 GlobalUnlock(hGlobal); 41 OpenClipboard(hwnd); 42 EmptyClipboard(); 43 SetClipboardData(CF_TEXT,hGlobal); 44 CloseClipboard(); 45 free(name); 46 } 47 48 BOOL CALLBACK lpEnumChildFunc(HWND hwnd,LPARAM lParam) 49 { 50 char childname[MAXSIZE]={0}; //存储子窗口的窗口名,即地址字符串 51 char childclass[MAXSIZE]={0}; //保存子窗口的类名 52 char child[]="ToolbarWindow32"; //用Spy++提前获得对应窗口的类名 53 int length; //地址字符串长度 54 int i; 55 56 GetWindowText(hwnd,childname,MAXSIZE); //根据子窗口句柄获得窗口名 57 GetClassName(hwnd,childclass,MAXSIZE); //获得子窗口类 58 59 if( strcmp(childname,"")!=0 && strcmp(childclass,child)==0 ){ 60 61 length=strlen(childname); 62 name=(char *)malloc(length-5); 63 64 //去除窗口名前的“地址:”子串 65 for(i=6;i<length;i++) 66 *(name+i-6)=childname[i]; 67 *(name+i-6)='\0'; 68 69 //调用函数——复制路径到剪贴板 70 CopyToClipboard(name,hwnd); 71 return false; 72 } 73 74 return 1; 75 } 76 77 78 79 BOOL CALLBACK lpEnumFunc(HWND wnd, LPARAM lParam) 80 { 81 char WindowName[MAXSIZE]={0}; 82 char windowclass[MAXSIZE]={0}; 83 84 char cloverclass[]="Clover_WidgetWin_0"; //用Spy++提前获取窗口类 85 86 if (IsWindowVisible(wnd)){ 87 GetWindowText(wnd,WindowName,MAXSIZE); //根据窗口句柄获得窗口名 88 GetClassName(wnd,windowclass,MAXSIZE); //获得窗口类 89 90 if(strcmp(cloverclass,windowclass)==0){ 91 EnumChildWindows(wnd,lpEnumChildFunc,0); 92 return false; 93 } 94 } 95 96 return 1; 97 }