?? secretchatdlg.cpp
字號:
AfxGetResourceHandle(),
hRsrc);
::sndPlaySound(
(LPCTSTR)::LockResource(hglb),
SND_MEMORY | SND_SYNC | SND_NODEFAULT);
::FreeResource(hglb);
/**********************************/
}
BOOL CSecretChatDlg::Disconnection() //斷開連接
{
if(!m_online) //聯機時的處理
return TRUE;
/*正在發送或接收消息時不能斷開連接,否則會出現嚴重的錯誤提示
if(m_send != 0 || m_receive != -1)
{
MessageBox(
"發送或接收消息時,請別斷開連接",
"密聊",
MB_ICONEXCLAMATION);
return FALSE;
}*/
m_statusMessages.SetWindowText("已經斷開連接"); //已經斷開服務器連接
//斷開連接成功后改變按鈕的狀態
CString str = "連接";
m_connect.SetIcon(IDI_CONNECT);
m_connect.SetTooltipText(&str);
m_connect.SetWindowText(str);
/*這里有些邏輯錯誤,雙方會造成循環發送HEAD_DISCONNECTION消息
MessagePackage msg;
msg.head = HEAD_DISCONNECTION;
SendData(msg, 12);
*/
m_online = FALSE; //提示斷線
TrayIcon(); //設置狀態區圖標
SetWindowText("密聊 (未連接)"); //提示已連接還是未連接
//關閉套接字
CloseSocket();//斷開了那還怎么發通知斷線消息給對方呀?
PlayWaveSound(IDR_OFFLINE); //斷開時的聲音提示
return TRUE;
}
BOOL CSecretChatDlg::Connect() //建立連接
{
if(m_online) //沒聯機時的處理
return TRUE;
if(m_connectDlg.DoModal() != IDOK)
{
return FALSE;
}
m_IP = m_connectDlg.m_IP;
m_port = m_connectDlg.m_port;
if(!prevent_connect())
return FALSE; //防止自己連接自己
m_statusMessages.SetWindowText("連接中...");
/*連接不能在線程了完成否則對方無法創建得到服務器套接字對象,
所以就發不了消息給客戶機了*/
if( (NULL != (m_pSocket = new CClientSocket)) //確定了指向那個套接字
&& m_pSocket->Create() ) //創建套接字對象
{
if(m_pSocket->Connect(m_IP, m_port) )
{
//成功連接的IP地址記入注冊表中
AfxGetApp()->WriteProfileString("Connect", "IPHistory", m_IP);
m_clientOrService = FALSE; //客戶端
connect_succeed_update();
}
else
{
CloseSocket();//關閉套接字
m_statusMessages.SetWindowText("連接失敗!");
PlayWaveSound(IDR_OFFLINE); //連接失敗時的聲音提示
return FALSE;
}
}
else
{
return FALSE;
}
/*
unsigned long nThreadID;
::CreateThread(
NULL,
0,
connect_thread,
this,
0,
&nThreadID);*/
return TRUE;
}
int CSecretChatDlg::SendData(MessagePackage &msg, int n) //發送數據
{
//斷開連接就不能再發送消息了
if(!m_online)
return 0;
if(m_clientOrService) //服務器端
{
m_socketListen.m_pServiceSocket->Send(&msg, n);
//錯誤提示
CuoWuTiShi();
}
else //客戶機端
{
m_pSocket->Send(&msg, n);
//錯誤提示
CuoWuTiShi();
}
return 0;
}
void CSecretChatDlg::WinHelp(DWORD dwData, UINT nCmd) //按下F1打開幫助文件
{
::ShellExecute(
m_hWnd,
"open",
"http://www.wjmshome.com/SecretChat.htm",
"",
"",
SW_SHOWNORMAL);
//CDialog::WinHelp(dwData, nCmd);
}
void CSecretChatDlg::OnSecretkey() //通訊雙方的密鑰設置和密鑰管理
{
m_setupDlg.m_index = 0;
if(m_setupDlg.DoModal() == IDOK)
{
}
}
void CSecretChatDlg::OnSetup() //常規設置
{
m_setupDlg.m_index = 3;
if(m_setupDlg.DoModal() == IDOK)
{
}
}
BOOL CSecretChatDlg::InstallPrivateKey(CString fileName/*安裝的文件名*/)
{
if(fileName == "")
{ //當沒說明安裝的文件時,就安裝默認的
fileName =
m_appName
+ "\\user\\"
+ AfxGetApp()->GetProfileString("SecretKeySetup", "UserPrivateKey");
}
CFile file;
SecretKey secretKey;
if(!file.Open(
fileName,
CFile::modeReadWrite | CFile::typeBinary))
return FALSE;
if(file.GetLength() != sizeof(SecretKey))
return FALSE;
file.SeekToBegin();
file.Read(&secretKey, sizeof(SecretKey));
file.Close();
if(secretKey.ID != SECRETKEY_ID)
return FALSE;
if(secretKey.privateOrPublic != SECRETKEY_PRIVATE)
return FALSE;
m_userNameStatic.SetWindowText(AfxGetApp()->GetProfileString("SecretKeySetup", "UserPrivateKey"));
m_userNameStatic.SetLink(TRUE,FALSE);
m_userNameStatic.SetTextColor(RGB(0,128,192));
m_userNameStatic.SetLinkCursor(AfxGetApp()->LoadCursor( IDC_HAND));
m_private_key_send.SK_to_vlong(secretKey.sk/*自己的私鑰*/);
m_private_key_receive.SK_to_vlong(secretKey.sk/*自己的私鑰*/);
return TRUE;
}
BOOL CSecretChatDlg::InstallPublicKey(CString fileName/*安裝的文件名*/)
{
if(fileName == "")
{ //當沒說明安裝的文件時,就安裝默認的
fileName =
m_appName
+ "\\friend\\"
+ AfxGetApp()->GetProfileString("SecretKeySetup", "FriendPublicKey");
}
CFile file;
SecretKey secretKey;
if(!file.Open(
fileName,
CFile::modeReadWrite | CFile::typeBinary))
return FALSE;
if(file.GetLength() != sizeof(SecretKey))
return FALSE;
file.SeekToBegin();
file.Read(&secretKey, sizeof(SecretKey));
file.Close();
if(secretKey.ID != SECRETKEY_ID)
return FALSE;
if(secretKey.privateOrPublic != SECRETKEY_PUBLIC)
return FALSE;
m_friendNameStatic.SetWindowText(AfxGetApp()->GetProfileString("SecretKeySetup", "FriendPublicKey"));
m_friendNameStatic.SetLink(TRUE,FALSE);
m_friendNameStatic.SetTextColor(RGB(255,128,128));
m_friendNameStatic.SetLinkCursor(AfxGetApp()->LoadCursor( IDC_HAND));
m_public_key_send.PK_to_vlong(secretKey.pk/*對方的公鑰*/);
m_public_key_receive.PK_to_vlong(secretKey.pk/*對方的公鑰*/);
return TRUE;
}
BOOL CSecretChatDlg::MyUpdateData() //根據注冊表數據進行設置
{
//顯示出私鑰和公鑰名
m_userNameStatic.SetWindowText(
AfxGetApp()->GetProfileString("SecretKeySetup", "UserPrivateKey"));
m_friendNameStatic.SetWindowText(
AfxGetApp()->GetProfileString("SecretKeySetup", "FriendPublicKey"));
m_userNameStatic.SetLink(TRUE,FALSE);
m_userNameStatic.SetTextColor(RGB(0,128,192));
m_userNameStatic.SetLinkCursor(AfxGetApp()->LoadCursor( IDC_HAND));
m_friendNameStatic.SetLink(TRUE,FALSE);
m_friendNameStatic.SetTextColor(RGB(255,128,128));
m_friendNameStatic.SetLinkCursor(AfxGetApp()->LoadCursor( IDC_HAND));
//頂層窗口
if(AfxGetApp()->GetProfileInt("General", "Top", 0))
{
::SetWindowPos(
GetSafeHwnd(),
HWND_TOPMOST,
0,0,0,0,
SWP_NOMOVE | SWP_NOSIZE);
}
else
{
::SetWindowPos(
GetSafeHwnd(),
HWND_NOTOPMOST,
0,0,0,0,
SWP_NOMOVE | SWP_NOSIZE);
}
//顯示位置
TrayIcon();
//LAN啟動周期性連接
if(AfxGetApp()->GetProfileInt("General", "LANStartup", 0))
{
SetTimer(1002, 60000, NULL); //以60秒為周期連接LAN
}
else
{
KillTimer(1002);
}
//安裝私鑰和公鑰
InstallPrivateKey();
InstallPublicKey();
return TRUE;
}
BOOL CSecretChatDlg::PreTranslateMessage(MSG* pMsg)
{
//快捷鍵
if( pMsg->message == WM_KEYDOWN)
{
BOOL bCtrl = ::GetKeyState( VK_CONTROL) & 0x8000;
BOOL bShift = ::GetKeyState( VK_SHIFT) & 0x8000;
BOOL bAlt = ::GetKeyState( VK_MENU) & 0x8000;
switch( pMsg->wParam)
{
case VK_ESCAPE: //不能Esc就退出程序
if(AfxGetApp()->GetProfileInt("General", "Tray", 1))
{
ShowWindow( SW_MINIMIZE);
ShowWindow(SW_HIDE); //隱藏動畫
}
else
{
ShowWindow( SW_MINIMIZE);
}
return TRUE; //必須要立即返回
break;
case VK_RETURN:
if( bCtrl)
{
SendMessage( WM_COMMAND, IDC_SEND);
return TRUE;
}
break;
case 'J':
if( bCtrl)
{
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);
return TRUE;
}
break;
}
}
//@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
m_toolTip.RelayEvent(pMsg); //
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
return CDialog::PreTranslateMessage(pMsg);
}
void CSecretChatDlg::OnUsername() //查看用戶的私鑰信息
{
CSecretKeyEdit secretKeyEditDlg;
secretKeyEditDlg.m_select = SECRETKEY_PRIVATE;
if(secretKeyEditDlg.validateSecretKey(
m_appName
+ "\\user\\"
+ AfxGetApp()->GetProfileString("SecretKeySetup", "UserPrivateKey"))
!= SECRETKEY_PRIVATE)
{
MessageBox(
"不是用戶私鑰文件",
"密聊",
MB_ICONINFORMATION);
return;
}
secretKeyEditDlg.DoModal();
}
void CSecretChatDlg::OnFriendname() //查看好友的公鑰信息
{
CSecretKeyEdit secretKeyEditDlg;
secretKeyEditDlg.m_select = SECRETKEY_PUBLIC;
if(secretKeyEditDlg.validateSecretKey(
m_appName
+ "\\friend\\"
+ AfxGetApp()->GetProfileString("SecretKeySetup", "FriendPublicKey"))
!= SECRETKEY_PUBLIC)
{
MessageBox(
"不是好友公鑰文件",
"密聊",
MB_ICONINFORMATION);
return;
}
secretKeyEditDlg.DoModal();
}
BOOL CSecretChatDlg::AskPublicKey() //請求獲得連線好友的公鑰文件
{
if(m_online)
{
MessagePackage msg;
msg.head = HEAD_CLAIM_PUBLIC_KEY;
SendData(msg, sizeof(msg));
return TRUE;
}
else
{
MessageBox(
"需要聯機才能請求獲得對方的公鑰文件",
"密聊",
MB_ICONINFORMATION);
return FALSE;
}
}
BOOL CSecretChatDlg::ClaimPublicKey(MessagePackage &msg) //請求對方的公鑰
{
//生成公鑰信息
SecretKey secretKey;
CFile file;
if(!file.Open(
m_appName + "\\user\\" + AfxGetApp()->GetProfileString("SecretKeySetup", "UserPrivateKey"),
CFile::modeReadWrite | CFile::typeBinary))
return FALSE;
if(file.GetLength() != sizeof(SecretKey))
return FALSE;
file.SeekToBegin();
file.Read(&secretKey, sizeof(SecretKey));
file.Close();
//清除私鑰信息
char chTemp[2048 / 8];
for(int i = 0;i < (2048 / 8);i++)
{
chTemp[i] = 0;
}
::MoveMemory(
(char *)&secretKey.sk, //目標
chTemp, //源內容
2048 / 8);
secretKey.privateOrPublic = SECRETKEY_PUBLIC;//公鑰標記
msg.head = HEAD_REVERT_PUBLIC_KEY; //回復給對方
::MoveMemory(
msg.data, //目標
(char *)&secretKey, //源內容
sizeof(SecretKey)); //公鑰文件信息包涵公鑰文件名
SendData(msg, sizeof(msg));
return TRUE;
}
BOOL CSecretChatDlg::RevertPublicKey(MessagePackage &msg) //接收對方的公鑰
{
SecretKey secretKey;
CSecretKeyEdit secretKeyEditDlg;
CString fileName;
CFile file;
CFileFind find;
::MoveMemory(
(char *)&secretKey, //目標
msg.data, //源內容
sizeof(SecretKey)); //公鑰文件信息包涵公鑰文件名
fileName = //密鑰的文件全路徑
m_appName
+ "\\friend\\"
+ secretKeyEditDlg.CharToCString(secretKey.userName, 32)
+ ".pk";
if(find.FindFile(fileName)) //文件存在
{
MessageBox(
"對方的公鑰文件 "
+ secretKeyEditDlg.CharToCString(secretKey.userName, 32)
+ ".pk 已經存在",
"密聊",
MB_ICONEXCLAMATION);
return FALSE;
}
//生成公鑰文件
file.Open(
fileName,//密鑰的文件全路徑
CFile::modeCreate | CFile::modeReadWrite | CFile::typeBinary);
file.Write(
&secretKey,
sizeof(SecretKey)); //寫入信息
file.Close();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -