www.pudn.com > sharewareluncher.zip > send_to_hd.c
#include#include #include #include "resource.h" #include "sharewareluncher.h" #define DEL_CANCEL 90001 //#define IDC_HAND 99999 //hand cursor typedef struct AAA { LPITEMIDLIST lpi; LPSHELLFOLDER lpsfParent; LPITEMIDLIST lpifq; }TVITEMDATA,*LPTVITEMDATA; typedef struct _STRRET1 { UINT uType; // One of the STRRET_* values union { LPWSTR pOleStr; // OLESTR that will be freed LPSTR pStr; // ANSI string that will be freed (needed?) UINT uOffset; // Offset into SHITEMID char cStr[MAX_PATH]; // Buffer to fill in (ANSI) } ;//DUMMYUNIONNAME; } STRRET1, *LPSTRRET1; typedef struct _FileOp { UINT uOp; BOOL bUpdate; BOOL bNoAsk; BOOL bNoFolder; }DOFILEOP,*LPDOFILEOP; extern HINSTANCE hInst; extern HWND hMainWnd; extern char szRunCommand[300]; extern HBITMAP hbmBkg; HWND hTreeWnd; char szFoldername[MAX_PATH],szDestFolder[MAX_PATH],szShowDest[MAX_PATH]; char szSourceFile[MAX_PATH]; char szThisFolder[MAX_PATH]; //in listview-IDC_SELECTSEND's dir char szForCheck[300]; //restore the szRunCommand NM_TREEVIEW *pNmTv=NULL; DOFILEOP dofileop={FO_COPY,FALSE,FALSE,FALSE}; BOOL bNoMsg=FALSE; BOOL bDelNoAsk=FALSE; HWND hTypeWnd; HWND hBaseWnd=NULL,hExternWnd=NULL; //treeview hwnd and sendproc hwnd RECT CDestRt; //change dest folder rect,in SendProc,for text control "目的文件夹" BOOL bInText=FALSE; //check mouse in text control "目的文件夹"? int nFocused=-1; //for in listview,if "shift" pressed,record the first item; BOOL CALLBACK WINAPI BrowserProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam); BOOL CALLBACK WINAPI MsgProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam); BOOL CALLBACK WINAPI SendProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam); BOOL CALLBACK WINAPI AskDelProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam); void FillTreeView(HWND hwndTreeView,LPSHELLFOLDER lpsf,LPITEMIDLIST lpifq, HTREEITEM hParent); BOOL GetName( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi, DWORD dwFlags, LPSTR lpFriendlyName) ; LPITEMIDLIST CopyITEMID( LPMALLOC lpMalloc, LPITEMIDLIST lpi) ; LPITEMIDLIST ConcatPidls( LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) ; LPITEMIDLIST GetFullyQualPidl( LPSHELLFOLDER lpsf, LPITEMIDLIST lpi) ; void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq,LPTV_ITEM lptvitem); int GetIcon( LPITEMIDLIST lpi, UINT uFlags) ; UINT GetSize(LPCITEMIDLIST pidl); LPITEMIDLIST Create(UINT cbSize); LPITEMIDLIST Next(LPCITEMIDLIST pidl); int WINAPI BrowseProc( HWND hwnd, UINT msg, LPARAM lParam, LPARAM lpData); int DelFile(LPSTR szfile); void DoCopy(void); void DoSend(void); void ResetFileOp(void); BOOL DoCheckCommand(void); void ExpandTree(void); void FillList(HWND hWnd); void FillSend(HWND hWnd,LPSTR szFileType); LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); void InitCol(HWND hWnd); void AddListview(HWND hWnd,LPSTR szDisplay,int i); HICON GetFileIcon(LPSTR lpi); void AddFileType(LPSTR s); void RestoreCheckCommand(void); //restore szRunCommand void UpdateDestFolder(void); //listview对话框“目的文件夹” void ChangeShortcut(void) { //MessageBox(GetFocus()," } void DelShortcut(void) { //Errmsg("del link will write later"); } void SendToHD(void) { wsprintf(szForCheck,szRunCommand); if(hBaseWnd==NULL) { if(DialogBox(hInst,MAKEINTRESOURCE(IDD_BROWSER),hMainWnd,(DLGPROC)BrowserProc)) DoCopy(); ResetFileOp(); } else { SetForegroundWindow(hBaseWnd); SendMessage(hBaseWnd,MYWM_ICON,0,0); } } #pragma argsused BOOL CALLBACK WINAPI BrowserProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam) { switch(uMsg) { case WM_INITDIALOG: { HIMAGELIST hImageList; LPSHELLFOLDER lpsf = 0 ; SHFILEINFO sfi; HRESULT hr ; hBaseWnd=hWnd; hTreeWnd=GetDlgItem(hWnd,IDC_LISTALL); hImageList = (HIMAGELIST)SHGetFileInfo((LPCSTR)"C:\\", 0, &sfi, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ; if( hImageList) TreeView_SetImageList(hTreeWnd, hImageList, 0) ; hr=SHGetDesktopFolder( &lpsf) ; if( SUCCEEDED(hr)) { TreeView_DeleteAllItems( hTreeWnd); FillTreeView( hTreeWnd, lpsf, NULL, TVI_ROOT) ; ExpandTree(); TreeView_SelectItem(hTreeWnd,TreeView_GetRoot(hTreeWnd));//,TVGN_FIRSTVISIBLE); } if( lpsf) lpsf -> lpVtbl -> Release( lpsf) ; } break ; case MYWM_ICON: //临时借用,该对话框运行时再有"send to sharewareluncher" if(hExternWnd!=NULL) //可更新正运行(如果)的listview对话框内容 { UpdateDestFolder(); SetDlgItemText(hExternWnd,IDC_DESTFOLDER,szDestFolder); PostMessage(hExternWnd,MYWM_ICON,0,0); } break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: if(hExternWnd!=NULL) { SetForegroundWindow(hExternWnd); break; } hBaseWnd=NULL; EndDialog(hWnd,TRUE); return TRUE; case IDCANCEL: if(hExternWnd!=NULL) { SetForegroundWindow(hExternWnd); break; } hBaseWnd=NULL; wsprintf(szDestFolder,"\0"); EndDialog(hWnd,FALSE); return FALSE; case IDHELP: if(hExternWnd!=NULL) { SetForegroundWindow(hExternWnd); break; } if(DialogBox(hInst,MAKEINTRESOURCE(IDD_SENDTO),hMainWnd,(DLGPROC)SendProc)) ;//Errmsg("wait to complete");//DoCopy(); break; case IDC_MOVE: if(IsDlgButtonChecked(hWnd,IDC_MOVE)==BST_CHECKED) { dofileop.uOp=FO_MOVE; if(hExternWnd!=NULL) if(IsDlgButtonChecked(hExternWnd,IDC_MOVE)!=BST_CHECKED) CheckDlgButton(hExternWnd,IDC_MOVE,BST_CHECKED); } else { dofileop.uOp=FO_COPY; if(hExternWnd!=NULL) if(IsDlgButtonChecked(hExternWnd,IDC_MOVE)==BST_CHECKED) CheckDlgButton(hExternWnd,IDC_MOVE,BST_UNCHECKED); } break; case IDC_NOFOLDER: if(IsDlgButtonChecked(hWnd,IDC_NOFOLDER)==BST_CHECKED) { dofileop.bNoFolder=TRUE; if(hExternWnd!=NULL) { CheckDlgButton(hExternWnd,IDC_NOFOLDER,BST_CHECKED); ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE); SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0); ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW); } } else { dofileop.bNoFolder=FALSE; if(hExternWnd!=NULL) { CheckDlgButton(hExternWnd,IDC_NOFOLDER,BST_UNCHECKED); ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE); SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0); ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW); } } break; case IDC_UPDATE: if(IsDlgButtonChecked(hWnd,IDC_UPDATE)==BST_CHECKED) { dofileop.bUpdate=TRUE; if(hExternWnd!=NULL) if(IsDlgButtonChecked(hExternWnd,IDC_UPDATE)!=BST_CHECKED) CheckDlgButton(hExternWnd,IDC_UPDATE,BST_CHECKED); } else { dofileop.bUpdate=FALSE; if(hExternWnd!=NULL) if(IsDlgButtonChecked(hExternWnd,IDC_UPDATE)==BST_CHECKED) CheckDlgButton(hExternWnd,IDC_UPDATE,BST_UNCHECKED); break; } if(!bNoMsg) if(!DialogBox(hInst,MAKEINTRESOURCE(IDD_MSG),hWnd,(DLGPROC)MsgProc)) { CheckDlgButton(hWnd,IDC_UPDATE,BST_UNCHECKED); if(hExternWnd!=NULL) if(IsDlgButtonChecked(hExternWnd,IDC_UPDATE)==BST_CHECKED) CheckDlgButton(hExternWnd,IDC_UPDATE,BST_UNCHECKED); dofileop.bUpdate=FALSE; } } break; case WM_CLOSE: if(hExternWnd!=NULL) SendMessage(hExternWnd,WM_CLOSE,0,0); hBaseWnd=NULL; EndDialog(hWnd,FALSE); return FALSE; case WM_NOTIFY: { NM_TREEVIEW *pnmtv = (NM_TREEVIEW *)lParam; LPTVITEMDATA lptvid ; HRESULT hr ; LPSHELLFOLDER lpsf2 = 0 ; switch( pnmtv -> hdr.code) { case TVN_SELCHANGED: { pNmTv=pnmtv; lptvid = (LPTVITEMDATA)pnmtv -> itemNew.lParam; GetName(lptvid -> lpsfParent, lptvid->lpi, SHGDN_FORPARSING, szFoldername); if(szFoldername[1]!=':') { GetWindowsDirectory(szFoldername,MAX_PATH); strcat(szFoldername,"\\desktop\0"); } if(hExternWnd!=NULL) { UpdateDestFolder(); ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_HIDE); SendMessage(hExternWnd,WM_COMMAND,MAKELONG((WORD)IDC_NEWFOLDER,(WORD)EN_CHANGE),0); ShowWindow(GetDlgItem(hExternWnd,IDC_DESTFOLDER),SW_SHOW); } } break ; case TVN_ITEMEXPANDING: { if( ( pnmtv -> itemNew.state & TVIS_EXPANDEDONCE)) break ; lptvid = (LPTVITEMDATA)pnmtv -> itemNew.lParam ; hr=lptvid -> lpsfParent -> lpVtbl -> BindToObject(lptvid -> lpsfParent, lptvid -> lpi, 0, &IID_IShellFolder, (LPVOID *)&lpsf2) ; if( SUCCEEDED(hr)) { FillTreeView(hTreeWnd, lpsf2, lptvid -> lpifq, pnmtv -> itemNew.hItem) ; } TreeView_SortChildren(hTreeWnd, pnmtv -> itemNew.hItem, FALSE) ; } break; default: break; } } } return FALSE; } LPITEMIDLIST Next(LPCITEMIDLIST pidl) { LPSTR lpMem=(LPSTR)pidl; lpMem+=pidl -> mkid.cb; return (LPITEMIDLIST)lpMem; } UINT GetSize(LPCITEMIDLIST pidl) { UINT cbTotal = 0; if( pidl) { cbTotal += sizeof(pidl -> mkid.cb) ; // Null terminator while (pidl -> mkid.cb) { cbTotal += pidl -> mkid.cb; pidl = Next(pidl) ; } } return cbTotal; } LPITEMIDLIST Create(UINT cbSize) { LPMALLOC lpMalloc; HRESULT hr; LPITEMIDLIST pidl=0; hr=SHGetMalloc(&lpMalloc) ; if( FAILED(hr)) return 0; pidl=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc, cbSize) ; if( pidl) _fmemset(pidl, 0, cbSize) ; // zero-init for external task alloc if( lpMalloc) lpMalloc -> lpVtbl -> Release(lpMalloc) ; return pidl; } LPITEMIDLIST ConcatPidls(LPCITEMIDLIST pidl1, LPCITEMIDLIST pidl2) { LPITEMIDLIST pidlNew; UINT cb1; UINT cb2; if( pidl1) //May be NULL cb1 = GetSize(pidl1) - sizeof(pidl1 -> mkid.cb) ; else cb1 = 0; cb2 = GetSize(pidl2) ; pidlNew = Create(cb1 + cb2) ; if( pidlNew) { if( pidl1) memcpy(pidlNew, pidl1, cb1) ; memcpy(((LPSTR)pidlNew) + cb1, pidl2, cb2) ; } return pidlNew; } LPITEMIDLIST CopyITEMID(LPMALLOC lpMalloc, LPITEMIDLIST lpi) { LPITEMIDLIST lpiTemp; lpiTemp=(LPITEMIDLIST)lpMalloc -> lpVtbl -> Alloc(lpMalloc, lpi -> mkid.cb+sizeof(lpi -> mkid.cb)) ; CopyMemory((PVOID)lpiTemp, (CONST VOID *)lpi, lpi -> mkid.cb+sizeof(lpi -> mkid.cb)) ; return lpiTemp; } BOOL GetName(LPSHELLFOLDER lpsf,LPITEMIDLIST lpi,DWORD dwFlags,LPSTR lpFriendlyName) { BOOL bSuccess=TRUE; STRRET1 str; if( lpsf -> lpVtbl -> GetDisplayNameOf(lpsf,lpi,dwFlags,(LPSTRRET)&str)==NOERROR) { switch (str.uType) { case STRRET_WSTR: WideCharToMultiByte(CP_ACP, // CodePage 0, // dwFlags str.pOleStr, // lpWideCharStr -1, // cchWideChar lpFriendlyName, // lpMultiByteStr sizeof(lpFriendlyName), // cchMultiByte, NULL, // lpDefaultChar, NULL) ; // lpUsedDefaultChar break; case STRRET_OFFSET: lstrcpy(lpFriendlyName, (LPSTR)lpi+str.uOffset) ; break; case STRRET_CSTR: lstrcpy(lpFriendlyName, (LPSTR)str.cStr) ; break; default: bSuccess = FALSE; break; } } else bSuccess = FALSE; return bSuccess; } LPITEMIDLIST GetFullyQualPidl(LPSHELLFOLDER lpsf, LPITEMIDLIST lpi) { char szBuff[MAX_PATH]; OLECHAR szOleChar[MAX_PATH]; LPSHELLFOLDER lpsfDeskTop; LPITEMIDLIST lpifq; ULONG ulEaten, ulAttribs; HRESULT hr; if( !GetName(lpsf, lpi, SHGDN_FORPARSING, szBuff)) return NULL; hr=SHGetDesktopFolder(&lpsfDeskTop) ; if( FAILED(hr)) return NULL; MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, szBuff, -1, szOleChar, sizeof(szOleChar)) ; hr=lpsfDeskTop -> lpVtbl -> ParseDisplayName(lpsfDeskTop, NULL, NULL, szOleChar, &ulEaten, &lpifq, &ulAttribs) ; lpsfDeskTop -> lpVtbl -> Release(lpsfDeskTop) ; if( FAILED(hr)) return NULL; return lpifq; } int GetIcon(LPITEMIDLIST lpi, UINT uFlags) { SHFILEINFO sfi; SHGetFileInfo((LPCSTR)lpi, 0, &sfi, sizeof(SHFILEINFO), uFlags) ; return sfi.iIcon; } HICON GetFileIcon(LPSTR lpi) { SHFILEINFO sfi; SHGetFileInfo((LPCSTR)lpi, 0, &sfi, sizeof(SHFILEINFO), SHGFI_ICON) ; return sfi.hIcon; } void GetNormalAndSelectedIcons(LPITEMIDLIST lpifq, LPTV_ITEM lptvitem) { //Note that we don't check the return value here because if GetIcon() //fails, then we're in big trouble... lptvitem -> iImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON) ; lptvitem -> iSelectedImage = GetIcon(lpifq, SHGFI_PIDL | SHGFI_SYSICONINDEX | SHGFI_SMALLICON | SHGFI_OPENICON) ; return; } void FillTreeView( HWND hwndTreeView, LPSHELLFOLDER lpsf, LPITEMIDLIST lpifq, HTREEITEM hParent) { TV_ITEM tvi; // TreeView Item. TV_INSERTSTRUCT tvins; // TreeView Insert Struct. HTREEITEM hPrev = NULL; // Previous Item Added. LPSHELLFOLDER lpsf2=0; LPENUMIDLIST lpe=0; LPITEMIDLIST lpi=0,lpifqThisItem;// lpiTemp=0, lpifqThisItem; LPTVITEMDATA lptvid=0; LPMALLOC lpMalloc=0; ULONG ulFetched; HRESULT hr; char szBuff[256]; HWND hwnd=GetParent(hwndTreeView) ; hr=SHGetMalloc(&lpMalloc) ; if( FAILED(hr)) return; SetCapture(GetParent(hwndTreeView)) ; SetCursor(LoadCursor(NULL, IDC_WAIT)) ; if( SUCCEEDED(hr)) { hr=lpsf -> lpVtbl -> EnumObjects(lpsf, hwnd, SHCONTF_FOLDERS | SHCONTF_NONFOLDERS|SHCONTF_INCLUDEHIDDEN, &lpe) ; if( SUCCEEDED(hr)) { while (S_OK==lpe -> lpVtbl -> Next(lpe, 1, &lpi, &ulFetched)) { ULONG ulAttrs = SFGAO_HASSUBFOLDER | SFGAO_FOLDER; lpsf -> lpVtbl -> GetAttributesOf(lpsf, 1, (LPCITEMIDLIST)&lpi, &ulAttrs) ; if( ulAttrs & (SFGAO_HASSUBFOLDER | SFGAO_FOLDER)) { if( ulAttrs & SFGAO_FOLDER) { tvi.mask = TVIF_TEXT | TVIF_IMAGE | TVIF_SELECTEDIMAGE | TVIF_PARAM; if( ulAttrs & SFGAO_HASSUBFOLDER) { tvi.cChildren=1; tvi.mask |= TVIF_CHILDREN; } lptvid = (LPTVITEMDATA)lpMalloc -> lpVtbl -> Alloc(lpMalloc, sizeof(TVITEMDATA)) ; if( !lptvid) goto Done; if( !GetName(lpsf, lpi, SHGDN_NORMAL, szBuff)) goto Done; tvi.pszText = szBuff; tvi.cchTextMax = MAX_PATH; lpifqThisItem=ConcatPidls(lpifq, lpi) ; lptvid -> lpi=CopyITEMID(lpMalloc, lpi) ; GetNormalAndSelectedIcons(lpifqThisItem, &tvi) ; lptvid -> lpsfParent=lpsf; //Store the parent folders SF lpsf -> lpVtbl -> AddRef(lpsf) ; if( hParent==TVI_ROOT) lptvid -> lpifq=ConcatPidls(lpifq, lpi) ; else lptvid -> lpifq=GetFullyQualPidl(lpsf, lpi) ; tvi.lParam = (LPARAM)lptvid; tvins.item = tvi; tvins.hInsertAfter = hPrev; tvins.hParent = hParent; hPrev = TreeView_InsertItem(hwndTreeView, &tvins) ; //////the next code expand all item but CD-ROM in Tree view///////// // //TreeView_Expand(hwndTreeView,hPrev,TVE_TOGGLE); // /////code end////////////////////////////////////////////////////// } lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ; lpifqThisItem=0; } lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ; //Finally, free the pidl that the shell gave us... lpi=0; } } } else return; Done: ReleaseCapture() ; SetCursor( LoadCursor( NULL, IDC_ARROW)) ; if( lpe) lpe -> lpVtbl -> Release( lpe) ; if( lpi && lpMalloc) lpMalloc -> lpVtbl -> Free(lpMalloc, lpi) ; if( lpifqThisItem && lpMalloc) lpMalloc -> lpVtbl -> Free(lpMalloc, lpifqThisItem) ; if( lpMalloc) lpMalloc -> lpVtbl -> Release(lpMalloc) ; } void DoCopy(void) { char s[MAX_PATH]; SHFILEOPSTRUCT shop; BOOL bnouse=FALSE; WIN32_FIND_DATA wfile,wdest; char dst[MAX_PATH]; HANDLE h,hFile; shop.hwnd=hMainWnd; shop.wFunc=dofileop.uOp; shop.pTo=szFoldername; if(dofileop.bNoAsk) shop.fFlags=FOF_NOCONFIRMATION; else shop.fFlags=FOF_ALLOWUNDO; shop.fAnyOperationsAborted=bnouse; shop.hNameMappings=NULL; shop.lpszProgressTitle=NULL; if(szFoldername[1]!=':') { GetWindowsDirectory(szFoldername,MAX_PATH); strcat(szFoldername,"\\desktop\0"); } while(DoCheckCommand()) { if(dofileop.bNoFolder) { if(GetFileAttributes(szSourceFile)==FILE_ATTRIBUTE_DIRECTORY) { ZeroMemory(s,MAX_PATH); wsprintf(s,"%s\\*.*",szSourceFile); SetCurrentDirectory(szSourceFile); hFile=FindFirstFile(s,&wfile); while(FindNextFile(hFile,&wfile)) { if(stricmp(wfile.cFileName,"..")==0) continue; ZeroMemory(s,MAX_PATH); wsprintf(s,"%s\\",szSourceFile); strcat(s,wfile.cFileName); shop.pFrom=s; if(dofileop.bUpdate) { wsprintf(dst,"%s\\%s",shop.pTo,wfile.cFileName); if((h=FindFirstFile(dst,&wdest))!=INVALID_HANDLE_VALUE) { if(memcmp(&wfile.ftLastWriteTime,&wdest.ftLastWriteTime,sizeof(FILETIME))!=0 || wfile.nFileSizeHigh!=wdest.nFileSizeHigh || wfile.nFileSizeLow!=wdest.nFileSizeLow) SHFileOperation(&shop); } else SHFileOperation(&shop); FindClose(h); } else SHFileOperation(&shop); } FindClose(hFile); continue; } } shop.pFrom=szSourceFile; if(dofileop.bUpdate) { wsprintf(dst,"%s\\%s",shop.pTo,wfile.cFileName); if((h=FindFirstFile(dst,&wdest))!=INVALID_HANDLE_VALUE) { if(memcmp(&wfile.ftLastWriteTime,&wdest.ftLastWriteTime,sizeof(FILETIME))!=0 || wfile.nFileSizeHigh!=wdest.nFileSizeHigh || wfile.nFileSizeLow!=wdest.nFileSizeLow) SHFileOperation(&shop); } else SHFileOperation(&shop); FindClose(h); } else SHFileOperation(&shop); } wsprintf(szRunCommand,szForCheck); } void ResetFileOp(void) { dofileop.uOp=FO_COPY; dofileop.bUpdate=FALSE; dofileop.bNoFolder=FALSE; dofileop.bNoAsk=FALSE; } BOOL DoCheckCommand(void) { int i; ZeroMemory(szSourceFile,MAX_PATH); if(szRunCommand[0]=='\0') return FALSE; for(i=0;i<(int)strlen(szRunCommand);i++) { if(szRunCommand[i]!=' ') szSourceFile[i]=szRunCommand[i]; else { int j; strcat(szSourceFile,"\0\0"); for(j=0;j<(int)strlen(szRunCommand)-i-1;j++) szRunCommand[j]=szRunCommand[i+j+1]; szRunCommand[j]='\0'; szRunCommand[j+1]='\0'; return TRUE; } } if(szRunCommand[i]=='\0') { wsprintf(szRunCommand,"\0\0"); return TRUE; } return FALSE; } void ExpandTree(void) { HTREEITEM hTree; hTree=TreeView_GetRoot(hTreeWnd); if(hTree) TreeView_Expand(hTreeWnd,hTree,TVE_EXPAND); } #pragma argsused BOOL CALLBACK WINAPI MsgProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam) { switch(uMsg) { case WM_INITDIALOG: break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: if(IsDlgButtonChecked(hWnd,IDC_NOSHOWNEXT)==BST_CHECKED) { REGVALINFO ri; int x=1; ri.szValName="NoMsg"; ri.dwType=REG_DWORD; ri.lpData=(LPBYTE)&x; ri.cbData=sizeof(DWORD); RegSetGroupVal(HKEY_LOCAL_MACHINE,"SOFTWARE\\phonix\\sharewareluncher",1,&ri); bNoMsg=TRUE; } EndDialog(hWnd,TRUE); return TRUE; case IDCANCEL: EndDialog(hWnd,FALSE); return FALSE; } break; case WM_CLOSE: EndDialog(hWnd,FALSE); return FALSE; } return FALSE; } #pragma argsused BOOL CALLBACK WINAPI AskDelProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam) { switch(uMsg) { case WM_INITDIALOG: break; case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: bDelNoAsk=TRUE; EndDialog(hWnd,TRUE); return TRUE; case IDCANCEL: EndDialog(hWnd,FALSE); return FALSE; case IDHELP: bDelNoAsk=FALSE; EndDialog(hWnd,TRUE); return TRUE; } break; case WM_CLOSE: EndDialog(hWnd,FALSE); return FALSE; } return FALSE; } void UpdateDestFolder(void) { char s[MAX_PATH]; ZeroMemory(szDestFolder,MAX_PATH); ZeroMemory(s,MAX_PATH); DoCheckCommand(); if(szRunCommand[0]=='\0' && (GetFileAttributes(szSourceFile)&FILE_ATTRIBUTE_DIRECTORY)) wsprintf(szDestFolder,szSourceFile); else GetPathFromFileName(szSourceFile,szDestFolder); GetOnlyFilename(szDestFolder,s,SZ_LONGNAME); if(s[1]==':') wsprintf(s,"\0"); RestoreCheckCommand(); if((strlen(szFoldername)+strlen(s))>=MAX_PATH) s[MAX_PATH-strlen(szFoldername)]='\0'; wsprintf(szDestFolder,szFoldername); if(szFoldername[3]=='\0') //like c:\,so cut the "\" szDestFolder[2]='\0'; strcat(szDestFolder,"\\"); strcat(szDestFolder,s); } int DelFile(LPSTR szfile) { if((GetFileAttributes(szfile)&FILE_ATTRIBUTE_DIRECTORY)) { SHFILEOPSTRUCT shop; shop.hwnd=hMainWnd; shop.wFunc=FO_DELETE; shop.pTo=NULL;//szFoldername; if(bDelNoAsk) shop.fFlags=FOF_NOCONFIRMATION; else shop.fFlags=FOF_ALLOWUNDO; shop.fAnyOperationsAborted=FALSE; shop.hNameMappings=NULL; shop.lpszProgressTitle=NULL; shop.pFrom=szfile; SHFileOperation(&shop); return TRUE; } else if(!bDelNoAsk) { char mg[MAX_PATH]; wsprintf(mg,"确实要删除文件\"%s\"吗?",szfile); switch(MessageBox(GetFocus(),mg,"删除",MB_YESNOCANCEL | MB_ICONQUESTION)) { case IDYES: SetFileAttributes(szfile,FILE_ATTRIBUTE_NORMAL); return DeleteFile(szfile); case IDNO: return FALSE; case IDCANCEL: return DEL_CANCEL; } } SetFileAttributes(szfile,FILE_ATTRIBUTE_NORMAL); return DeleteFile(szfile); } #pragma argsused BOOL CALLBACK WINAPI SendProc(HWND hWnd,UINT uMsg,UINT wParam,LONG lParam) { switch(uMsg) { case WM_INITDIALOG: hExternWnd=hWnd; hTypeWnd=GetDlgItem(hWnd,IDC_FILETYPE); if(dofileop.uOp==FO_MOVE) CheckDlgButton(hWnd,IDC_MOVE,BST_CHECKED); else CheckDlgButton(hWnd,IDC_MOVE,BST_UNCHECKED); if(dofileop.bUpdate) CheckDlgButton(hWnd,IDC_UPDATE,BST_CHECKED); else CheckDlgButton(hWnd,IDC_UPDATE,BST_UNCHECKED); if(dofileop.bNoFolder) CheckDlgButton(hWnd,IDC_NOFOLDER,BST_CHECKED); else CheckDlgButton(hWnd,IDC_NOFOLDER,BST_UNCHECKED); UpdateDestFolder(); if(dofileop.bNoFolder) SetDlgItemText(hWnd,IDC_DESTFOLDER,szFoldername); else SetDlgItemText(hWnd,IDC_DESTFOLDER,szDestFolder); PostMessage(hWnd,MYWM_ICON,0,0); break; case WM_LBUTTONDOWN: if(bInText) if(hBaseWnd!=NULL) { bInText=FALSE; SetFocus(hWnd); SetForegroundWindow(hBaseWnd); } break; case WM_SETCURSOR: if(bInText) SetCursor(LoadCursor(hInst,"IDC_HAND")); else SetCursor(LoadCursor(NULL,IDC_ARROW)); return TRUE; case WM_MOUSEMOVE: GetWindowRect(GetDlgItem(hWnd,IDC_CHANGDEST),&CDestRt); { POINT pt; GetCursorPos(&pt); if(pt.x>CDestRt.left && pt.x CDestRt.top && pt.y 0) SendMessage(hTypeWnd,CB_DELETESTRING,0,0); ListView_DeleteAllItems(GetDlgItem(hWnd,IDC_SELECTSEND)); ImageList_Destroy(ListView_GetImageList(GetDlgItem(hWnd,IDC_SELECTSEND),LVSIL_STATE)); ListView_DeleteAllItems(GetDlgItem(hWnd,IDC_SELECTDEST)); ImageList_Destroy(ListView_GetImageList(GetDlgItem(hWnd,IDC_SELECTDEST),LVSIL_STATE)); FillList(hWnd); SendMessage(hTypeWnd,CB_ADDSTRING,0,(LPARAM)"*.*"); SendMessage(hTypeWnd,CB_SELECTSTRING,0,(LPARAM)"*.*"); ListView_SetCallbackMask(GetDlgItem(hWnd,IDC_SELECTSEND),LVIS_SELECTED); ListView_SetCallbackMask(GetDlgItem(hWnd,IDC_SELECTDEST),LVIS_SELECTED); break; case WM_NOTIFY: return NotifyHandler(hWnd, uMsg, wParam, lParam); case WM_COMMAND: switch(LOWORD(wParam)) { case IDOK: bInText=FALSE; DoSend(); hExternWnd=NULL; EndDialog(hWnd,TRUE); return TRUE; case IDCANCEL: bInText=FALSE; hExternWnd=NULL; EndDialog(hWnd,FALSE); return FALSE; case IDHELP: //"删除" { HWND hDest=GetDlgItem(hWnd,IDC_SELECTDEST); int i,k,j=ListView_GetItemCount(hDest),c=0,ch; if(j==0) break; if(DialogBox(hInst,MAKEINTRESOURCE(IDD_ASKDEL),hWnd,(DLGPROC)AskDelProc)) { char szd[MAX_PATH]; for(i=0;i ') { Errmsg("非法字符串"); s[i]='\0'; SetDlgItemText(hWnd,IDC_NEWFOLDER,s); break; } if(dofileop.bNoFolder) { if((strlen(szFoldername)+strlen(s))>=MAX_PATH) s[MAX_PATH-strlen(szFoldername)]='\0'; wsprintf(szShowDest,"%s\\%s",szFoldername,s); } else { if((strlen(szDestFolder)+strlen(s))>=MAX_PATH) s[MAX_PATH-strlen(szDestFolder)]='\0'; wsprintf(szShowDest,"%s\\%s",szDestFolder,s); } SetDlgItemText(hWnd,IDC_DESTFOLDER,szShowDest); } break; } break; case WM_CLOSE: bInText=FALSE; hExternWnd=NULL; EndDialog(hWnd,FALSE); return FALSE; } return FALSE; } void FillList(HWND hWnd) { int i=0; DoCheckCommand(); InitCol(GetDlgItem(hWnd,IDC_SELECTSEND)); //init listview column InitCol(GetDlgItem(hWnd,IDC_SELECTDEST)); ZeroMemory(szThisFolder,MAX_PATH); if(szRunCommand[0]=='\0') //仅一个目录或文件 { if((GetFileAttributes(szSourceFile)&FILE_ATTRIBUTE_DIRECTORY)) { wsprintf(szThisFolder,szSourceFile); if(szThisFolder[3]=='\0') szThisFolder[2]='\0'; FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),NULL); wsprintf(szRunCommand,szForCheck); SetCurrentDirectory(szSourceFile); return; } } GetPathFromFileName(szSourceFile,szThisFolder); if(szThisFolder[2]=='\0') { szThisFolder[2]='\\'; szThisFolder[3]='\0'; SetCurrentDirectory(szThisFolder); szThisFolder[2]='\0'; } else SetCurrentDirectory(szThisFolder); do{ AddListview(GetDlgItem(hWnd,IDC_SELECTDEST),szSourceFile,i); AddFileType(szSourceFile); i++; }while(DoCheckCommand()); ListView_SetColumnWidth(GetDlgItem(hWnd,IDC_SELECTDEST),0,LVSCW_AUTOSIZE); if(szThisFolder[3]=='\0') szThisFolder[2]='\0'; FillSend(GetDlgItem(hWnd,IDC_SELECTSEND),NULL); RestoreCheckCommand(); } void RestoreCheckCommand(void) { wsprintf(szRunCommand,szForCheck); } void FillSend(HWND hWnd,LPSTR szFileType) { HANDLE hFile; WIN32_FIND_DATA wfile; char s[MAX_PATH]; HIMAGELIST hIList; LV_FINDINFO lvf; HICON hicon1; LV_ITEM lvi; int i=0; BOOL bSpac=FALSE; char temp[80]; ZeroMemory(s,MAX_PATH); ZeroMemory(&lvf,sizeof(LV_FINDINFO)); lvf.flags=LVFI_STRING; if(szFileType!=NULL) { if(strcmpi(szFileType,"文件夹")==0 || strcmpi(szFileType,"无扩展名文件")==0) { wsprintf(s,"%s\\*.*",szThisFolder); bSpac=TRUE; } else wsprintf(s,"%s\\%s",szThisFolder,szFileType); } else wsprintf(s,"%s\\*.*",szThisFolder); if(szThisFolder[2]=='\0') { szThisFolder[2]='\\'; szThisFolder[3]='\0'; SetCurrentDirectory(szThisFolder); szThisFolder[2]='\0'; } else SetCurrentDirectory(szThisFolder); hIList = ImageList_Create(16,16,ILC_MASK,1,1);//GetSystemMetrics(SM_CXSMICON),GetSystemMetrics(SM_CYSMICON) hFile=FindFirstFile(s,&wfile); do { if(stricmp(wfile.cFileName,"..")==0 || stricmp(wfile.cFileName,".")==0) continue; if(bSpac) if(strcmpi(szFileType,"文件夹")==0) { if(!(wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) continue; } else if(GetFileTypeName(wfile.cFileName,temp)!=TYPE_NOEXT) continue; if((wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) { char x[MAX_PATH]; wsprintf(x," %s",wfile.cFileName); lvi.pszText = x; } else lvi.pszText = wfile.cFileName;//LPSTR_TEXTCALLBACK; lvf.psz=(LPCTSTR)lvi.pszText; if(ListView_FindItem(GetDlgItem(hExternWnd,IDC_SELECTDEST),-1,&lvf)!=-1) continue; hicon1=GetFileIcon(wfile.cFileName); ImageList_AddIcon(hIList,hicon1); ListView_SetImageList(hWnd,hIList,LVSIL_SMALL); lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.iItem = i; lvi.iSubItem = 0; lvi.cchTextMax = MAX_PATH; lvi.iImage = i; lvi.lParam = (LPARAM)&wfile; i++; ListView_InsertItem(hWnd,&lvi); AddFileType(wfile.cFileName); }while(FindNextFile(hFile,&wfile)); FindClose(hFile); ListView_SetColumnWidth(hWnd,0,LVSCW_AUTOSIZE); } #pragma argsused LRESULT NotifyHandler( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { POINT pt; LPNMHDR lphdr=(LPNMHDR)lParam; LV_HITTESTINFO lvhti ; switch(lphdr->code) { case NM_KILLFOCUS: nFocused=-1; break; case NM_CLICK: { GetCursorPos( &pt) ; ScreenToClient(lphdr->hwndFrom, &pt) ; lvhti.pt=pt; ListView_HitTest(lphdr->hwndFrom, &lvhti) ; if(lvhti.flags & LVHT_ONITEM) { if((HIBYTE(GetKeyState(VK_SHIFT))&1) && nFocused!=-1) { int i,j=ListView_GetItemCount(lphdr->hwndFrom); BOOL bIn=FALSE; for(i=0;i hwndFrom,i,LVIS_DROPHILITED,LVIF_STATE); } else ListView_SetItemState(lphdr->hwndFrom,i,0,LVIF_STATE); } else { ListView_SetItemState(lphdr->hwndFrom,i,LVIS_DROPHILITED,LVIF_STATE); bIn=!bIn; if(nFocused==lvhti.iItem) bIn=FALSE; } } } else { if((ListView_GetItemState(lphdr->hwndFrom,lvhti.iItem,LVIF_STATE)&LVIS_DROPHILITED)) { ListView_SetItemState(lphdr->hwndFrom,lvhti.iItem,0,LVIF_STATE); } else { ListView_SetItemState(lphdr->hwndFrom,lvhti.iItem,LVIS_DROPHILITED,LVIF_STATE); } nFocused=lvhti.iItem; } } } break; } return 0L; } void InitCol(HWND hWnd) { LV_COLUMN lvC; lvC.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM; lvC.fmt = LVCFMT_LEFT; // 列元左对齐 lvC.cx = 86; // 列元的像素宽度 lvC.pszText = "File";//szText; // 列元的文字字符串地址 lvC.iSubItem = 0; ListView_InsertColumn(hWnd,0,&lvC); } void AddListview(HWND hWnd,LPSTR szDisplay,int i) { WIN32_FIND_DATA wfile; HIMAGELIST hIList; HICON hicon1; LV_ITEM lvi; if(szDisplay[0]==' ') { int w=0; while(szDisplay[w+1]!='\0') { szDisplay[w]=szDisplay[w+1]; w++; } szDisplay[w]='\0'; } FindFirstFile(szDisplay,&wfile); hIList = ListView_GetImageList(hWnd,LVSIL_SMALL); if(hIList==NULL) hIList=ImageList_Create(16,16,ILC_MASK,1,1); hicon1=GetFileIcon(szDisplay);//,&dwtemp);//wfile.cFileName,0); ImageList_AddIcon(hIList,hicon1); ListView_SetImageList(hWnd,hIList,LVSIL_SMALL); // DestroyIcon(hicon1); lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE; lvi.state = 0; lvi.stateMask = 0; lvi.iItem = i; lvi.iSubItem = 0; if((wfile.dwFileAttributes&FILE_ATTRIBUTE_DIRECTORY)) { char x[MAX_PATH]; wsprintf(x," %s",wfile.cFileName); lvi.pszText = x; } else lvi.pszText = wfile.cFileName;//LPSTR_TEXTCALLBACK; lvi.cchTextMax = MAX_PATH; lvi.iImage = ImageList_GetImageCount(hIList)-1; lvi.lParam = (LPARAM)&wfile; ListView_InsertItem(hWnd,&lvi); ListView_SetColumnWidth(hWnd,0,LVSCW_AUTOSIZE); } void AddFileType(LPSTR s) { char sztype[80]; int i,j,k=0; char str[80]; if((GetFileAttributes(s)&FILE_ATTRIBUTE_DIRECTORY)) wsprintf(sztype,"文件夹"); else GetFileTypeName(s,sztype); if(sztype[0]=='\0') wsprintf(sztype,"无扩展名文件"); j=SendMessage(hTypeWnd,CB_GETCOUNT,0,0); for(i=0;i 0) if(d[strlen(d)-1]=='\\') d[strlen(d)-1]='\0'; MkDir(d); shop.pTo=d; ZeroMemory(s,MAX_PATH); for(i=0;i