diff --git a/ReadMe.txt b/ReadMe.txt index 156b305..6c43e85 100644 --- a/ReadMe.txt +++ b/ReadMe.txt @@ -1,8 +1,33 @@ 功能:远程桌面 + Radmin + SSH 管理 -注意:可执行文件需要sqlite3.dll才能运行 +注意:可执行文件需要32位 sqlite3.dll才能运行 编译器: VC2010 + +20200316:V1.8 +VNC更新为TightVNC +添加VNC启动按钮 +修复VNC右键缺少的选项 +打开软件前先备份数据库为user.db.bak, 做一颗后悔药 +远程桌面的连接名称更改为主机名称,更容易识别 +工具栏的SSH按钮可选择打开SSH或WINSCP +只能运行一个实例 + +20200316:V1.7.4 +指定Winscp使用scp协议传送文件,因为openwrt不支持sftp。 + +20210316: V1.7.3 +修复打开Radmin时会崩溃的问题,感谢缘份天来定的反馈 + +20210105: V1.7.2 +通过定义SHOW_HOST_PASSWORD,来使编辑主机时显示密码 +登录密码可以通过数据库删除 + +20201228: V1.7.1 +删除打包中的可执行文件,改为在Release中发布 +更改添加主机的中用户名为组合框 +添加头文件#include ,避免高版本编译失败 + 20201222: V1.7 将WinScp和SSH分开,避免传文件时要切换参数 diff --git a/RemoteMan.exe b/RemoteMan.exe deleted file mode 100644 index c0cefea..0000000 Binary files a/RemoteMan.exe and /dev/null differ diff --git a/RemoteMan/AddHostDlg.cpp b/RemoteMan/AddHostDlg.cpp index a54bfde..facade9 100644 --- a/RemoteMan/AddHostDlg.cpp +++ b/RemoteMan/AddHostDlg.cpp @@ -20,7 +20,7 @@ CAddHostDlg::CAddHostDlg(HOST_STRUCT const *pHost, HTREEITEM hItem, CWnd* pPare if (pHost) { bAddHost=false; - m_Password="********"; + m_Password=pHost->Password; memcpy(&m_Host, pHost, sizeof(m_Host)); } else @@ -65,7 +65,7 @@ BOOL CAddHostDlg::OnInitDialog() { pBox->SetCurSel(0); SetCtrlModeDefPort(0); - SetDlgItemText(IDC_EDIT_USER,"Administrator"); + ((CComboBox*)GetDlgItem(IDC_COMBO_USER))->SetCurSel(2); } else { @@ -73,13 +73,18 @@ BOOL CAddHostDlg::OnInitDialog() SetDlgItemInt(IDC_EDIT_HOSTPORT,m_Host.HostPort); SetDlgItemText(IDC_EDIT_HOSTADDR,m_Host.HostAddress); SetDlgItemText(IDC_EDIT_HOSTNAME,m_Host.Name); - SetDlgItemText(IDC_EDIT_USER,m_Host.Account); + SetDlgItemText(IDC_COMBO_USER,m_Host.Account); SetDlgItemText(IDC_EDIT_README,m_Host.ReadMe); SetWindowText("编辑主机"); SetDlgItemText(IDOK,"确定"); SetDlgItemText(IDCANCEL,"取消"); } +#ifdef SHOW_HOST_PASSWORD + CEdit *pEdit = (CEdit*)GetDlgItem(IDC_EDIT_PASSWORD); + pEdit->SetPasswordChar(0); +#endif + return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE } @@ -120,7 +125,7 @@ void CAddHostDlg::OnBnClickedOk() //控制模式 m_Host.CtrlMode=((CComboBox*)GetDlgItem(IDC_COMBO_CTRLMODE))->GetCurSel(); //用户名 - GetDlgItemText(IDC_EDIT_USER,str); + GetDlgItemText(IDC_COMBO_USER,str); str.Trim(); if (str.GetLength()>=sizeof(m_Host.Account)) { diff --git a/RemoteMan/RemoteMan.cpp b/RemoteMan/RemoteMan.cpp index 183e82e..117b1a8 100644 --- a/RemoteMan/RemoteMan.cpp +++ b/RemoteMan/RemoteMan.cpp @@ -38,6 +38,7 @@ CRemoteManApp::CRemoteManApp() char const CTRL_MODE[4][7]={CTRL_MODE_RDP_NAME,CTRL_MODE_RADMIN_NAME,CTRL_MODE_SSH_NAME,CTRL_MODE_VNC_NAME}; CRemoteManApp theApp; +static HANDLE hSem; // CRemoteManApp 初始化 @@ -76,6 +77,44 @@ BOOL CRemoteManApp::InitInstance() // 例如修改为公司或组织名 SetRegistryKey(_T("应用程序向导生成的本地应用程序")); + //只运行一个实例 + hSem = CreateSemaphore(NULL, 1, 1, m_pszExeName); + if (GetLastError() == ERROR_ALREADY_EXISTS) + { + // 关闭信号量句柄 +// CloseHandle(hSem); + // 寻找先前实例的主窗口 + HWND hWndPrevious = ::GetWindow(::GetDesktopWindow(),GW_CHILD); + while (::IsWindow(hWndPrevious)) + { + // 检查窗口是否有预设的标记? + // 有,则是我们寻找的主窗 + if (::GetProp(hWndPrevious, m_pszExeName)) + { + // 如果窗口已经缩小在任务栏中,那么首先先打开 + if(!::IsWindowVisible(hWndPrevious)) + ::PostMessage(hWndPrevious, WM_SYSCOMMAND, SC_MINIMIZE, 0); + // 主窗口已最小化,则恢复其大小 + if (::IsIconic(hWndPrevious)) + ::ShowWindow(hWndPrevious,SW_RESTORE); + // 将主窗激活 + ::SetForegroundWindow(hWndPrevious); + // 将主窗的对话框激活 + ::SetForegroundWindow( + ::GetLastActivePopup(hWndPrevious)); + // 退出本实例 + return FALSE; + } + // 继续寻找下一个窗口 + hWndPrevious = ::GetWindow(hWndPrevious,GW_HWNDNEXT); + } + // 前一实例已存在,但找不到其主窗 + AfxMessageBox("已有一个实例在运行,但找不到它的主窗口!"); + // 可能出错了 + // 退出本实例 + return FALSE; + } + CRemoteManDlg dlg; //在这里打开了数据库并读取了参数 //输入开机密码 if (dlg.SysConfig.SysPassword[0]!=0) @@ -115,3 +154,11 @@ BOOL CRemoteManApp::InitInstance() return FALSE; } + + +int CRemoteManApp::ExitInstance() +{ + // TODO: 在此添加专用代码和/或调用基类 + CloseHandle(hSem); + return CWinApp::ExitInstance(); +} diff --git a/RemoteMan/RemoteMan.h b/RemoteMan/RemoteMan.h index 501380c..0177b0a 100644 --- a/RemoteMan/RemoteMan.h +++ b/RemoteMan/RemoteMan.h @@ -10,6 +10,9 @@ #include "resource.h" // 主符号 +//#define SHOW_HOST_PASSWORD + + #define PASSWORD_MAXLEN 31 #define CTRL_MODE_RDP_NAME "RDP" @@ -34,6 +37,7 @@ class CRemoteManApp : public CWinApp // 实现 DECLARE_MESSAGE_MAP() + virtual int ExitInstance(); }; extern CRemoteManApp theApp; \ No newline at end of file diff --git a/RemoteMan/RemoteMan.rc b/RemoteMan/RemoteMan.rc index 559b4f8..ecf15e8 100644 Binary files a/RemoteMan/RemoteMan.rc and b/RemoteMan/RemoteMan.rc differ diff --git a/RemoteMan/RemoteManDlg.cpp b/RemoteMan/RemoteManDlg.cpp index f53805e..7a597c7 100644 --- a/RemoteMan/RemoteManDlg.cpp +++ b/RemoteMan/RemoteManDlg.cpp @@ -9,6 +9,7 @@ #include "Aes.h" #include "CodeConverter.h" #include "FileDialogEx.h" +#include #pragma comment(lib, "Crypt32.lib") @@ -406,6 +407,12 @@ CRemoteManDlg::CRemoteManDlg(CWnd* pParent /*=NULL*/) } else strcpy_s(Path,sizeof(Path),"User.db"); + //先备份一下数据库,做一颗后悔药 + char BakPath[MAX_PATH]; + sprintf_s(BakPath,MAX_PATH,"%s.bak",Path); + CFileStatus fstatus; + if (CFile::GetStatus(Path,fstatus)) + CopyFile(Path,BakPath,FALSE); if (!OpenUserDb(CodeConverter::AsciiToUtf8(Path).c_str())) { @@ -460,13 +467,14 @@ BEGIN_MESSAGE_MAP(CRemoteManDlg, CDialogEx) ON_BN_CLICKED(ID_MENU_DELHOST, &CRemoteManDlg::OnMenuClickedDelHost) ON_BN_CLICKED(ID_MENU_CONNENT, &CRemoteManDlg::OnMenuClickedConnentHost) ON_BN_CLICKED(ID_MENU_WINSCP_CONNENT, &CRemoteManDlg::OnMenuClickedWinScpConnent) - ON_BN_CLICKED(ID_MENU_VNC_LISTEN,&CRemoteManDlg::OnMenuClickedVncListen) ON_BN_CLICKED(ID_MENU_RENAMEGROUP, &CRemoteManDlg::OnMenuClickedRenameGroup) ON_BN_CLICKED(ID_MENU_EXPORTGROUP,&CRemoteManDlg::OnMenuClickedExportGroup) ON_BN_CLICKED(ID_MENU_IMPORTGROUP,&CRemoteManDlg::OnMenuClickedImportGroup) + ON_COMMAND_RANGE(ID_MENU_OPENSSH,ID_MENU_OPEN_WINSCP,&CRemoteManDlg::OnMenuClickedOpenSSH) ON_BN_CLICKED(IDC_TOOLER_OPENRADMIN, &CRemoteManDlg::OnToolbarClickedOpenRadmin) ON_BN_CLICKED(IDC_TOOLER_OPENMSTSC, &CRemoteManDlg::OnToolbarClickedOpenMstsc) ON_BN_CLICKED(IDC_TOOLER_OPENSSH, &CRemoteManDlg::OnToolbarClickedOpenSSH) + ON_BN_CLICKED(IDC_TOOLER_OPENVNC, &CRemoteManDlg::OnToolbarClickedOpenVNC) ON_BN_CLICKED(IDC_CHECK_MST_SHOW_WALLPAPER, &CRemoteManDlg::OnBnClickedCheckMstShowWallpaper) ON_BN_CLICKED(IDC_CHECK_MST_DRIVE, &CRemoteManDlg::OnBnClickedCheckMstDrive) ON_BN_CLICKED(IDC_CHECK_MST_AUDIO, &CRemoteManDlg::OnBnClickedCheckMstAudio) @@ -489,6 +497,7 @@ BEGIN_MESSAGE_MAP(CRemoteManDlg, CDialogEx) ON_BN_CLICKED(IDC_BTN_SEARCH, &CRemoteManDlg::OnBnClickedBtnSearch) ON_WM_SIZE() ON_WM_SETTINGCHANGE() + ON_WM_DESTROY() END_MESSAGE_MAP() //TVN_ENDLABELEDIT 删除这行会不能设置断点,不信你试试 @@ -508,14 +517,15 @@ void CRemoteManDlg::InitToolBar(void) m_ToolbarImageList.Add(AfxGetApp()->LoadIcon(IDR_MAINFRAME)); m_ToolbarImageList.Add(AfxGetApp()->LoadIcon(IDI_RADMIN)); m_ToolbarImageList.Add(AfxGetApp()->LoadIcon(IDI_SSH)); + m_ToolbarImageList.Add(AfxGetApp()->LoadIcon(IDI_ICON_VNC)); m_ToolbarImageList.Add(AfxGetApp()->LoadIcon(IDI_SET)); - UINT array[13]={ID_MENU_ADDGROUP,ID_MENU_DELGROUP,ID_SEPARATOR, + UINT array[14]={ID_MENU_ADDGROUP,ID_MENU_DELGROUP,ID_SEPARATOR, ID_MENU_ADDHOST,ID_MENU_EDITHOST,ID_MENU_DELHOST,ID_SEPARATOR, - ID_MENU_CONNENT,IDC_TOOLER_OPENMSTSC,IDC_TOOLER_OPENRADMIN,IDC_TOOLER_OPENSSH,ID_SEPARATOR, + ID_MENU_CONNENT,IDC_TOOLER_OPENMSTSC,IDC_TOOLER_OPENRADMIN,IDC_TOOLER_OPENSSH,IDC_TOOLER_OPENVNC,ID_SEPARATOR, IDC_TOOLER_SET}; m_ToolBar.Create(this); - m_ToolBar.SetButtons(array,13); + m_ToolBar.SetButtons(array,14); m_ToolBar.SetButtonText(0,"添加分组"); m_ToolBar.SetButtonText(1,"删除分组"); m_ToolBar.SetButtonText(3,"添加主机"); @@ -525,12 +535,13 @@ void CRemoteManDlg::InitToolBar(void) m_ToolBar.SetButtonText(8,"远程桌面"); m_ToolBar.SetButtonText(9,"Radmin"); m_ToolBar.SetButtonText(10,"SSH软件"); - m_ToolBar.SetButtonText(12,"设置"); + m_ToolBar.SetButtonText(11,"VNC"); + m_ToolBar.SetButtonText(13,"设置"); m_ToolBar.GetToolBarCtrl().SetImageList(&m_ToolbarImageList); - m_ToolBar.SetSizes(CSize(72,56),CSize(32,32)); + m_ToolBar.SetSizes(CSize(70,56),CSize(32,32)); - m_ToolBar.MoveWindow(CRect(0,-1,760,62)); //移动工具栏在父窗口的位置 + m_ToolBar.MoveWindow(CRect(0,-1,820,62)); //移动工具栏在父窗口的位置 m_ToolBar.ShowWindow(SW_SHOW); //显示工具栏 // RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); } @@ -568,6 +579,9 @@ BOOL CRemoteManDlg::OnInitDialog() HICON hico=(HICON)LoadImage(AfxGetApp()->m_hInstance,MAKEINTRESOURCE(IDI_MSTSC),IMAGE_ICON,64,64,LR_DEFAULTCOLOR); ((CStatic*)GetDlgItem(IDC_STATIC_PIC))->SetIcon(hico); + //设置程序标志,用于单实例运行时还原窗口 + ::SetProp(m_hWnd,AfxGetApp()->m_pszExeName,(HANDLE)1); + InitToolBar(); m_ImageList.Create(24,24,ILC_COLOR24|ILC_MASK,1,1); @@ -584,7 +598,7 @@ BOOL CRemoteManDlg::OnInitDialog() m_List.SetImageList(&m_ImageList,LVSIL_SMALL); m_List.InsertColumn(0,"类型",LVCFMT_LEFT,ListDefColumnWidth[0]); m_List.InsertColumn(1,"服务器名称",LVCFMT_LEFT,ListDefColumnWidth[1]); - m_List.InsertColumn(2,"域名",LVCFMT_LEFT,ListDefColumnWidth[2]); + m_List.InsertColumn(2,"主机",LVCFMT_LEFT,ListDefColumnWidth[2]); m_List.InsertColumn(3,"端口",LVCFMT_LEFT,ListDefColumnWidth[3]); m_List.InsertColumn(4,"账户",LVCFMT_LEFT,ListDefColumnWidth[4]); m_List.InsertColumn(5,"状态",LVCFMT_LEFT,ListDefColumnWidth[5]); @@ -889,6 +903,21 @@ void CRemoteManDlg::OnMenuClickedEditHost(void) int rc = sqlite3_exec(m_pDB, sqlstr, ReadHostCallBack, &HostArray, NULL); if (HostArray.GetSize()!=1) return; HOST_STRUCT Host=HostArray[0]; + //设置中是否要显示密码 +#ifdef SHOW_HOST_PASSWORD + if (Host.Password[0]!=0) + { + byte data[36]; + int len=StringToBytes(Host.Password,data); + if (len>0) + { + len=AesDeCode(data,len,AES_KEY); + if (len>0) strcpy_s(Host.Password,sizeof(Host.Password),(char*)data); + } + } +#else + strcpy_s(Host.Password,sizeof(Host.Password),"********"); +#endif CAddHostDlg Dlg(&Host, 0); if (Dlg.DoModal()!=IDOK) return; @@ -997,12 +1026,28 @@ void CRemoteManDlg::OnToolbarClickedOpenRadmin(void) } +void CRemoteManDlg::OnMenuClickedOpenSSH(UINT id) +{ + char const *path = id==ID_MENU_OPENSSH ? SysConfig.SSHPath:SysConfig.WinScpPath; + if (strstr(path,".exe")) + WinExec(path,SW_SHOW); +} + void CRemoteManDlg::OnToolbarClickedOpenSSH(void) { - if (strstr(SysConfig.SSHPath,".exe")) - WinExec(SysConfig.SSHPath,SW_SHOW); + CMenu Menu; + Menu.LoadMenu(IDR_MENU_RCLICK); + CMenu *pSubMenu=Menu.GetSubMenu(7); + CPoint point; + GetCursorPos(&point); + pSubMenu->TrackPopupMenu(TPM_LEFTALIGN|TPM_LEFTBUTTON|TPM_VERTICAL,point.x,point.y,this); } +void CRemoteManDlg::OnToolbarClickedOpenVNC(void) +{ + if (strstr(SysConfig.VNCPath,".exe")) + WinExec(SysConfig.VNCPath,SW_SHOW); +} void CRemoteManDlg::MstscConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const *pConfig) { @@ -1126,7 +1171,7 @@ void CRemoteManDlg::MstscConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const * //存储到文件,借用str变量 GetTempPath(sizeof(str),str); - strcat_s(str,sizeof(str),"rdp_tmp"); + strcat_s(str,sizeof(str),pHost->Name); // sprintf_s(str,sizeof(str),"c:\\%s_RDP.rdp",pHost->HostAddress); CFile file; if (!file.Open(str,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)) return; @@ -1157,7 +1202,7 @@ void RadminConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const *pConfig, int C return; } - char str1[100],str2[30]; + char str1[100],str2[64]; //启动Radmin连接服务器 if (pHost->HostPort==4899) sprintf_s(str1,sizeof(str1),"/connect:%s %s %s",pHost->HostAddress,MODE[CtrlMode],COLOUR[pConfig->RadminColor]); @@ -1196,7 +1241,7 @@ void RadminConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const *pConfig, int C void VNCConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const *pConfig) { - char const *VNCPath="vncviewer.exe"; //当路径为空时使用同目录下的radmin.exe + char const *VNCPath="tvnviewer.exe"; //当路径为空时使用同目录下的tvnviewer.exe if (pConfig->VNCPath[0]!=0) VNCPath=pConfig->VNCPath; //查看文件是否存在 CFileStatus fstatus; @@ -1208,47 +1253,12 @@ void VNCConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const *pConfig) char str1[100],str2[512]; //启动VNC连接服务器 sprintf_s(str1,sizeof(str1),"%s:%d",pHost->HostAddress,pHost->HostPort); - if (pConfig->RadminFullScreen) +/* if (pConfig->RadminFullScreen) sprintf_s(str2,sizeof(str2),"%s -FullScreen %s",VNCPath,str1); - else - sprintf_s(str2,sizeof(str2),"%s %s",VNCPath,str1); + else*/ + sprintf_s(str2,sizeof(str2),"%s %s -password=%s",VNCPath,str1,pHost->Password); TRACE("%s\r\n",str2); WinExec(str2,SW_SHOW); - //查找窗口标题框 - sprintf_s(str2,sizeof(str2),"VNC 身份认证 %s",str1); - HWND hWnd; - clock_t t2,t1=clock(); - for (t2=t1;t2-t1<8000;t2=clock()) - { - Sleep(1); - hWnd=FindWindow(NULL,str2); - if (hWnd!=NULL) - break; - } - if (hWnd==NULL) return; - //填写信息并发送 - HWND PasswordWnd=::GetDlgItem(hWnd,0x3f1); - if (PasswordWnd!=NULL) - ::SendMessage(PasswordWnd,WM_SETTEXT,0,(LPARAM)pHost->Password); - ::PostMessage(hWnd,WM_COMMAND,1,0); -} - -void CRemoteManDlg::OnMenuClickedVncListen(void) -{ - char const *VNCPath="vncviewer.exe"; //当路径为空时使用同目录下的radmin.exe - if (SysConfig.VNCPath[0]!=0) VNCPath=SysConfig.VNCPath; - //查看文件是否存在 - CFileStatus fstatus; - if (strstr(VNCPath,".exe")==NULL || !CFile::GetStatus(VNCPath,fstatus)) - { - AfxMessageBox("VNC路径设置错误"); - return; - } - char str[512]; - sprintf_s(str,sizeof(str),"%s -Listen",VNCPath); - TRACE("%s\r\n",str); - WinExec(str,SW_SHOW); - MessageBox("已开启端口:5500 的监听."); } void SSHConnent(HOST_STRUCT const *pHost, CONFIG_STRUCT const *pConfig) @@ -1377,7 +1387,7 @@ void CRemoteManDlg::OnMenuClickedWinScpConnent(void) return; } //命令行 - sprintf_s(str,sizeof(str),"%s %s:%s@%s:%d",SysConfig.WinScpPath, Host.Account, Host.Password, Host.HostAddress, Host.HostPort); + sprintf_s(str,sizeof(str),"%s scp://%s:%s@%s:%d",SysConfig.WinScpPath, Host.Account, Host.Password, Host.HostAddress, Host.HostPort); TRACE("%s\r\n",str); WinExec(str,SW_SHOW); } @@ -1609,12 +1619,12 @@ void CRemoteManDlg::OnNMRClickList1(NMHDR *pNMHDR, LRESULT *pResult) m_List.GetItemText(pNMItemActivate->iItem,0,str,10); if (strcmp(str,CTRL_MODE_RADMIN_NAME)==0) Index=5; - else if (strcmp(str,CTRL_MODE_RDP_NAME)==0) + else if (strcmp(str,CTRL_MODE_RDP_NAME)==0 || strcmp(str,CTRL_MODE_VNC_NAME)==0) Index=4; else if (strcmp(str,CTRL_MODE_SSH_NAME)==0) Index=6; - else if (strcmp(str,CTRL_MODE_VNC_NAME)==0) - Index=7; +// else if (strcmp(str,CTRL_MODE_VNC_NAME)==0) +// Index=7; else return; } @@ -2128,3 +2138,13 @@ void CRemoteManDlg::OnSettingChange(UINT uFlags, LPCTSTR lpszSection) // TODO: 在此处添加消息处理程序代码 } + + + + +void CRemoteManDlg::OnDestroy() +{ + CDialogEx::OnDestroy(); + ::RemoveProp(m_hWnd,AfxGetApp()->m_pszExeName); + // TODO: 在此处添加消息处理程序代码 +} diff --git a/RemoteMan/RemoteManDlg.h b/RemoteMan/RemoteManDlg.h index 06e29e9..5af2c4d 100644 --- a/RemoteMan/RemoteManDlg.h +++ b/RemoteMan/RemoteManDlg.h @@ -22,7 +22,7 @@ struct GROUP_STRUCT class CRemoteManDlg : public CDialogEx { //工具栏ID号 -enum {IDC_TOOLER_OPENRADMIN=10001,IDC_TOOLER_OPENMSTSC, IDC_TOOLER_OPENSSH, IDC_TOOLER_SET}; +enum {IDC_TOOLER_OPENRADMIN=10001,IDC_TOOLER_OPENMSTSC, IDC_TOOLER_OPENSSH, IDC_TOOLER_OPENVNC, IDC_TOOLER_SET}; // 构造 public: CRemoteManDlg(CWnd* pParent = NULL); // 标准构造函数 @@ -107,10 +107,12 @@ enum {IDC_TOOLER_OPENRADMIN=10001,IDC_TOOLER_OPENMSTSC, IDC_TOOLER_OPENSSH, IDC_ afx_msg void OnBnClickedBtnCheckOnline(); afx_msg void OnBnClickedBtnSearch(); void DataBaseConversion(int Ver); - void OnMenuClickedVncListen(void); CDimEdit m_SearchEdit; afx_msg void OnSize(UINT nType, int cx, int cy); afx_msg void OnSettingChange(UINT uFlags, LPCTSTR lpszSection); bool GetSelectHost(HOST_STRUCT *pHost); bool bScanExit; + void OnToolbarClickedOpenVNC(void); + void OnMenuClickedOpenSSH(UINT id); + afx_msg void OnDestroy(); }; diff --git a/RemoteMan/res/vnc.ico b/RemoteMan/res/vnc.ico index f3c818a..df7587d 100644 Binary files a/RemoteMan/res/vnc.ico and b/RemoteMan/res/vnc.ico differ diff --git a/RemoteMan/resource.h b/RemoteMan/resource.h index ccfe162..f197290 100644 Binary files a/RemoteMan/resource.h and b/RemoteMan/resource.h differ