📄 cutcopy.cpp
字号:
#include <windows.h>
#include <Shellapi.h>
#include <Shlobj.h>
#include <oleidl.h>
#include "resource.h"
LRESULT CALLBACK MainProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam );
BOOL CheckClipboard(HWND hWnd,LPTSTR lpBuffer);
VOID CutOrCopyFiles(char *lpBuffer,UINT uBufLen,BOOL bCopy);
BOOL SelectFiles(HWND hWnd,LPTSTR lpBuffer,DWORD dwSize);
HINSTANCE g_hInst;
int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPSTR lpCmdLine,
int nCmdShow)
{
HWND hWnd;
MSG msg;
g_hInst=hInstance;
hWnd = CreateDialog( hInstance, MAKEINTRESOURCE( IDD_MAINWIN ),
HWND_DESKTOP, (DLGPROC)MainProc );
while ( GetMessage( &msg, NULL, 0, 0 ) )
{
if ( !IsDialogMessage( hWnd, &msg ) )
{
TranslateMessage( &msg );
DispatchMessage( &msg );
}
}
return msg.wParam;
}
LRESULT CALLBACK MainProc( HWND hWnd, UINT uMessage, WPARAM wParam, LPARAM lParam )
{
TCHAR szBuffer[4096],*lp,*lpStart;
TCHAR szFiles[4096],*lpFileStart;
UINT uLen,uTotalLen=0;
switch(uMessage) {
case WM_COMMAND :
switch(LOWORD(wParam)) {
case IDC_CHECK:
memset(szBuffer,0,4096*sizeof(TCHAR));
if(CheckClipboard(hWnd,szBuffer)) {
SetWindowText(GetDlgItem(hWnd,IDC_FILES),szBuffer);
}
break;
case IDC_CUT :
case IDC_COPY :
memset(szBuffer,0,4096*sizeof(TCHAR));
GetWindowText(GetDlgItem(hWnd,IDC_FILES),szBuffer,4096);
if(*szBuffer!=0) {
//把文本筐中的文件名整理成要求的格式:"file1\0File2\0"
memset(szFiles,0,4096*sizeof(TCHAR));
lpFileStart=szFiles; //下个文件名存放位置指针
lpStart=szBuffer; //当前正在整理的文件名首地址
lp=szBuffer;
while(*lp!=0) {
if(*lp=='\r') { //到达文件名末尾
*lp=0; //将回车符号换成0
lstrcat(lpFileStart,lpStart);
uLen=lstrlen(lpStart)+1;
lpFileStart+=uLen;
uTotalLen+=uLen;
lp++;//跳过'\n'
lpStart=lp+1;
}
lp++;
}
//Cut/Copy File
if(LOWORD(wParam)==IDC_COPY)
CutOrCopyFiles(szFiles,uTotalLen,TRUE);
else CutOrCopyFiles(szFiles,uTotalLen,FALSE);
}
break;
case IDC_EXIT :
PostQuitMessage(0);
break;
case IDC_BROWSER :
memset(szBuffer,0,4096*sizeof(TCHAR));
SelectFiles(hWnd,szBuffer,4096);
if(*szBuffer!=0) {
//将选择的文件整理成全路径字符串(以换行分割文件名)
//如果只选择了一个文件,szBuffer中就是全名
//如果选择多个文件,则格式为:"路径名\0文件1\0文件2\0"
memset(szFiles,0,4096*sizeof(TCHAR));
uLen=lstrlen(szBuffer)+1;
lp=szBuffer+uLen;
lpStart=szBuffer+uLen;
while((*lp!=0 || *(lp+1)!=0) || *lpStart!=0 ) {
if(*lp==0) {
lstrcat(szFiles,szBuffer);//copy路径,
lstrcat(szFiles,"\\");
lstrcat(szFiles,lpStart);//加上文件名
lstrcat(szFiles,"\r\n");//用换行隔开
lpStart=lp+1;
}
lp++;
}
if(*szFiles==0) {
//只选择了一个文件
lstrcpy(szFiles,szBuffer);
lstrcat(szFiles,"\r\n");
}
SetWindowText(GetDlgItem(hWnd,IDC_FILES),szFiles);
}
break;
}
break;
case WM_CLOSE :
PostQuitMessage(0);
break;
}
return 0;
}
BOOL CheckClipboard(HWND hWnd,LPTSTR lpBuffer)
{
UINT uDropEffect=RegisterClipboardFormat("Preferred DropEffect");
UINT cFiles=0;
DWORD dwEffect,*dw;
if( OpenClipboard( hWnd)) {
HDROP hDrop = HDROP( GetClipboardData( CF_HDROP));
if( hDrop) {
dw=(DWORD*)(GetClipboardData( uDropEffect));
if(dw==NULL)
dwEffect=DROPEFFECT_COPY;
else
dwEffect=*dw;
cFiles = DragQueryFile( hDrop, (UINT) -1, NULL, 0);
char szFile[ MAX_PATH];
for( UINT count = 0; count < cFiles; count++ ) {
DragQueryFile( hDrop, count, szFile, sizeof( szFile));
lstrcat(lpBuffer,szFile);
lstrcat(lpBuffer,"\r\n");
}
}
CloseClipboard();
if(dwEffect & DROPEFFECT_MOVE) {
MessageBox(NULL,lpBuffer,"Move Files",MB_OK);
} else if(dwEffect & DROPEFFECT_COPY) {
MessageBox(NULL,lpBuffer,"Copy Files",MB_OK);
}
}
if(cFiles==0) {
MessageBox(NULL,"No File will be Cut/Copy","Information",MB_OK);
return FALSE;
}
return TRUE;
}
VOID CutOrCopyFiles(char *lpBuffer,UINT uBufLen,BOOL bCopy)
{
UINT uDropEffect;
DROPFILES dropFiles;
UINT uGblLen,uDropFilesLen;
HGLOBAL hGblFiles,hGblEffect;
char *szData,*szFileList;
DWORD *dwDropEffect;
uDropEffect=RegisterClipboardFormat("Preferred DropEffect");
hGblEffect=GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE,sizeof(DWORD));
dwDropEffect=(DWORD*)GlobalLock(hGblEffect);
if(bCopy)
*dwDropEffect=DROPEFFECT_COPY;
else
*dwDropEffect=DROPEFFECT_MOVE;
GlobalUnlock(hGblEffect);
uDropFilesLen=sizeof(DROPFILES);
dropFiles.pFiles =uDropFilesLen;
dropFiles.pt.x=0;
dropFiles.pt.y=0;
dropFiles.fNC =FALSE;
dropFiles.fWide =TRUE;
uGblLen=uDropFilesLen+uBufLen*2+8;
hGblFiles= GlobalAlloc(GMEM_ZEROINIT|GMEM_MOVEABLE|GMEM_DDESHARE, uGblLen);
szData=(char*)GlobalLock(hGblFiles);
memcpy(szData,(LPVOID)(&dropFiles),uDropFilesLen);
szFileList=szData+uDropFilesLen;
MultiByteToWideChar(CP_ACP,MB_COMPOSITE,
lpBuffer,uBufLen,(WCHAR *)szFileList,uBufLen);
GlobalUnlock(hGblFiles);
if( OpenClipboard(NULL) )
{
EmptyClipboard();
SetClipboardData( CF_HDROP, hGblFiles );
SetClipboardData(uDropEffect,hGblEffect);
CloseClipboard();
}
}
BOOL SelectFiles(HWND hWnd,LPTSTR lpBuffer,DWORD dwSize)
{
OPENFILENAME OpenFileName;
TCHAR szTitle[50]="Select Files for Cut/Copy\0",szFilter[20]=TEXT("*.*\0");
ZeroMemory(szTitle,50);
ZeroMemory(lpBuffer,dwSize);
ZeroMemory((LPVOID)&OpenFileName,sizeof(OPENFILENAME));
OpenFileName.lStructSize = sizeof(OPENFILENAME);
OpenFileName.hwndOwner = hWnd;
OpenFileName.hInstance = g_hInst;
OpenFileName.lpstrFile = lpBuffer;
OpenFileName.nMaxFile = dwSize;
OpenFileName.lpstrFilter =szFilter;
OpenFileName.nFilterIndex =1;
OpenFileName.lpstrTitle = szTitle;
OpenFileName.Flags =OFN_EXPLORER | OFN_ALLOWMULTISELECT |
OFN_PATHMUSTEXIST | OFN_FILEMUSTEXIST;
return GetOpenFileName(&OpenFileName);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -