📄 send_to_hd.c
字号:
#include <user\dlg.h>
#include <commctrl.h>#include <shlobj.h>#include "resource.h"#include "sharewareluncher.h"#define DEL_CANCEL 90001//#define IDC_HAND 99999 //hand cursortypedef 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 dirchar szForCheck[300]; //restore the szRunCommandNM_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 hwndRECT 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 argsusedBOOL 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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -