📄 secretchatdlg.cpp
字号:
dwRead += dw;
}
SetFileTime((HANDLE)destFile.m_hFile,&StreamFileInfo.ftCreationTime,
&StreamFileInfo.ftLastAccessTime,&StreamFileInfo.ftLastWriteTime);
destFile.Close();
SetFileAttributes(StreamFileInfo.szFileTitle,StreamFileInfo.dwFileAttributes);
sockClient.Close();
//询问打开文件,还是用递送消息吧,反正没事
if(pMain->m_send_file)//m_send_file是中止标志
pMain->PostMessage( WM_RUNHIDE,1,0);
//恢复现场
pMain->send_file_comeback_scene();
//AfxMessageBox("接收完毕!");
return 0;
}
/*
DWORD WINAPI send_file_thread(LPVOID param) //发送文件线程
{
CSecretChatDlg * pMain = (CSecretChatDlg *)param;
MessagePackage msg;
msg.head = HEAD_SENDFILE;
msg.ID = HEAD_SENDFILE_TEXT;
msg.n = SENDFILESIZE;
//::Sleep(100); //发送的太快就会出错
//把消息包分成若干块大小为SENDFILESIZE
CFile file;
if(!file.Open(
pMain->m_send_file_name,
CFile::modeRead | CFile::typeBinary))
{
AfxMessageBox("发送的文件无法读取");
return 0;
}
file.Seek(pMain->m_send_file_seek_position, CFile::begin);
file.Read(msg.data, SENDFILESIZE);//返回的是现在读写文件的位置
pMain->m_send_file_seek_position += SENDFILESIZE;
pMain->SendData(msg, SENDFILESIZE + 12/消息包头部长度/);
file.Close();
return 0;
}
DWORD WINAPI receive_file_thread(LPVOID param) //接收文件线程
{
CSecretChatDlg * pMain = (CSecretChatDlg *)param;
MessagePackage msg;
msg = pMain->m_receive_file_buffer;
CFile file;
if(!file.Open(
pMain->m_receive_file_name,
CFile::modeWrite | CFile::typeBinary))
{
AfxMessageBox("发送的文件无法读取");
return 0;
}
file.SeekToEnd(); //每次从尾部写入
file.Write(msg.data, msg.n);
pMain->m_send_file_seek_position += msg.n; //已经接收文件的大小
if(file.GetLength() >= (unsigned int)pMain->m_send_file_length)
{ //这就表示接收完了文件
file.SetLength(pMain->m_send_file_length);
file.Close();
//提示成功接收
msg.head = HEAD_SENDFILE;
msg.ID = HEAD_SENDFILE_SUCCEED;
pMain->SendData(msg, 12);
//恢复现场
pMain->send_file_comeback_scene();
//询问打开文件,还是用递送消息吧,反正没事
pMain->PostMessage( WM_RUNHIDE,1,0);
}
else
{
file.Close();
//收到一个块后,就向对方确认之后再接收
msg.head = HEAD_SENDFILE;
msg.ID = HEAD_SENDFILE_CONCENT;
pMain->SendData(msg, 12);
}
return 0;
}*/
///////////////////////////////////
//在任务栏状态区添加图标
BOOL MyTaskBarAddIcon(HWND hwnd,UINT uID,HICON hicon,LPSTR lpszTip)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
tnid.uFlags = NIF_ICON | NIF_TIP | NIF_MESSAGE;
tnid.uCallbackMessage = MYWM_NOTIFYICON;
tnid.hIcon = hicon;
if (lpszTip) lstrcpyn(tnid.szTip, lpszTip, sizeof(tnid.szTip));
else tnid.szTip[0] = '\0';
res = Shell_NotifyIcon(NIM_ADD,&tnid);
if (hicon) DestroyIcon(hicon);
return res;
}
//从任务栏状态区删除图标
BOOL MyTaskBarDeleteIcon( UINT uID,HWND hwnd)
{
BOOL res;
NOTIFYICONDATA tnid;
tnid.cbSize = sizeof(NOTIFYICONDATA);
tnid.hWnd = hwnd;
tnid.uID = uID;
res = Shell_NotifyIcon(NIM_DELETE, &tnid);
return res;
}
/////////////////
//托盘图标事件
void CSecretChatDlg::OnMyIconNotify(WPARAM wParam/*uID*/,LPARAM lParam/*消息标识值*/)
{
switch( lParam)
{
case WM_LBUTTONDOWN: //点击图标
if (IsWindowVisible()) //如果窗口已打开,隐藏窗口
{
//利用这两个动作就可实现动画了
ShowWindow( SW_MINIMIZE);
ShowWindow(SW_HIDE); //隐藏动画
}
else //否则,显示窗口
{
//利用这两个动作就可实现动画了
ShowWindow( SW_MINIMIZE);
ShowWindow( SW_SHOWNORMAL); //显示动画
}
break;
case WM_RBUTTONDOWN: //右击图标
//右击是为了弹出菜单
//要弹出菜单主菜单的属性必须要取消view as popup属性
CPoint point;
GetCursorPos( &point);
CMenu menu;
VERIFY( menu.LoadMenu( IDR_ICONMENU));
CMenu * pMenu = menu.GetSubMenu(0);
if(AfxGetApp()->GetProfileInt("General", "Top", 0))
{ //总在前面标记
pMenu->CheckMenuItem( ID_TOP,MF_CHECKED | MF_BYCOMMAND);
}
//要显示窗口还是隐藏
if( IsWindowVisible())
{
pMenu->DeleteMenu( ID_SHOW,MF_BYCOMMAND);
}
else
{
pMenu->DeleteMenu( ID_HIDE,MF_BYCOMMAND);
}
pMenu->TrackPopupMenu( 32,point.x,point.y,this);
break;
}
}
BOOL CSecretChatDlg::OnInitDialog()
{
CDialog::OnInitDialog();
//没有联机
m_online = FALSE;
//窗口初始化显示和设置函数
InitializationWindow();
/*创建套接字,并在套接字上监听连接*/
m_socketListen.Create(LISTEN_PORT);
m_bListen = m_socketListen.Listen(); //返回值可以判断是否监听成功,否则就已有实例在监听
//关闭服务器和客户机的套接字对象
m_pSocket = NULL;
m_socketListen.m_pServiceSocket = NULL;
//每隔30秒就向另一方发在线通知,还是不要这个在线通知了这样会减少一些错误吧
SetTimer(1003, 30000, NULL);
//初始化CRITICAL_SECTION变量(m_cs.LockCount会等于-1)?不一定
::InitializeCriticalSection(&m_cs_receive);
//可以发送文件
m_send_file = FALSE;
//测试部分
return TRUE; // return TRUE unless you set the focus to a control
}
void CSecretChatDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
//CAboutDlg dlgAbout;
//dlgAbout.DoModal();
m_setupDlg.m_index = 4;
m_setupDlg.DoModal();
}
else if(nID == IDS_JIAMI)
{
HKEY hkey;
char sz[MAX_PATH]; //缓冲区必须要和设置时的相同才能读到数据
DWORD dwtype, sl = MAX_PATH;
::RegOpenKeyEx(
HKEY_CURRENT_USER,
"Software\\文件密使\\Application",
NULL,
KEY_ALL_ACCESS,
&hkey);
::RegQueryValueEx(
hkey,
"DirectoryName",
NULL,
&dwtype,
(LPBYTE)sz,
&sl);
::RegCloseKey(hkey);
CString strJiaMi = sz;
::ShellExecute(
NULL,
"open",
strJiaMi + "\\jiami.exe",
"",
"",
SW_SHOW);
}
else if(nID == IDS_HELP)
{
::ShellExecute(
m_hWnd,
"open",
"http://www.wjmshome.com/SecretChat.htm",
"",
"",
SW_SHOWNORMAL);
}
else if(nID == SC_MINIMIZE)
{
//利用这两个动作就可实现动画了
if(AfxGetApp()->GetProfileInt("General", "Tray", 1))
{
ShowWindow( SW_MINIMIZE);
ShowWindow(SW_HIDE); //隐藏动画
}
else
{
ShowWindow( SW_MINIMIZE);
}
}
CDialog::OnSysCommand(nID, lParam);
}
// If you add a minimize button to your dialog, you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSecretChatDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // device context for painting
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Draw the icon
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
HCURSOR CSecretChatDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CSecretChatDlg::OnTimer(UINT nIDEvent)
{
if(nIDEvent == 1001) //只负责清除状态提示栏的信息
{
m_statusMessages.SetWindowText("");
}
//LAN启动周期性连接
else if(nIDEvent == 1002)
{
if(m_online)
return;
//只有在没有连接的情况下才,进行LAN周期性连接
m_IP = AfxGetApp()->GetProfileString("General", "LANIP");
m_port = LISTEN_PORT;
if(!prevent_connect())
return; //防止自己连接自己
m_statusMessages.SetWindowText("连接中...");
/*连接不能在线程了完成否则对方无法创建得到服务器套接字对象,
所以就发不了消息给客户机了*/
if( (NULL != (m_pSocket = new CClientSocket)) //确定了指向那个套接字
&& m_pSocket->Create() ) //创建套接字对象
{
if(m_pSocket->Connect(m_IP, m_port) )
{
m_clientOrService = FALSE; //客户端
connect_succeed_update();
}
else
{
CloseSocket();//关闭套接字
}
}
/*非主线程进入得地址不能访问套接字对象
unsigned long nThreadID;
::CreateThread(
NULL,
0,
connect_thread,
this,
0,
&nThreadID);*/
}
/************每隔30秒就向另一方发在线通知**********/
else if(nIDEvent == 1003)
{
if(m_online)
{
//每隔30秒向对方发送一次在线通知
MessagePackage msg;
msg.head = HEAD_ZAIXIANBIAOJI;
SendData(msg, 12);
//当连续有6个30秒没收到对方的在线通知就断定对方不在断开了
m_zai_xian_biao_ji++; //在线标记计算器加一
if(m_zai_xian_biao_ji > 6)
{
if(!m_send_file) //发送文件时不要断开,因为可能由于发送文件使得消息无法发送出去,而产生了错误
{
Disconnection();
m_statusMessages.SetWindowText("对方意外的断开了连接!"); //已经断开服务器连接
}
}
}
/*unsigned long nThreadID;
::CreateThread(
NULL,
0,
zai_xian_biao_ji_thread,
this,
0,
&nThreadID);*/
}
CDialog::OnTimer(nIDEvent);
}
void CSecretChatDlg::OnOK()
{
// TODO: Add extra validation here
//CDialog::OnOK();
}
void CSecretChatDlg::OnCancel()
{
//文件传送问答
if(m_send_file)
{
if(MessageBox(
"是否要取消文件传送?",
"密聊",
MB_YESNO | MB_ICONQUESTION) == IDYES)
{
//::TerminateThread(
// m_send_file_thread_handle,
// NO_ERROR); //结束线程
MessagePackage msg;
msg.head = HEAD_SENDFILE;
msg.ID = HEAD_SENDFILE_STOP;
SendData(msg, 12);
//恢复现场
send_file_comeback_scene();
}
return;
}
if(m_online) //联机时或文件传送中的处理,要用户断开连接才能断开
{
if(MessageBox(
"连接中,是否关闭?",
"密聊",
MB_YESNO | MB_ICONQUESTION) == IDNO)
{
return;
}
//只是告诉对方我已经关闭密聊
MessagePackage msg;
msg.head = HEAD_DISCONNECTION;
msg.ID = HEAD_DISCONNECTION_CLOSE;
SendData(msg, 12);
Disconnection();
}
//清除
MyTaskBarDeleteIcon(101, m_hWnd); //从任务栏状态区删除图标
//保存窗口位置
if(IsWindowVisible() && !IsIconic())
{ //要可见,没最小化
CRect rect;
GetWindowRect(rect); //保存窗口位置
CString str;
str.Format("%i,%i,%i,%i",
rect.top,
rect.bottom,
rect.left,
rect.right);
AfxGetApp()->WriteProfileString("Window", "Position", str);
}
CDialog::OnCancel();
}
void CSecretChatDlg::OnConnectDisconnection() //连接和断开
{
//文件传送问答
if(m_send_file)
{
if(MessageBox(
"是否要取消文件传送?",
"密聊",
MB_YESNO | MB_ICONQUESTION) == IDYES)
{
//::TerminateThread(
// m_send_file_thread_handle,
// NO_ERROR); //结束线程
MessagePackage msg;
msg.head = HEAD_SENDFILE;
msg.ID = HEAD_SENDFILE_STOP;
SendData(msg, 12);
//恢复现场
send_file_comeback_scene();
}
return;
}
if(m_online) //联机时的处理
{
if( MessageBox(
"是否要断开连接?",
"密聊",
MB_YESNO | MB_ICONQUESTION) == IDNO)
{
return;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -