功能描述:类似qq聊天对话框中可以粘贴来发送文件
步骤1: 截取粘贴消息,包括ctrl+V和右键选择粘贴
ctrl+v:
BOOL BaseChatWnd::PreTranslateMessage(MSG* pMsg)
{
switch (pMsg->message)
{
case WM_KEYDOWN:
{
if (pMsg->wParam == 'V' ||
pMsg->wParam == 'v')
{
if (GetFocus()->GetSafeHwnd() == writeContent.GetSafeHwnd())
{
if(IsClipboardFormatAvailable(CF_HDROP)) // 如果是文件就发送
{
SendPasteFiles();
}
else
{
writeContent.Paste();
SetCurFont();
}
return TRUE;
}
}
}
default:
break;
}
return BLBaseDlg::PreTranslateMessage(pMsg);
}
右键粘贴:
通过消息映射响应(这里就只写关键的)
case ID__Paste:
if(IsClipboardFormatAvailable(CF_HDROP)) // min 如果是文件就发送
{
SendPasteFiles();
}
else
{
writeContent.Paste();// h1000 添加
SetCurFont();
}
步骤2:发送粘贴文件
// 粘贴发送文件
void ChatWithPerson::SendPasteFiles()
{
ASSERT(pSendFileWnd);
if (!pSendFileWnd)
return;
if(!::OpenClipboard(m_hWnd))
{
return;
}
//文件的个数
HDROP hDrop=(HDROP)GetClipboardData(CF_HDROP);
//HANDLE hDrop = GetClipboardData(CF_HDROP);
UINT nNumOfFiles = DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0);
if (0 == nNumOfFiles)
{
return;
}
TCHAR cFilePathName[_MAX_PATH] = {0};
int isFileNum(0);
for ( UINT nIndex=0 ; nIndex< nNumOfFiles; ++nIndex )
{
DragQueryFile(hDrop, nIndex, cFilePathName, _MAX_PATH); //得到文件名
if (FILE_ATTRIBUTE_DIRECTORY == GetFileAttributes(cFilePathName))
{// 如果是文件夹
if (nNumOfFiles - 1 == nIndex)
{
CPublicFuncManage obj;
obj.ShowMessageBox(_T("不能传送文件夹!\r\n"),BLMsgBox::ERROR_NULL,this);
return;
}
continue;
}
// 以独占方式打开, 如果被占用, 打开失败
HANDLE hFile = CreateFile(cFilePathName, GENERIC_READ,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
0);
if (INVALID_HANDLE_VALUE == hFile)
{
DisplayPromptMsg(_T("该文件正在使用中,不能传送!\r\n"));
continue;
}
CloseHandle(hFile);
// 以独占方式打开, 如果被占用, 打开失败, END
}
::CloseClipboard();
if (0 == isFileNum)
return;
// SendFile detail add code here ........
SetFocus();
}
上面代码SendPasteFiles获得了粘贴文件的路径cFilePathName,通过这个路径便可以建立发送端,具体发送文件过程,这里就不做说明了