diff --git a/server/2015Remote/2015Remote.cpp b/server/2015Remote/2015Remote.cpp index efcc0d6..dced3af 100644 --- a/server/2015Remote/2015Remote.cpp +++ b/server/2015Remote/2015Remote.cpp @@ -22,11 +22,11 @@ BOOL ServerPair::StartServer(pfnNotifyProc NotifyProc, pfnOfflineProc OffProc, USHORT uPort) { UINT ret1 = m_tcpServer->StartServer(NotifyProc, OffProc, uPort); - if (ret1) THIS_APP->MessageBox(CString("启动TCP服务失败: ") + std::to_string(uPort).c_str() - + CString("。错误码: ") + std::to_string(ret1).c_str(), "提示", MB_ICONINFORMATION); + if (ret1) THIS_APP->MessageBox(_L(_T("启动TCP服务失败: ")) + std::to_string(uPort).c_str() + + _L(_T("。错误码: ")) + std::to_string(ret1).c_str(), _TR("提示"), MB_ICONINFORMATION); UINT ret2 = m_udpServer->StartServer(NotifyProc, OffProc, uPort); - if (ret2) THIS_APP->MessageBox(CString("启动UDP服务失败: ") + std::to_string(uPort).c_str() - + CString("。错误码: ") + std::to_string(ret2).c_str(), "提示", MB_ICONINFORMATION); + if (ret2) THIS_APP->MessageBox(_L(_T("启动UDP服务失败: ")) + std::to_string(uPort).c_str() + + _L(_T("。错误码: ")) + std::to_string(ret2).c_str(), _TR("提示"), MB_ICONINFORMATION); return (ret1 == 0 || ret2 == 0); } @@ -109,9 +109,12 @@ std::string GetPwdHash(); bool RegisterZstaMenu(const std::string& exePath) { HKEY hKey; - const char* compressText = "压缩为 ZSTA 文件"; - const char* extractText = "解压 ZSTA 文件"; - const char* zstaDesc = "ZSTA 压缩文件"; + CString _compressText = _TR("压缩为 ZSTA 文件"); + CString _extractText = _TR("解压 ZSTA 文件"); + CString _zstaDesc = _TR("ZSTA 压缩文件"); + const char* compressText = (LPCSTR)_compressText; + const char* extractText = (LPCSTR)_extractText; + const char* zstaDesc = (LPCSTR)_zstaDesc; const char* zstaExt = "ZstaArchive"; // 文件右键 @@ -412,7 +415,7 @@ BOOL CMy2015RemoteApp::InitInstance() if (ERROR_ALREADY_EXISTS == GetLastError()) { SAFE_CLOSE_HANDLE(m_Mutex); m_Mutex = NULL; - MessageBox("一个主控程序已经在运行,请检查任务管理器。", + MessageBoxL("一个主控程序已经在运行,请检查任务管理器。", "提示", MB_ICONINFORMATION); Mprintf("[InitInstance] 一个主控程序已经在运行,退出。"); return FALSE; @@ -436,6 +439,11 @@ BOOL CMy2015RemoteApp::InitInstance() pSplash->UpdateProgressDirect(10, _T("正在初始化公共控件...")); + pSplash->UpdateProgressDirect(12, "正在加载语言包..."); + auto lang = THIS_CFG.GetStr("settings", "Language", "en_US"); + g_Lang.Init(); // 初始化,自动找 exe 目录下的 lang 文件夹 + g_Lang.Load(lang.c_str()); + // 如果一个运行在 Windows XP 上的应用程序清单指定要 // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式, //则需要 InitCommonControlsEx()。否则,将无法创建窗口。 diff --git a/server/2015Remote/2015Remote.h b/server/2015Remote/2015Remote.h index 057da0d..ead3872 100644 --- a/server/2015Remote/2015Remote.h +++ b/server/2015Remote/2015Remote.h @@ -26,8 +26,8 @@ private: Server* m_tcpServer; Server* m_udpServer; public: - ServerPair(int method=0) : - m_tcpServer(new IOCPServer), + ServerPair(int method=0, HWND hWnd = 0) : + m_tcpServer(new IOCPServer(hWnd)), m_udpServer(method ? (Server*)new IOCPKCPServer : new IOCPUDPServer) {} virtual ~ServerPair() { @@ -108,7 +108,7 @@ public: auto methods = StringToVector(method, ';', list.size()); for (int i=0; iGetSafeHwnd()); BOOL ret = svr->StartServer(NotifyProc, OffProc, port); if (ret == FALSE) { SAFE_DELETE(svr); diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index f6f355b..816c658 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -59,7 +59,7 @@ #define TIMER_CLOSEWND 2 #define TIMER_CLEAR_BALLOON 3 #define TIMER_HEARTBEAT_CHECK 4 -#define TODO_NOTICE MessageBoxA("This feature has not been implemented!\nPlease contact: 962914132@qq.com", "提示", MB_ICONINFORMATION); +#define TODO_NOTICE MessageBoxL("This feature has not been implemented!\nPlease contact: 962914132@qq.com", "提示", MB_ICONINFORMATION); #define TINY_DLL_NAME "TinyRun.dll" #define FRPC_DLL_NAME "Frpc.dll" @@ -120,7 +120,7 @@ std::string PluginPath() ////////////////////////////////////////////////////////////////////////// -class CAboutDlg : public CDialogEx +class CAboutDlg : public CDialogLangEx { public: CAboutDlg(); @@ -136,13 +136,13 @@ protected: DECLARE_MESSAGE_MAP() }; -CAboutDlg::CAboutDlg() : CDialogEx(CAboutDlg::IDD) +CAboutDlg::CAboutDlg() : CDialogLangEx(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx) @@ -377,7 +377,7 @@ std::string CMy2015RemoteDlg::GetHardwareID(int v) } } -CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogEx(CMy2015RemoteDlg::IDD, pParent) +CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogLangEx(CMy2015RemoteDlg::IDD, pParent) { m_ClientMap = NewClientList(); g_StartTick = GetTickCount(); @@ -453,7 +453,7 @@ CMy2015RemoteDlg::~CMy2015RemoteDlg() void CMy2015RemoteDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_ONLINE, m_CList_Online); DDX_Control(pDX, IDC_MESSAGE, m_CList_Message); DDX_Control(pDX, IDC_GROUP_TAB, m_GroupTab); @@ -600,6 +600,7 @@ void CMy2015RemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam) case WM_RBUTTONDOWN: { CMenu Menu; Menu.LoadMenu(IDR_MENU_NOTIFY); + TranslateMenu(&Menu); CPoint Point; GetCursorPos(&Point); SetForegroundWindow(); //设置当前窗口 @@ -615,6 +616,7 @@ void CMy2015RemoteDlg::OnIconNotify(WPARAM wParam, LPARAM lParam) VOID CMy2015RemoteDlg::CreateSolidMenu() { m_MainMenu.LoadMenu(IDR_MENU_MAIN); + TranslateMenu(&m_MainMenu); CMenu* SubMenu = m_MainMenu.GetSubMenu(1); std::string masterHash(GetMasterHash()); if (GetPwdHash() != masterHash) { @@ -622,7 +624,7 @@ VOID CMy2015RemoteDlg::CreateSolidMenu() } SubMenu = m_MainMenu.GetSubMenu(4); if (!THIS_CFG.GetStr("settings", "Password").empty()) { - SubMenu->ModifyMenuA(ID_TOOL_REQUEST_AUTH, MF_STRING, ID_TOOL_REQUEST_AUTH, _T("序列号")); + SubMenu->ModifyMenuL(ID_TOOL_REQUEST_AUTH, MF_STRING, ID_TOOL_REQUEST_AUTH, _T("序列号")); } ::SetMenu(this->GetSafeHwnd(), m_MainMenu.GetSafeHmenu()); //为窗口设置菜单 @@ -652,7 +654,7 @@ VOID CMy2015RemoteDlg::CreateNotifyBar() m_Nid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; //托盘所拥有的状态 m_Nid.uCallbackMessage = UM_ICONNOTIFY; //回调消息 m_Nid.hIcon = m_hIcon; //icon 变量 - CString strTips ="禁界: 远程协助软件"; //气泡提示 + CString strTips = _TR("禁界: 远程协助软件"); //气泡提示 lstrcpyn(m_Nid.szTip, (LPCSTR)strTips, sizeof(m_Nid.szTip) / sizeof(m_Nid.szTip[0])); Shell_NotifyIcon(NIM_ADD, &m_Nid); //显示托盘 } @@ -679,19 +681,19 @@ VOID CMy2015RemoteDlg::CreateToolBar() Rect.right=RectMain.right-RectMain.left+10; m_ToolBar.MoveWindow(&Rect,TRUE); - m_ToolBar.SetButtonText(0,"终端管理"); //在位图的下面添加文件 - m_ToolBar.SetButtonText(1,"进程管理"); - m_ToolBar.SetButtonText(2,"窗口管理"); - m_ToolBar.SetButtonText(3,"桌面管理"); - m_ToolBar.SetButtonText(4,"文件管理"); - m_ToolBar.SetButtonText(5,"语音管理"); - m_ToolBar.SetButtonText(6,"视频管理"); - m_ToolBar.SetButtonText(7,"服务管理"); - m_ToolBar.SetButtonText(8,"注册表管理"); - m_ToolBar.SetButtonText(9, "键盘记录"); - m_ToolBar.SetButtonText(10,"参数设置"); - m_ToolBar.SetButtonText(11,"生成服务端"); - m_ToolBar.SetButtonText(12,"帮助"); + m_ToolBar.SetButtonText(0, _TR("终端管理")); //在位图的下面添加文件 + m_ToolBar.SetButtonText(1, _TR("进程管理")); + m_ToolBar.SetButtonText(2, _TR("窗口管理")); + m_ToolBar.SetButtonText(3, _TR("桌面管理")); + m_ToolBar.SetButtonText(4, _TR("文件管理")); + m_ToolBar.SetButtonText(5, _TR("语音管理")); + m_ToolBar.SetButtonText(6, _TR("视频管理")); + m_ToolBar.SetButtonText(7, _TR("服务管理")); + m_ToolBar.SetButtonText(8, _TR("注册表管理")); + m_ToolBar.SetButtonText(9, _TR("键盘记录")); + m_ToolBar.SetButtonText(10, _TR("参数设置")); + m_ToolBar.SetButtonText(11, _TR("生成服务端")); + m_ToolBar.SetButtonText(12, _TR("帮助")); RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0); //显示 } @@ -709,7 +711,7 @@ VOID CMy2015RemoteDlg::InitControl() auto style = LVS_EX_FULLROWSELECT | LVS_EX_GRIDLINES | LVS_EX_DOUBLEBUFFER | LVS_EX_HEADERDRAGDROP | LVS_EX_LABELTIP; m_CList_Online.SetConfigKey(_T("OnlineList")); for (int i = 0; idata); + ShowMessage(_TR("提示信息"), msg->data); if (msg->needFree) delete msg; return S_OK; } std::string pwd = THIS_CFG.GetStr("settings", "Password"); if (pwd.empty()) - ShowMessage("授权提醒", "程序可能有使用限制,请联系管理员请求授权"); + ShowMessage(_TR("授权提醒"), _TR("程序可能有使用限制,请联系管理员请求授权")); if (wParam && lParam) { uint32_t recvLow = (uint32_t)wParam; @@ -887,7 +889,7 @@ VOID CMy2015RemoteDlg::ShowMessage(CString strType, CString strMsg) { AUTO_TICK(200, ""); CTime Timer = CTime::GetCurrentTime(); - CString strTime= Timer.Format("%H:%M:%S"); + CString strTime= Timer.FormatL("%H:%M:%S"); m_CList_Message.InsertItem(0, strType); //向控件中设置数据 m_CList_Message.SetItemText(0,1,strTime); @@ -899,7 +901,7 @@ VOID CMy2015RemoteDlg::ShowMessage(CString strType, CString strMsg) int m_iCount = m_CList_Online.GetItemCount(); LeaveCriticalSection(&m_cs); - strStatusMsg.Format("有%d个主机在线",m_iCount); + strStatusMsg.FormatL("有%d个主机在线",m_iCount); if (m_StatusBar.GetSafeHwnd()) m_StatusBar.SetPaneText(0,strStatusMsg); //在状态条上显示文字 } @@ -910,11 +912,11 @@ LRESULT CMy2015RemoteDlg::OnShowErrMessage(WPARAM wParam, LPARAM lParam) CString* title = (CString*)lParam; CTime Timer = CTime::GetCurrentTime(); - CString strTime = Timer.Format("%H:%M:%S"); + CString strTime = Timer.FormatL("%H:%M:%S"); - m_CList_Message.InsertItem(0, title ? *title : "操作错误"); + m_CList_Message.InsertItem(0, title ? *title : _TR("操作错误")); m_CList_Message.SetItemText(0, 1, strTime); - m_CList_Message.SetItemText(0, 2, text ? *text : "内部错误"); + m_CList_Message.SetItemText(0, 2, text ? *text : _TR("内部错误")); if(title)delete title; if(text)delete text; @@ -1115,7 +1117,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() } while(0) AUTO_TICK(500, ""); - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); UPDATE_SPLASH(15, "正在注册主控信息..."); THIS_CFG.SetStr("settings", "MainWnd", std::to_string((uint64_t)GetSafeHwnd())); @@ -1126,7 +1128,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() UPDATE_SPLASH(16, "正在启动下载服务..."); m_FileServer = new FileDownloadServer(THIS_CFG.GetInt("settings", "FileSvrPort", 80)); if (!m_FileServer->Start()) { - THIS_APP->MessageBoxA("下载服务启动失败,可能是端口被占用了。", "提示"); + THIS_APP->MessageBox(_TR("下载服务启动失败,可能是端口被占用了。"), _TR("提示"), MB_ICONINFORMATION); } UPDATE_SPLASH(20, "正在初始化文件上传模块..."); @@ -1177,8 +1179,8 @@ BOOL CMy2015RemoteDlg::OnInitDialog() bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX); ASSERT(bNameValid); if (!strAboutMenu.IsEmpty()) { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } @@ -1275,7 +1277,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() SubMenu->CheckMenuItem(ID_HOOK_WIN, m_bHookWIN ? MF_CHECKED : MF_UNCHECKED); m_runNormal = THIS_CFG.GetInt("settings", "RunNormal", 0); SubMenu->CheckMenuItem(ID_RUNAS_SERVICE, !m_runNormal ? MF_CHECKED : MF_UNCHECKED); - std::map myMap = {{SOFTWARE_CAMERA, "摄像头"}, {SOFTWARE_TELEGRAM, "电报" }}; + std::map myMap = {{SOFTWARE_CAMERA, std::string(_TR("摄像头"))}, {SOFTWARE_TELEGRAM, std::string(_TR("电报")) }}; std::string str = myMap[n]; LVCOLUMN lvColumn; memset(&lvColumn, 0, sizeof(LVCOLUMN)); @@ -1284,7 +1286,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() m_CList_Online.SetColumn(ONLINELIST_VIDEO, &lvColumn); timeBeginPeriod(1); if (IsFunctionReallyHooked("user32.dll","SetTimer") || IsFunctionReallyHooked("user32.dll", "KillTimer")) { - THIS_APP->MessageBox("FUCK!!! 请勿HOOK此程序!", "提示", MB_ICONERROR); + THIS_APP->MessageBox(_TR("FUCK!!! 请勿HOOK此程序!"), _TR("提示"), MB_ICONERROR); ExitProcess(-1); return FALSE; } @@ -1415,7 +1417,7 @@ void CMy2015RemoteDlg::OnSysCommand(UINT nID, LPARAM lParam) CAboutDlg dlgAbout; dlgAbout.DoModal(); } else { - CDialogEx::OnSysCommand(nID, lParam); + __super::OnSysCommand(nID, lParam); } } @@ -1441,7 +1443,7 @@ void CMy2015RemoteDlg::OnPaint() // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { - CDialogEx::OnPaint(); + __super::OnPaint(); } } @@ -1454,7 +1456,7 @@ HCURSOR CMy2015RemoteDlg::OnQueryDragIcon() void CMy2015RemoteDlg::OnSize(UINT nType, int cx, int cy) { - CDialogEx::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: 在此处添加消息处理程序代码 if (SIZE_MINIMIZED==nType) { @@ -1573,7 +1575,7 @@ void CMy2015RemoteDlg::OnTimer(UINT_PTR nIDEvent) CheckHeartbeat(); } - CDialogEx::OnTimer(nIDEvent); + __super::OnTimer(nIDEvent); } void CMy2015RemoteDlg::CheckHeartbeat() { @@ -1730,7 +1732,7 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) CMenu Menu; Menu.LoadMenu(IDR_MENU_LIST_ONLINE); //加载菜单资源 资源和类对象关联 - + TranslateMenu(&Menu); CMenu* SubMenu = Menu.GetSubMenu(0); CPoint Point; @@ -1766,20 +1768,20 @@ void CMy2015RemoteDlg::OnNMRClickOnline(NMHDR *pNMHDR, LRESULT *pResult) // 创建一个新的子菜单 CMenu newMenu; if (!newMenu.CreatePopupMenu()) { - MessageBox(_T("创建执行代码的子菜单失败!"), "提示"); + MessageBoxL(_T("创建执行代码的子菜单失败!"), "提示", MB_ICONINFORMATION); return; } int i = 0; for (const auto& s : m_DllList) { // 向子菜单中添加菜单项 - newMenu.AppendMenuA(MF_STRING, ID_DYNAMIC_MENU_BASE + i++, s->Name.c_str()); + newMenu.AppendMenuL(MF_STRING, ID_DYNAMIC_MENU_BASE + i++, s->Name.c_str()); } if (i == 0) { - newMenu.AppendMenuA(MF_STRING, ID_DYNAMIC_MENU_BASE, "操作指导"); + newMenu.AppendMenuL(MF_STRING, ID_DYNAMIC_MENU_BASE, "操作指导"); } // 将子菜单添加到主菜单中 - SubMenu->AppendMenuA(MF_STRING | MF_POPUP, (UINT_PTR)newMenu.Detach(), _T("执行代码")); + SubMenu->AppendMenuL(MF_STRING | MF_POPUP, (UINT_PTR)newMenu.Detach(), _T("执行代码")); int iCount = SubMenu->GetMenuItemCount(); EnterCriticalSection(&m_cs); @@ -1820,10 +1822,10 @@ void CMy2015RemoteDlg::OnOnlineUpdate() } LeaveCriticalSection(&m_cs); if (n != 1 || !ContextObject) { - MessageBox(_T("请选择一个被控程序进行升级!"), _T("提示"), MB_ICONWARNING); + MessageBoxL(_T("请选择一个被控程序进行升级!"), _T("提示"), MB_ICONWARNING); return; } - if (IDYES != MessageBox(_T("确定升级选定的被控程序吗?\n需受控程序支持方可生效!"), + if (IDYES != MessageBoxL(_T("确定升级选定的被控程序吗?\n需受控程序支持方可生效!"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) return; PBYTE buffer = nullptr; @@ -1896,7 +1898,7 @@ std::string floatToString(float f) void CMy2015RemoteDlg::OnOnlineDelete() { // TODO: 在此添加命令处理程序代码 - if (IDYES != MessageBox(_T("确定删除选定的被控计算机吗?"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) + if (IDYES != MessageBoxL(_T("确定删除选定的被控计算机吗?"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) return; BYTE bToken = COMMAND_BYE; //向被控端发送一个COMMAND_SYSTEM @@ -1916,8 +1918,8 @@ void CMy2015RemoteDlg::OnOnlineDelete() tm >= 3600 ? floatToString(tm / 3600.f) + " h" : tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ctx->Destroy(); - strIP+="断开连接"; - ShowMessage("操作成功",strIP + "[" + aliveInfo.c_str() + "]"); + strIP += _L(_T("断开连接")); + ShowMessage(_TR("操作成功"), strIP + "[" + aliveInfo.c_str() + "]"); Mprintf("%s 断开链接 [%s]\n", strIP, aliveInfo.c_str()); } LeaveCriticalSection(&m_cs); @@ -1957,7 +1959,7 @@ BOOL CMy2015RemoteDlg::ShouldRemoteControl() { } LeaveCriticalSection(&m_cs); if (count == 1 && userName != "SYSTEM" && activeWnd.Find("Locked") == 0) { - if (IDYES != MessageBoxA("计算机已经被用户锁屏,程序无 SYSTEM 权限。\r\n可能无法进行远程桌面控制,是否继续?", "提示", MB_YESNO)) + if (IDYES != MessageBoxL("计算机已经被用户锁屏,程序无 SYSTEM 权限。\r\n可能无法进行远程桌面控制,是否继续?", "提示", MB_YESNO)) return FALSE; } return TRUE; @@ -2068,7 +2070,7 @@ bool CMy2015RemoteDlg::CheckValid(int trail) auto v = splitString(dlg.m_sPassword.GetBuffer(), '-'); if (v.size() != 6 && v.size() != 7) { THIS_CFG.SetStr(settings, pwdKey, ""); - THIS_APP->MessageBox("格式错误,请重新申请口令!", "提示", MB_ICONINFORMATION); + THIS_APP->MessageBox(_TR("格式错误,请重新申请口令!"), _TR("提示"), MB_ICONINFORMATION); return false; } std::vector subvector(v.end() - 4, v.end()); @@ -2081,7 +2083,7 @@ bool CMy2015RemoteDlg::CheckValid(int trail) THIS_CFG.SetStr(settings, "PwdHmac", ""); if (pwd.IsEmpty() || hash256 != fixedKey || IDOK != dlg.DoModal()) { if (!dlg.m_sPassword.IsEmpty()) - THIS_APP->MessageBox("口令错误, 无法继续操作!\r\n请通过工具菜单重新输入口令。", "提示", MB_ICONWARNING); + THIS_APP->MessageBox(_TR("口令错误, 无法继续操作!\r\n请通过工具菜单重新输入口令。"), _TR("提示"), MB_ICONWARNING); return false; } } @@ -2092,7 +2094,7 @@ bool CMy2015RemoteDlg::CheckValid(int trail) if (curDate < v[0] || curDate > v[1]) { THIS_CFG.SetStr(settings, pwdKey, ""); THIS_CFG.SetStr(settings, "PwdHmac", ""); - THIS_APP->MessageBox("口令过期,请重新申请口令!", "提示", MB_ICONINFORMATION); + THIS_APP->MessageBox(_TR("口令过期,请重新申请口令!"), _TR("提示"), MB_ICONINFORMATION); return false; } if (dlg.m_sPassword != pwd) @@ -2169,8 +2171,8 @@ VOID CMy2015RemoteDlg::SendAllCommand(PBYTE szBuffer, ULONG ulLength) //真彩Bar VOID CMy2015RemoteDlg::OnAbout() { - MessageBox("Copyleft (c) FTU 2019—2026" + CString("\n编译日期: ") + __DATE__ + - CString(sizeof(void*)==8 ? " (x64)" : " (x86)"), "关于"); + MessageBoxL("Copyleft (c) FTU 2019—2026" + _L("\n编译日期: ") + __DATE__ + + CString(sizeof(void*)==8 ? " (x64)" : " (x86)"), "关于", MB_ICONINFORMATION); } //托盘Menu @@ -2184,7 +2186,7 @@ void CMy2015RemoteDlg::OnNotifyShow() void CMy2015RemoteDlg::OnNotifyExit() { Release(); - CDialogEx::OnOK(); // 关闭对话框 + __super::OnOK(); // 关闭对话框 } @@ -2204,7 +2206,7 @@ void CMy2015RemoteDlg::OnMainSet() auto token_new = THIS_CFG.GetStr("frp", "token"); ApplyFrpSettings(); if (use_new != use) { - MessageBoxA("修改FRP代理开关,需要重启当前应用程序方可生效。", "提示", MB_ICONINFORMATION); + MessageBoxL("修改FRP代理开关,需要重启当前应用程序方可生效。", "提示", MB_ICONINFORMATION); } else if (port != port_new || token != token_new) { m_frpStatus = STATUS_STOP; Sleep(200); @@ -2212,7 +2214,7 @@ void CMy2015RemoteDlg::OnMainSet() } if (use && use_new && m_hFRPThread == NULL) { #ifdef _WIN64 - MessageBoxA("FRP代理服务异常,需要重启当前应用程序进行重试。", "提示", MB_ICONINFORMATION); + MessageBoxL("FRP代理服务异常,需要重启当前应用程序进行重试。", "提示", MB_ICONINFORMATION); #endif } int m = atoi(THIS_CFG.GetStr("settings", "ReportInterval", "5").c_str()); @@ -2236,7 +2238,7 @@ void CMy2015RemoteDlg::OnMainSet() void CMy2015RemoteDlg::OnMainExit() { Release(); - CDialogEx::OnOK(); // 关闭对话框 + __super::OnOK(); // 关闭对话框 } std::string exec(const std::string& cmd) @@ -2330,8 +2332,8 @@ BOOL CMy2015RemoteDlg::Activate(const std::string& nPort,int nMaxConnection, con if (!pids.empty()) { pids.back() = '?'; } - if (IDYES == THIS_APP->MessageBox("调用函数StartServer失败! 错误代码:" + CString(std::to_string(ret).c_str()) + - "\r\n是否关闭以下进程重试: " + pids.c_str(), "提示", MB_YESNO)) { + if (IDYES == THIS_APP->MessageBox(_L(_T("调用函数StartServer失败! 错误代码:")) + CString(std::to_string(ret).c_str()) + + _L(_T("\r\n是否关闭以下进程重试: ")) + pids.c_str(), _TR("提示"), MB_YESNO)) { for (const auto& line : lines) { auto cmd = std::string("taskkill /f /pid ") + line; exec(cmd.c_str()); @@ -2339,14 +2341,14 @@ BOOL CMy2015RemoteDlg::Activate(const std::string& nPort,int nMaxConnection, con return Activate(nPort, nMaxConnection, method); } } else - THIS_APP->MessageBox("调用函数StartServer失败! 错误代码:" + CString(std::to_string(ret).c_str())); + THIS_APP->MessageBox(_L(_T("调用函数StartServer失败! 错误代码:")) + CString(std::to_string(ret).c_str())); return FALSE; } - ShowMessage("使用提示", "严禁用于非法侵入、控制、监听他人设备等违法行为"); + ShowMessage(_TR("使用提示"), _TR("严禁用于非法侵入、控制、监听他人设备等违法行为")); CString strTemp; - strTemp.Format("监听端口: %s成功", nPort.c_str()); - ShowMessage("操作成功",strTemp); + strTemp.FormatL("监听端口: %s成功", nPort.c_str()); + ShowMessage(_TR("操作成功"),strTemp); return TRUE; } @@ -2836,17 +2838,17 @@ LRESULT CMy2015RemoteDlg::OnUserToOnlineList(WPARAM wParam, LPARAM lParam) //CPU if (LoginInfor->dwCPUMHz != -1) { - strCPU.Format("%dMHz", LoginInfor->dwCPUMHz); + strCPU.FormatL("%dMHz", LoginInfor->dwCPUMHz); } else { strCPU = "Unknown"; } //网速 - strPing.Format("%d", LoginInfor->dwSpeed); + strPing.FormatL("%d", LoginInfor->dwSpeed); - strVideo = m_settings.DetectSoftware ? "无" : LoginInfor->bWebCamIsExist ? "有" : "无"; + strVideo = m_settings.DetectSoftware ? _TR("无") : LoginInfor->bWebCamIsExist ? _TR("有") : _TR("无"); - strAddr.Format("%d", ContextObject->GetPort()); + strAddr.FormatL("%d", ContextObject->GetPort()); auto v = LoginInfor->ParseReserved(RES_MAX); AddList(strIP,strAddr,strPCName,strOS,strCPU,strVideo,strPing,LoginInfor->moduleVersion,LoginInfor->szStartTime, v, ContextObject); delete LoginInfor; @@ -2872,7 +2874,7 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) } CString port; - port.Format("%d", lParam); + port.FormatL("%d", lParam); EnterCriticalSection(&m_cs); int n = m_CList_Online.GetItemCount(); for (int i = 0; i < n; ++i) { @@ -2890,7 +2892,7 @@ LRESULT CMy2015RemoteDlg::OnUserOfflineMsg(WPARAM wParam, LPARAM lParam) std::string aliveInfo = tm >= 86400 ? floatToString(tm / 86400.f) + " d" : tm >= 3600 ? floatToString(tm / 3600.f) + " h" : tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; - ShowMessage("操作成功", ip + "主机下线[" + aliveInfo.c_str() + "]"); + ShowMessage(_TR("操作成功"), ip + _TR("主机下线") + "[" + aliveInfo.c_str() + "]"); Mprintf("%s 主机下线 [%s]\n", ip, aliveInfo.c_str()); } LeaveCriticalSection(&m_cs); @@ -2931,8 +2933,8 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) if (authorized) { Mprintf("%s HMAC 校验成功: %llu\n", hb.Passcode, hb.PwdHmac); m_ClientMap->SetClientMapInteger(host->GetClientID(), MAP_AUTH, TRUE); - std::string tip = std::string(hb.Passcode) + " 授权成功: "; - tip += std::to_string(hb.PwdHmac) + "[" + std::string(ctx->GetClientData(ONLINELIST_IP)) + "]"; + std::string tip = std::string(hb.Passcode) + std::string(_L("授权成功")); + tip += ": " + std::to_string(hb.PwdHmac) + "[" + std::string(ctx->GetClientData(ONLINELIST_IP)) + "]"; CharMsg* msg = new CharMsg(tip.c_str()); PostMessageA(WM_SHOWMESSAGE, (WPARAM)msg, NULL); } @@ -2951,7 +2953,7 @@ void CMy2015RemoteDlg::UpdateActiveWindow(CONTEXT_OBJECT* ctx) m_CList_Online.SetItemText(i, ONLINELIST_LOGINTIME, hb.ActiveWnd); if (hb.Ping > 0) m_CList_Online.SetItemText(i, ONLINELIST_PING, std::to_string(hb.Ping).c_str()); - m_CList_Online.SetItemText(i, ONLINELIST_VIDEO, hb.HasSoftware ? "有" : "无"); + m_CList_Online.SetItemText(i, ONLINELIST_VIDEO, hb.HasSoftware ? _TR("有") : _TR("无")); id->SetLastHeartbeat(time(0)); return; } @@ -3154,19 +3156,19 @@ BOOL CMy2015RemoteDlg::PreTranslateMessage(MSG* pMsg) } } - return CDialogEx::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } LRESULT CMy2015RemoteDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // WM_COMMAND 不计时 if (message == WM_COMMAND) { - return CDialogEx::WindowProc(message, wParam, lParam); + return __super::WindowProc(message, wParam, lParam); } auto start = std::chrono::steady_clock::now(); - LRESULT result = CDialogEx::WindowProc(message, wParam, lParam); + LRESULT result = __super::WindowProc(message, wParam, lParam); auto ms = std::chrono::duration_cast( std::chrono::steady_clock::now() - start).count(); @@ -3189,7 +3191,7 @@ void CMy2015RemoteDlg::OnOnlineShare() if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty()) return; if (dlg.m_str.GetLength() >= 250) { - MessageBox("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION); + MessageBoxL("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION); return; } CharMsg* buf = new CharMsg(dlg.m_str.GetLength()+1); @@ -3253,7 +3255,7 @@ void CMy2015RemoteDlg::OnOnlineHostnote() return; } if (dlg.m_str.GetLength() >= 64) { - MessageBox("备注信息长度不能超过64个字符", "提示", MB_ICONINFORMATION); + MessageBoxL("备注信息长度不能超过64个字符", "提示", MB_ICONINFORMATION); dlg.m_str = dlg.m_str.Left(63); } BOOL modified = FALSE; @@ -3446,7 +3448,7 @@ void run_upx_async(HWND hwnd, const std::string& upx, const std::string& file, b LRESULT CMy2015RemoteDlg::UPXProcResult(WPARAM wParam, LPARAM lParam) { int exitCode = static_cast(wParam); - ShowMessage(exitCode == 0 ? "操作成功":"操作失败", "UPX 处理完成"); + ShowMessage(exitCode == 0 ? _TR("操作成功"):_TR("操作失败"), _TR("UPX 处理完成")); return S_OK; } @@ -3457,33 +3459,33 @@ void CMy2015RemoteDlg::OnToolGenMaster() // 主控程序公网IP std::string master = THIS_CFG.GetStr("settings", "master", ""); if (master.empty()) { - MessageBox("请通过菜单设置当前主控程序的公网地址(域名)! 此地址会写入即将生成的主控程序中。" + MessageBoxL("请通过菜单设置当前主控程序的公网地址(域名)! 此地址会写入即将生成的主控程序中。" "\n只有正确设置公网地址,才能在线延长由本程序所生成的主控程序的有效期。", "提示", MB_ICONINFORMATION); } std::string masterHash(GetMasterHash()); if (m_superPass.empty()) { CInputDialog pass(this); - pass.Init("主控生成", "当前主控程序的密码:"); + pass.Init(_TR("主控生成"), _TR("当前主控程序的密码:")); pass.m_str = m_superPass.c_str(); if (pass.DoModal() != IDOK || pass.m_str.IsEmpty()) return; if (hashSHA256(pass.m_str.GetBuffer()) != masterHash) { - MessageBox("密码不正确,无法生成主控程序!", "错误", MB_ICONWARNING); + MessageBoxL("密码不正确,无法生成主控程序!", "错误", MB_ICONWARNING); return; } m_superPass = pass.m_str.GetString(); } CInputDialog dlg(this); - dlg.Init("主控密码", "新的主控程序的密码:"); + dlg.Init(_TR("主控密码"), _TR("新的主控程序的密码:")); if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty()) return; if (dlg.m_str.GetLength() > 15) { - MessageBox("密码长度不能大于15。", "错误", MB_ICONWARNING); + MessageBoxL("密码长度不能大于15。", "错误", MB_ICONWARNING); return; } CInputDialog days(this); - days.Init("使用天数", "新主控程序使用天数:"); + days.Init(_TR("使用天数"), _TR("新主控程序使用天数:")); if (days.DoModal() != IDOK || days.m_str.IsEmpty()) return; size_t size = 0; @@ -3494,7 +3496,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() } char* curEXE = ReadFileToBuffer(path, size); if (curEXE == nullptr) { - MessageBox("读取文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); + MessageBoxL("读取文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); return; } std::string pwdHash = hashSHA256(dlg.m_str.GetString()); @@ -3504,7 +3506,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() SAFE_DELETE_ARRAY(curEXE); std::string tmp; if (!UPXUncompressFile(upx, tmp) || nullptr == (curEXE = ReadFileToBuffer(tmp.c_str(), size))) { - MessageBox("操作文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); + MessageBoxL("操作文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); if (!upx.empty()) DeleteFile(upx.c_str()); if (!tmp.empty()) DeleteFile(tmp.c_str()); return; @@ -3513,7 +3515,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() iOffset = MemoryFind(curEXE, masterHash.c_str(), size, masterHash.length()); if (iOffset == -1) { SAFE_DELETE_ARRAY(curEXE); - MessageBox("操作文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); + MessageBoxL("操作文件失败! 请稍后再次尝试。", "错误", MB_ICONWARNING); return; } } @@ -3521,14 +3523,14 @@ void CMy2015RemoteDlg::OnToolGenMaster() std::string id = genHMAC(pwdHash, m_superPass); Validation verify(atof(days.m_str), master.c_str(), port<=0 ? 6543 : port, id.c_str()); if (!WritePwdHash(curEXE + iOffset, pwdHash, verify)) { - MessageBox("写入哈希失败! 无法生成主控。", "错误", MB_ICONWARNING); + MessageBoxL("写入哈希失败! 无法生成主控。", "错误", MB_ICONWARNING); SAFE_DELETE_ARRAY(curEXE); return; } CComPtr spDesktop; HRESULT hr = SHGetDesktopFolder(&spDesktop); if (FAILED(hr)) { - MessageBox("Explorer 未正确初始化! 请稍后再试。", "提示"); + MessageBoxL("Explorer 未正确初始化! 请稍后再试。", "提示", MB_ICONINFORMATION); SAFE_DELETE_ARRAY(curEXE); return; } @@ -3539,7 +3541,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() try { ret = fileDlg.DoModal(); } catch (...) { - MessageBox("文件对话框未成功打开! 请稍后再试。", "提示"); + MessageBoxL("文件对话框未成功打开! 请稍后再试。", "提示", MB_ICONINFORMATION); SAFE_DELETE_ARRAY(curEXE); return; } @@ -3548,7 +3550,7 @@ void CMy2015RemoteDlg::OnToolGenMaster() CFile File; BOOL r = File.Open(name, CFile::typeBinary | CFile::modeCreate | CFile::modeWrite); if (!r) { - MessageBox("主控程序创建失败!\r\n" + name, "提示", MB_ICONWARNING); + MessageBoxL("主控程序创建失败!\r\n" + name, "提示", MB_ICONWARNING); SAFE_DELETE_ARRAY(curEXE); return; } @@ -3557,10 +3559,10 @@ void CMy2015RemoteDlg::OnToolGenMaster() if (!upx.empty()) { #ifndef _DEBUG // DEBUG 模式用UPX压缩的程序可能无法正常运行 run_upx_async(GetSafeHwnd(), upx, name.GetString(), true); - MessageBox("正在UPX压缩,请关注信息提示。\r\n文件位于: " + name, "提示", MB_ICONINFORMATION); + MessageBoxL("正在UPX压缩,请关注信息提示。\r\n文件位于: " + name, "提示", MB_ICONINFORMATION); #endif } else - MessageBox("生成成功! 文件位于:\r\n" + name, "提示", MB_ICONINFORMATION); + MessageBoxL("生成成功! 文件位于:\r\n" + name, "提示", MB_ICONINFORMATION); } SAFE_DELETE_ARRAY(curEXE); } @@ -3572,7 +3574,7 @@ void CMy2015RemoteDlg::OnHelpImportant() "本软件以“现状”提供,不附带任何保证。使用本软件的风险由用户自行承担。" "我们不对任何因使用本软件而引发的非法或恶意用途负责。用户应遵守相关法律" "法规,并负责任地使用本软件。开发者对任何因使用本软件产生的损害不承担责任。"; - MessageBox(msg, "免责声明", MB_ICONINFORMATION); + MessageBoxL(msg, "免责声明", MB_ICONINFORMATION); } @@ -3585,7 +3587,7 @@ void CMy2015RemoteDlg::OnHelpFeedback() void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID) { if (m_DllList.size() == 0) { - MessageBoxA("请将64位的DLL放于主控程序的 'Plugins' 目录,再来点击此项菜单。" + MessageBoxL("请将64位的DLL放于主控程序的 'Plugins' 目录,再来点击此项菜单。" "\n执行未经测试的代码可能造成程序崩溃。", "提示", MB_ICONINFORMATION); char path[_MAX_PATH]; GetModuleFileNameA(NULL, path, _MAX_PATH); @@ -3649,20 +3651,20 @@ void CMy2015RemoteDlg::OnOnlineAuthorize() { if (m_superPass.empty()) { CInputDialog pass(this); - pass.Init("需要密码", "当前主控程序的密码:"); + pass.Init(_TR("需要密码"), _TR("当前主控程序的密码:")); if (pass.DoModal() != IDOK || pass.m_str.IsEmpty()) return; std::string masterHash(GetMasterHash()); if (hashSHA256(pass.m_str.GetBuffer()) != masterHash) { - MessageBox("密码不正确!", "错误", MB_ICONWARNING); + MessageBoxL("密码不正确!", "错误", MB_ICONWARNING); return; } m_superPass = pass.m_str; } CInputDialog dlg(this); - dlg.Init("延长授权", "主控程序授权天数:"); - dlg.Init2("并发上线机器数量:", std::to_string(100).c_str()); + dlg.Init(_TR("延长授权"), _TR("主控程序授权天数:")); + dlg.Init2(_TR("并发上线机器数量:"), std::to_string(100).c_str()); if (dlg.DoModal() != IDOK || atoi(dlg.m_str) <= 0) return; BYTE bToken[32] = { CMD_AUTHORIZATION }; @@ -3682,9 +3684,9 @@ CString FormatValue(double dValue, LPCTSTR szUnit) { CString str; if (dValue == (int)dValue) - str.Format(_T("%d%s"), (int)dValue, szUnit); + str.FormatL(_T("%d%s"), (int)dValue, szUnit); else - str.Format(_T("%.1f%s"), dValue, szUnit); + str.FormatL(_T("%.1f%s"), dValue, szUnit); return str; } @@ -3729,13 +3731,13 @@ void CMy2015RemoteDlg::OnListClick(NMHDR* pNMHDR, LRESULT* pResult) }; CString processInfo; if (!res[RES_PID].IsEmpty() || !res[RES_FILESIZE].IsEmpty()) { - processInfo.Format("\r\n进程 PID: %s %s", res[RES_PID].IsEmpty() ? "" : res[RES_PID], res[RES_FILESIZE].IsEmpty() ? "" : res[RES_FILESIZE]); + processInfo.FormatL("\r\n进程 PID: %s %s", res[RES_PID].IsEmpty() ? "" : res[RES_PID], res[RES_FILESIZE].IsEmpty() ? "" : res[RES_FILESIZE]); } // 拼接内容 CString strText; std::string expired = res[RES_EXPIRED_DATE]; expired = expired.empty() ? "" : " Expired on " + expired; - strText.Format(_T("文件路径: %s%s %s%s\r\n系统信息: %s 位 %s 核心 %s GB %s\r\n启动信息: %s %s %s%s %s\r\n上线信息: %s %d %s\r\n客户信息: %s"), + strText.FormatL(_T("文件路径: %s%s %s%s\r\n系统信息: %s 位 %s 核心 %s GB %s\r\n启动信息: %s %s %s%s %s\r\n上线信息: %s %d %s\r\n客户信息: %s"), res[RES_PROGRAM_BITS].IsEmpty() ? "" : res[RES_PROGRAM_BITS] + " 位 ", res[RES_FILE_PATH], res[RES_EXE_VERSION], processInfo, res[RES_SYSTEM_BITS], res[RES_SYSTEM_CPU], res[RES_SYSTEM_MEM], res[RES_RESOLUTION], startTime, expired.c_str(), res[RES_USERNAME], res[RES_ISADMIN] == "1" ? "[管理员]" : res[RES_ISADMIN].IsEmpty() ? "" : "[非管理员]", GetElapsedTime(startTime), @@ -3780,12 +3782,12 @@ void CMy2015RemoteDlg::OnOnlineUnauthorize() { if (m_superPass.empty()) { CInputDialog pass(this); - pass.Init("需要密码", "当前主控程序的密码:"); + pass.Init(_TR("需要密码"), _TR("当前主控程序的密码:")); if (pass.DoModal() != IDOK || pass.m_str.IsEmpty()) return; std::string masterHash(GetMasterHash()); if (hashSHA256(pass.m_str.GetBuffer()) != masterHash) { - MessageBox("密码不正确!", "错误", MB_ICONWARNING); + MessageBoxL("密码不正确!", "错误", MB_ICONWARNING); return; } m_superPass = pass.m_str; @@ -3809,14 +3811,14 @@ void CMy2015RemoteDlg::OnToolRequestAuth() { std::string pwd = THIS_CFG.GetStr("settings", "Password"); BOOL noPwd = pwd.empty(); - if (noPwd && IDYES != MessageBoxA("本软件仅限于合法、正当、合规的用途。\r\n您是否同意?", + if (noPwd && IDYES != MessageBoxL("本软件仅限于合法、正当、合规的用途。\r\n您是否同意?", "声明", MB_ICONQUESTION | MB_YESNO)) return; CInputDialog dlg(this); dlg.m_str = getDeviceID(GetHardwareID()).c_str(); - dlg.Init(noPwd ? "请求授权" : "序列号", "序列号(唯一ID):"); + dlg.Init(noPwd ? _TR("请求授权") : _TR("序列号"), _TR("序列号(唯一ID):")); if (!noPwd) - dlg.Init2("授权口令:", pwd.c_str()); + dlg.Init2(_TR("授权口令:"), pwd.c_str()); if (IDOK == dlg.DoModal() && noPwd) { CString url = _T("https://github.com/yuanyuanxiang/SimpleRemoter/wiki#请求授权"); ShellExecute(NULL, _T("open"), url, NULL, NULL, SW_SHOWNORMAL); @@ -3830,8 +3832,8 @@ void CMy2015RemoteDlg::OnToolInputPassword() CString pwd = THIS_CFG.GetStr("settings", "Password", "").c_str(); auto v = splitString(pwd.GetBuffer(), '-'); CString info; - info.Format("软件有效期限: %s — %s, 并发连接数量: %d.", v[0].c_str(), v[1].c_str(), atoi(v[2].c_str())); - if (IDYES == MessageBoxA(info + "\n如需修改授权信息,请联系管理员。是否现在修改授权?", "提示", MB_YESNO | MB_ICONINFORMATION)) { + info.FormatL("软件有效期限: %s — %s, 并发连接数量: %d.", v[0].c_str(), v[1].c_str(), atoi(v[2].c_str())); + if (IDYES == MessageBoxL(info + "\n如需修改授权信息,请联系管理员。是否现在修改授权?", "提示", MB_YESNO | MB_ICONINFORMATION)) { CPasswordDlg dlg(this); std::string hardwareID = GetHardwareID(); std::string hashedID = hashSHA256(hardwareID); @@ -3887,7 +3889,7 @@ void shellcode_process(ObfsBase *obfs, bool load = false, const char* suffix = " try { ret = fileDlg.DoModal(); } catch (...) { - AfxMessageBox("文件对话框未成功打开! 请稍后再试。", MB_ICONWARNING); + AfxMessageBoxL("文件对话框未成功打开! 请稍后再试。", MB_ICONWARNING); return; } if (ret == IDOK) { @@ -3895,7 +3897,7 @@ void shellcode_process(ObfsBase *obfs, bool load = false, const char* suffix = " CFile File; BOOL r = File.Open(name, CFile::typeBinary | CFile::modeRead); if (!r) { - AfxMessageBox("文件打开失败! 请稍后再试。\r\n" + name, MB_ICONWARNING); + AfxMessageBoxL("文件打开失败! 请稍后再试。\r\n" + name, MB_ICONWARNING); return; } int dwFileSize = File.GetLength(); @@ -3914,9 +3916,9 @@ void shellcode_process(ObfsBase *obfs, bool load = false, const char* suffix = " if (exec) { memcpy(exec, szBuffer, dwFileSize); if (safe_exec(exec)) { - AfxMessageBox("Shellcode 执行成功! ", MB_ICONINFORMATION); + AfxMessageBoxL("Shellcode 执行成功! ", MB_ICONINFORMATION); } else { - AfxMessageBox("Shellcode 执行失败! 请用本程序生成的 bin 文件进行测试! ", MB_ICONERROR); + AfxMessageBoxL("Shellcode 执行失败! 请用本程序生成的 bin 文件进行测试! ", MB_ICONERROR); } } } else if (MakeShellcode(srcData, srcLen, (LPBYTE)szBuffer, dwFileSize, true)) { @@ -3926,7 +3928,7 @@ void shellcode_process(ObfsBase *obfs, bool load = false, const char* suffix = " const uint32_t key = 0xDEADBEEF; obfs->ObfuscateBuffer(srcData, srcLen, key); if (obfs->WriteFile(CString(buffer) + suffix, srcData, srcLen, "Shellcode")) { - AfxMessageBox("Shellcode 生成成功! 请自行编写调用程序。\r\n" + CString(buffer) + suffix, + AfxMessageBoxL("Shellcode 生成成功! 请自行编写调用程序。\r\n" + CString(buffer) + suffix, MB_ICONINFORMATION); } } @@ -3969,7 +3971,7 @@ void CMy2015RemoteDlg::OnObfsShellcodeBin() void CMy2015RemoteDlg::OnShellcodeLoadTest() { - if (MessageBox(CString("是否测试 ") + (sizeof(void*) == 8 ? "64位" : "32位") + " Shellcode 二进制文件? " + if (MessageBoxL(CString("是否测试 ") + (sizeof(void*) == 8 ? "64位" : "32位") + " Shellcode 二进制文件? " "请选择受信任的 bin 文件。\r\n测试未知来源的 Shellcode 可能导致程序崩溃,甚至存在 CC 风险。", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { ObfsBase obfs; @@ -3980,7 +3982,7 @@ void CMy2015RemoteDlg::OnShellcodeLoadTest() void CMy2015RemoteDlg::OnShellcodeObfsLoadTest() { - if (MessageBox(CString("是否测试 ") + (sizeof(void*) == 8 ? "64位" : "32位") + " Shellcode 二进制文件? " + if (MessageBoxL(CString("是否测试 ") + (sizeof(void*) == 8 ? "64位" : "32位") + " Shellcode 二进制文件? " "请选择受信任的 bin 文件。\r\n测试未知来源的 Shellcode 可能导致程序崩溃,甚至存在 CC 风险。", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { Obfs obfs; @@ -3998,7 +4000,7 @@ void CMy2015RemoteDlg::OnShellcodeAesBin() void CMy2015RemoteDlg::OnShellcodeTestAesBin() { - if (MessageBox(CString("是否测试 ") + (sizeof(void*) == 8 ? "64位" : "32位") + " Shellcode 二进制文件? " + if (MessageBoxL(CString("是否测试 ") + (sizeof(void*) == 8 ? "64位" : "32位") + " Shellcode 二进制文件? " "请选择受信任的 bin 文件。\r\n测试未知来源的 Shellcode 可能导致程序崩溃,甚至存在 CC 风险。", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { ObfsAes obfs; @@ -4014,11 +4016,11 @@ void CMy2015RemoteDlg::OnOnlineAssignTo() if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty() || atof(dlg.m_sSecondInput.GetString())<=0) return; if (dlg.m_str.GetLength() >= 250) { - MessageBox("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION); + MessageBoxL("字符串长度超出[0, 250]范围限制!", "提示", MB_ICONINFORMATION); return; } if (dlg.m_sSecondInput.GetLength() >= 6) { - MessageBox("超出使用时间可输入的字符数限制!", "提示", MB_ICONINFORMATION); + MessageBoxL("超出使用时间可输入的字符数限制!", "提示", MB_ICONINFORMATION); return; } CharMsg* buf1 = new CharMsg(dlg.m_str.GetLength() + 1); @@ -4118,7 +4120,7 @@ void CMy2015RemoteDlg::OnNMCustomdrawOnline(NMHDR* pNMHDR, LRESULT* pResult) void CMy2015RemoteDlg::OnOnlineRunAsAdmin() { - if (MessageBoxA("确定要以管理员权限重新启动目标应用程序吗?\n此操作可能触发 UAC 账户控制。", + if (MessageBoxL("确定要以管理员权限重新启动目标应用程序吗?\n此操作可能触发 UAC 账户控制。", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { EnterCriticalSection(&m_cs); POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); @@ -4140,7 +4142,7 @@ void CMy2015RemoteDlg::OnMainWallet() if (dlg.DoModal() != IDOK || CString(m_settings.WalletAddress) == dlg.m_str) return; if (dlg.m_str.GetLength() > 470) { - MessageBox("超出钱包地址可输入的字符数限制!", "提示", MB_ICONINFORMATION); + MessageBoxL("超出钱包地址可输入的字符数限制!", "提示", MB_ICONINFORMATION); return; } strcpy(m_settings.WalletAddress, dlg.m_str); @@ -4158,7 +4160,7 @@ void CMy2015RemoteDlg::OnToolRcedit() void CMy2015RemoteDlg::OnOnlineUninstall() { - if (IDYES != MessageBox(_T("确定卸载选定的被控程序吗?"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) + if (IDYES != MessageBoxL(_T("确定卸载选定的被控程序吗?"), _T("提示"), MB_ICONQUESTION | MB_YESNO)) return; BYTE bToken = TOKEN_UNINSTALL; @@ -4178,8 +4180,8 @@ void CMy2015RemoteDlg::OnOnlineUninstall() tm >= 3600 ? floatToString(tm / 3600.f) + " h" : tm >= 60 ? floatToString(tm / 60.f) + " m" : floatToString(tm) + " s"; ctx->Destroy(); - strIP += "断开连接"; - ShowMessage("操作成功", strIP + "[" + aliveInfo.c_str() + "]"); + strIP += _TR("断开连接"); + ShowMessage(_TR("操作成功"), strIP + "[" + aliveInfo.c_str() + "]"); } LeaveCriticalSection(&m_cs); } @@ -4221,7 +4223,7 @@ void CMy2015RemoteDlg::LoadListData(const std::string& group) } } CString strStatusMsg; - strStatusMsg.Format("有%d个主机在线", iCount); + strStatusMsg.FormatL("有%d个主机在线", iCount); m_StatusBar.SetPaneText(0, strStatusMsg); } @@ -4250,12 +4252,12 @@ void CMy2015RemoteDlg::OnSelchangeGroupTab(NMHDR* pNMHDR, LRESULT* pResult) void CMy2015RemoteDlg::OnOnlineRegroup() { CInputDialog dlg(this); - dlg.Init("修改分组", "请输入分组名称:"); + dlg.Init(_TR("修改分组"), _TR("请输入分组名称:")); if (IDOK != dlg.DoModal()||dlg.m_str.IsEmpty()) { return; } if (dlg.m_str.GetLength() >= 24) { - MessageBoxA("分组名称长度不得超过24个字符!", "提示", MB_ICONINFORMATION); + MessageBoxL("分组名称长度不得超过24个字符!", "提示", MB_ICONINFORMATION); return; } BYTE cmd[50] = { CMD_SET_GROUP }; @@ -4266,7 +4268,7 @@ void CMy2015RemoteDlg::OnOnlineRegroup() void CMy2015RemoteDlg::MachineManage(MachineCommand type) { - if (MessageBoxA("此操作需客户端具有管理员权限,确定继续吗? ", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { + if (MessageBoxL("此操作需客户端具有管理员权限,确定继续吗? ", "提示", MB_ICONQUESTION | MB_YESNO) == IDYES) { EnterCriticalSection(&m_cs); POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition(); while (Pos) { @@ -4300,10 +4302,10 @@ void CMy2015RemoteDlg::OnMachineReboot() void CMy2015RemoteDlg::OnExecuteDownload() { CInputDialog dlg(this); - dlg.Init("下载执行", "远程下载地址:"); + dlg.Init(_TR("下载执行"), _TR("远程下载地址:")); auto ip = THIS_CFG.GetStr("settings", "master", "127.0.0.1"); dlg.m_str = BuildPayloadUrl(ip.c_str(), "example.exe"); - dlg.m_sTipInfo = "请将EXE放在\"Payloads\"目录或输入下载地址。"; + dlg.m_sTipInfo = _TR("请将EXE放在\"Payloads\"目录或输入下载地址。"); if (dlg.DoModal() != IDOK || dlg.m_str.IsEmpty()) return; @@ -4326,7 +4328,7 @@ void CMy2015RemoteDlg::OnExecuteDownload() void CMy2015RemoteDlg::OnExecuteUpload() { CFileDialog dlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_FILEMUSTEXIST, - _T("可执行文件 (*.exe)|*.exe||"), this); + _TR("可执行文件 (*.exe)|*.exe||"), this); if (dlg.DoModal() != IDOK) return; @@ -4335,13 +4337,13 @@ void CMy2015RemoteDlg::OnExecuteUpload() CFile file; if (!file.Open(strFilePath, CFile::modeRead | CFile::typeBinary)) { - MessageBox("无法读取文件!\r\n" + strFilePath, "错误", MB_ICONERROR); + MessageBoxL("无法读取文件!\r\n" + strFilePath, "错误", MB_ICONERROR); return; } DWORD dwFileSize = (DWORD)file.GetLength(); if (dwFileSize == 0 || dwFileSize > 12 * 1024 * 1024) { - MessageBox("文件为空或超过12MB,无法使用此功能!", "提示", MB_ICONWARNING); + MessageBoxL("文件为空或超过12MB,无法使用此功能!", "提示", MB_ICONWARNING); file.Close(); return; } @@ -4371,7 +4373,7 @@ void CMy2015RemoteDlg::OnDestroy() UnhookWindowsHookEx(g_hKeyboardHook); g_hKeyboardHook = NULL; } - CDialogEx::OnDestroy(); + __super::OnDestroy(); } CString GetClipboardText() @@ -4648,7 +4650,7 @@ LRESULT CMy2015RemoteDlg::OnSessionActivatedMsg(WPARAM wParam, LPARAM lParam) void CMy2015RemoteDlg::OnToolReloadPlugins() { - if (IDYES!=MessageBoxA("请将64位的DLL放于主控程序的 'Plugins' 目录,是否继续?" + if (IDYES!=MessageBoxL("请将64位的DLL放于主控程序的 'Plugins' 目录,是否继续?" "\n执行未经测试的代码可能造成程序崩溃。", "提示", MB_ICONINFORMATION | MB_YESNO)) return; char path[_MAX_PATH]; @@ -4685,7 +4687,7 @@ void CMy2015RemoteDlg::InjectTinyRunDll(const std::string& ip, int pid) { auto ctx = FindHostByIP(ip); if (ctx == NULL) { - MessageBoxA(CString("没有找到在线主机: ") + ip.c_str(), "提示", MB_ICONINFORMATION); + MessageBoxL(_L("没有找到在线主机: ") + ip.c_str(), "提示", MB_ICONINFORMATION); return; } @@ -4704,7 +4706,7 @@ LRESULT CMy2015RemoteDlg::AntiBlackScreen(WPARAM wParam, LPARAM lParam) auto ctx = FindHostByIP(ip); delete ip; if (ctx == NULL) { - MessageBoxA(CString("没有找到在线主机: ") + host.c_str(), "提示", MB_ICONINFORMATION); + MessageBoxL(_L("没有找到在线主机: ") + host.c_str(), "提示", MB_ICONINFORMATION); return S_FALSE; } bool is32Bit = arch == "x86"; @@ -4715,7 +4717,7 @@ LRESULT CMy2015RemoteDlg::AntiBlackScreen(WPARAM wParam, LPARAM lParam) ctx->Send2Client(buf->Buf(), 1 + sizeof(DllExecuteInfo)); SAFE_DELETE(antiBlackScreen); } else - MessageBoxA(CString("没有反黑屏插件: ") + path.c_str(), "提示", MB_ICONINFORMATION); + MessageBoxL(_L("没有反黑屏插件: ") + path.c_str(), "提示", MB_ICONINFORMATION); return S_OK; } @@ -4833,11 +4835,11 @@ void CMy2015RemoteDlg::OnProxyPort() std::string pwd = THIS_CFG.GetStr("frp", "token", ""); std::string ip = THIS_CFG.GetStr("settings", "master", ""); if (!useFrp || pwd.empty() || ip.empty()) { - MessageBoxA("需要正确启用FRP反向代理方可使用此功能!", "提示", MB_ICONINFORMATION); + MessageBoxL("需要正确启用FRP反向代理方可使用此功能!", "提示", MB_ICONINFORMATION); return; } CInputDialog dlg(this); - dlg.Init("代理端口", "请输入客户端端口:"); + dlg.Init(_TR("代理端口"), _TR("请输入客户端端口:")); if (IDOK != dlg.DoModal() || atoi(dlg.m_str) <= 0 || atoi(dlg.m_str) >= 65536) { return; } @@ -4865,15 +4867,15 @@ void CMy2015RemoteDlg::OnProxyPort() ctx->Send2Client(cmd, 1 + sizeof(DllExecuteInfoNew)); sent = TRUE; } else { - PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg("版本不支持"), - (LPARAM)new CharMsg("客户端版本最低要求: " + CString("Dec 22 2025"))); + PostMessageA(WM_SHOWNOTIFY, (WPARAM)new CharMsg(_L("版本不支持")), + (LPARAM)new CharMsg(_L("客户端版本最低要求: ") + CString("Dec 22 2025"))); } break; } LeaveCriticalSection(&m_cs); SAFE_DELETE(frpc); if (sent) - MessageBoxA(CString("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + "访问代理端口!", + MessageBoxL(_L("请通过") + ip.c_str() + ":" + std::to_string(localPort).c_str() + _L("访问代理端口!"), "提示", MB_ICONINFORMATION); } @@ -4881,7 +4883,7 @@ void CMy2015RemoteDlg::OnProxyPort() void CMy2015RemoteDlg::OnHookWin() { m_bHookWIN = !m_bHookWIN; - MessageBoxA(CString("远程控制时,") + (m_bHookWIN ? "" : "不") + CString("转发系统热键到远程桌面。"), + MessageBoxL(_L("远程控制时,") + (m_bHookWIN ? "" : "不") + _L("转发系统热键到远程桌面。"), "提示", MB_ICONINFORMATION); THIS_CFG.SetInt("settings", "HookWIN", m_bHookWIN); CMenu* SubMenu = m_MainMenu.GetSubMenu(2); @@ -4892,8 +4894,8 @@ void CMy2015RemoteDlg::OnHookWin() void CMy2015RemoteDlg::OnRunasService() { m_runNormal = !m_runNormal; - MessageBoxA(m_runNormal ? CString("以传统方式启动主控程序,没有守护进程。") : - CString("以“服务+代理”形式启动主控程序,会开机自启及被守护。"), + MessageBoxL(m_runNormal ? _L("以传统方式启动主控程序,没有守护进程。") : + _L("以“服务+代理”形式启动主控程序,会开机自启及被守护。"), "提示", MB_ICONINFORMATION); THIS_CFG.SetInt("settings", "RunNormal", m_runNormal); CMenu* SubMenu = m_MainMenu.GetSubMenu(2); @@ -4922,8 +4924,8 @@ void CMy2015RemoteDlg::OnHistoryClients() void CMy2015RemoteDlg::OnBackupData() { - MessageBoxA("如果更换主控IP,必须将主机迁移到新的主控IP名下。注意,更换主控程序的机器可能导致授权失效!" - "请将数据库文件拷贝到目标机器,否则将丢失全部备注信息。", "提示"); + MessageBoxL("如果更换主控IP,必须将主机迁移到新的主控IP名下。注意,更换主控程序的机器可能导致授权失效!" + "请将数据库文件拷贝到目标机器,否则将丢失全部备注信息。", "提示", MB_ICONINFORMATION); std::filesystem::path path = GetDbPath(); std::filesystem::path dir = path.parent_path(); ShellExecuteW(NULL, L"open", dir.c_str(), NULL, NULL, SW_SHOWNORMAL); @@ -4936,12 +4938,33 @@ void CMy2015RemoteDlg::OnPluginRequest() void CMy2015RemoteDlg::OnChangeLang() { - TODO_NOTICE; + size_t count = g_Lang.GetLanguageCount(); + if (count == 1) { + // 只有简体中文,提示用户 + MessageBoxA(_T("未检测到其他语言文件,请将语言文件放入 lang 目录!"), "提示", MB_ICONINFORMATION); + return; + } + + CString langCode = CLangSelectDlg::Show(this); + if (!langCode.IsEmpty()) { + if (!g_Lang.CheckEncoding(langCode)) { + MessageBoxL("请使用ANSI编码的语言文件。", "提示", MB_ICONWARNING); + return; + } + // 用户选择了语言 + g_Lang.Load(langCode); + + // 保存到配置文件 + THIS_CFG.SetStr("settings", "Language", langCode.GetString()); + + // 提示用户重启生效 + MessageBoxL("语言已切换,重启程序后生效。", "提示", MB_ICONINFORMATION); + } } void CMy2015RemoteDlg::OnImportData() { - if (IDOK!=MessageBoxA("导入主控程序的历史主机记录。此操作会覆盖本机的历史记录,请仅在迁移主控程序时进行操作。" + if (IDOK!=MessageBoxL("导入主控程序的历史主机记录。此操作会覆盖本机的历史记录,请仅在迁移主控程序时进行操作。" "数据库文件仅用于恢复主机备注信息。是否继续?", "提示",IDOK)) return; CFileDialog fileDlg(TRUE, NULL, "YAMA.db", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("YAMA DB (*.db)|*.db|All Files (*.*)|*.*||"), AfxGetMainWnd()); @@ -4950,7 +4973,7 @@ void CMy2015RemoteDlg::OnImportData() ret = fileDlg.DoModal(); } catch (...) { - AfxMessageBox("文件对话框未成功打开! 请稍后再试。", MB_ICONWARNING); + MessageBoxL("文件对话框未成功打开! 请稍后再试。", "提示", MB_ICONWARNING); return; } if (ret == IDOK) { diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index fed8505..7af375c 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -9,6 +9,7 @@ #include #include "file_server.h" #include "CListCtrlEx.h" +#include "LangManager.h" ////////////////////////////////////////////////////////////////////////// // 以下为特殊需求使用 @@ -65,7 +66,7 @@ class CClientListDlg; #include "pwd_gen.h" // CMy2015RemoteDlg 对话框 -class CMy2015RemoteDlg : public CDialogEx +class CMy2015RemoteDlg : public CDialogLangEx { public: static std::string GetHardwareID(int v=-1); diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj b/server/2015Remote/2015Remote_vs2015.vcxproj index 450c59c..3292615 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj +++ b/server/2015Remote/2015Remote_vs2015.vcxproj @@ -309,6 +309,7 @@ + diff --git a/server/2015Remote/2015Remote_vs2015.vcxproj.filters b/server/2015Remote/2015Remote_vs2015.vcxproj.filters index 6bdd3f8..0127869 100644 --- a/server/2015Remote/2015Remote_vs2015.vcxproj.filters +++ b/server/2015Remote/2015Remote_vs2015.vcxproj.filters @@ -148,6 +148,7 @@ + diff --git a/server/2015Remote/AudioDlg.cpp b/server/2015Remote/AudioDlg.cpp index 9869a4c..5625ba4 100644 --- a/server/2015Remote/AudioDlg.cpp +++ b/server/2015Remote/AudioDlg.cpp @@ -31,7 +31,7 @@ CAudioDlg::~CAudioDlg() void CAudioDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Check(pDX, IDC_CHECK, m_bSend); } @@ -47,12 +47,12 @@ END_MESSAGE_MAP() BOOL CAudioDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon,FALSE); CString strString; - strString.Format("%s - 语音监听", m_IPAddress); + strString.FormatL("%s - 语音监听", m_IPAddress); SetWindowText(strString); BYTE bToken = COMMAND_NEXT; @@ -93,7 +93,7 @@ void CAudioDlg::OnReceiveComplete(void) { m_nTotalRecvBytes += m_ContextObject->InDeCompressedBuffer.GetBufferLength() - 1; //1000+ =1000 1 CString strString; - strString.Format("Receive %d KBytes", m_nTotalRecvBytes / 1024); + strString.FormatL("Receive %d KBytes", m_nTotalRecvBytes / 1024); SetDlgItemText(IDC_TIPS, strString); switch (m_ContextObject->InDeCompressedBuffer.GetBYTE(0)) { case TOKEN_AUDIO_DATA: { diff --git a/server/2015Remote/BuildDlg.cpp b/server/2015Remote/BuildDlg.cpp index e76c453..4771a14 100644 --- a/server/2015Remote/BuildDlg.cpp +++ b/server/2015Remote/BuildDlg.cpp @@ -100,7 +100,7 @@ CString GenerateRandomName(int nLength) } CBuildDlg::CBuildDlg(CWnd* pParent) - : CDialog(CBuildDlg::IDD, pParent) + : CDialogLang(CBuildDlg::IDD, pParent) , m_strIP(_T("")) , m_strPort(_T("")) , m_strFindden(FLAG_FINDEN) @@ -119,7 +119,7 @@ CBuildDlg::~CBuildDlg() void CBuildDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_IP, m_strIP); DDX_Text(pDX, IDC_EDIT_PORT, m_strPort); DDX_Control(pDX, IDC_COMBO_EXE, m_ComboExe); @@ -306,7 +306,7 @@ void CBuildDlg::OnBnClickedOk() int index = m_ComboExe.GetCurSel(), typ=index; int is64bit = m_ComboBits.GetCurSel() == 0; if (index == IndexTestRun_InjSC && !is64bit) { - MessageBox("Shellcode 只能向64位电脑注入,注入器也只能是64位!", "提示", MB_ICONWARNING); + MessageBoxL("Shellcode 只能向64位电脑注入,注入器也只能是64位!", "提示", MB_ICONWARNING); return; } int startup = Startup_DLL; @@ -357,7 +357,7 @@ void CBuildDlg::OnBnClickedOk() case OTHER_ITEM: { m_OtherItem.GetWindowTextA(file); typ = -1; - if (file != "未选择文件") { + if (file != _TR("未选择文件")) { CFile File; File.Open(file, CFile::modeRead | CFile::typeBinary); dwFileSize = File.GetLength(); @@ -373,7 +373,7 @@ void CBuildDlg::OnBnClickedOk() break; } if (szBuffer == NULL) { - MessageBox("出现内部错误,请检查输入,重新编译程序!", "提示", MB_ICONWARNING); + MessageBoxL("出现内部错误,请检查输入,重新编译程序!", "提示", MB_ICONWARNING); return; } //////////上线信息////////////////////// @@ -394,7 +394,7 @@ void CBuildDlg::OnBnClickedOk() SAFE_DELETE_ARRAY(szBuffer); return; } - bool encrypt = m_strEncryptIP == _T("是"); + bool encrypt = m_strEncryptIP == _L(_T("是")); if (encrypt && startup != Startup_InjSC && index != IndexTinyRun) g_ConnectAddress.Encrypt(); if (m_runasAdmin) @@ -412,7 +412,7 @@ void CBuildDlg::OnBnClickedOk() CONNECT_ADDRESS* dst = (CONNECT_ADDRESS*)(ptr + iOffset); auto result = strlen(dst->szBuildDate) ? compareDates(dst->szBuildDate, g_ConnectAddress.szBuildDate) : -1; if (result > 0) { - MessageBox("客户端版本比主控程序更高, 无法生成!\r\n" + file, "提示", MB_ICONWARNING); + MessageBoxL("客户端版本比主控程序更高, 无法生成!\r\n" + file, "提示", MB_ICONWARNING); return; } if (result != -2 && result <= 0) { // 客户端版本不能不大于主控端 @@ -424,7 +424,7 @@ void CBuildDlg::OnBnClickedOk() bufSize -= iOffset + sizeof(g_ConnectAddress); } if (!bFind) { - MessageBox("出现内部错误,未能找到标识信息!\r\n" + file, "提示", MB_ICONWARNING); + MessageBoxL("出现内部错误,未能找到标识信息!\r\n" + file, "提示", MB_ICONWARNING); SAFE_DELETE_ARRAY(szBuffer); return; } @@ -441,19 +441,19 @@ void CBuildDlg::OnBnClickedOk() CFile File; BOOL r=File.Open(strSeverFile,CFile::typeBinary|CFile::modeCreate|CFile::modeWrite); if (!r) { - MessageBox("服务程序创建失败!\r\n" + strSeverFile, "提示", MB_ICONWARNING); + MessageBoxL("服务程序创建失败!\r\n" + strSeverFile, "提示", MB_ICONWARNING); SAFE_DELETE_ARRAY(szBuffer); return; } File.Write(szBuffer, dwFileSize); File.Close(); - CString tip = index == IndexTestRun_DLL ? "\r\n提示: 请生成\"ServerDll.dll\",以便程序正常运行。" : ""; - tip += g_ConnectAddress.protoType==PROTO_KCP ? "\n提示: 使用KCP协议生成服务,必须设置主控UDP协议参数为1。" : ""; + CString tip = index == IndexTestRun_DLL ? _TR("\r\n提示: 请生成\"ServerDll.dll\",以便程序正常运行。") : _T(""); + tip += g_ConnectAddress.protoType==PROTO_KCP ? _TR("\n提示: 使用KCP协议生成服务,必须设置主控UDP协议参数为1。") : _T(""); std::string upx; if(m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_UPX) upx = ReleaseUPX(); if (!upx.empty()) { run_upx_async(GetParent()->GetSafeHwnd(), upx, strSeverFile.GetString(), true); - MessageBox("正在UPX压缩,请关注信息提示。\r\n文件位于: " + strSeverFile + tip, "提示", MB_ICONINFORMATION); + MessageBoxL("正在UPX压缩,请关注信息提示。\r\n文件位于: " + strSeverFile + tip, "提示", MB_ICONINFORMATION); } else { if (m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_SC_AES) { DWORD dwSize = 0; @@ -496,7 +496,7 @@ void CBuildDlg::OnBnClickedOk() BOOL checked = m_BtnFileServer.GetCheck() == BST_CHECKED; if (checked){ strcpy(sc->downloadUrl, m_sDownloadUrl.IsEmpty() ? BuildPayloadUrl(m_strIP, sc->file) : m_sDownloadUrl); - if (m_sDownloadUrl.IsEmpty()) MessageBox(CString("文件下载地址: \r\n") + sc->downloadUrl, "提示"); + if (m_sDownloadUrl.IsEmpty()) MessageBoxL(CString("文件下载地址: \r\n") + sc->downloadUrl, "提示", MB_ICONINFORMATION); } tip = payload.IsEmpty() ? "\r\n警告: 没有生成载荷!" : checked ? "\r\n提示: 本机提供下载时,载荷文件必须拷贝至\"Payloads\"目录。" : "\r\n提示: 载荷文件必须拷贝至程序目录。"; @@ -506,7 +506,7 @@ void CBuildDlg::OnBnClickedOk() r = WriteBinaryToFile(payload.GetString(), (char*)srcData, srcLen, n == Payload_Raw ? 0 : -1); if (!r) tip = "\r\n警告: 生成载荷失败!"; } else { - MessageBox("文件生成失败: \r\n" + strSeverFile, "提示", MB_ICONINFORMATION); + MessageBoxL("文件生成失败: \r\n" + strSeverFile, "提示", MB_ICONINFORMATION); } SAFE_DELETE_ARRAY(srcData); } @@ -516,7 +516,7 @@ void CBuildDlg::OnBnClickedOk() } else if (m_ComboCompress.GetCurSel() == CLIENT_PE_TO_SEHLLCODE) { int pe_2_shellcode(const std::string & in_path, const std::string & out_str); int ret = pe_2_shellcode(strSeverFile.GetString(), strSeverFile.GetString()); - if (ret)MessageBox(CString("ShellCode 转换异常, 异常代码: ") + CString(std::to_string(ret).c_str()), + if (ret)MessageBoxL(CString("ShellCode 转换异常, 异常代码: ") + CString(std::to_string(ret).c_str()), "提示", MB_ICONINFORMATION); } else if (m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_SC_AES_OLD) { // 兼容旧版本 DWORD dwSize = 0; @@ -556,80 +556,80 @@ void CBuildDlg::OnBnClickedOk() std::vector padding(size, time(0)%256); WriteBinaryToFile(strSeverFile.GetString(), padding.data(), size, -1); } - MessageBox("生成成功! 文件位于:\r\n" + strSeverFile + tip, "提示", MB_ICONINFORMATION); + MessageBoxL("生成成功! 文件位于:\r\n" + strSeverFile + tip, "提示", MB_ICONINFORMATION); } SAFE_DELETE_ARRAY(szBuffer); if (index == IndexTestRun_DLL) return; } catch (CMemoryException* e) { char err[100]; e->GetErrorMessage(err, sizeof(err)); - MessageBox("内存异常:" + CString(err), "异常", MB_ICONERROR); + MessageBoxL("内存异常:" + CString(err), "异常", MB_ICONERROR); } catch (CFileException* e) { char err[100]; e->GetErrorMessage(err, sizeof(err)); - MessageBox("文件异常:" + CString(err), "异常", MB_ICONERROR); + MessageBoxL("文件异常:" + CString(err), "异常", MB_ICONERROR); } catch (CException* e) { char err[100]; e->GetErrorMessage(err, sizeof(err)); - MessageBox("其他异常:" + CString(err), "异常", MB_ICONERROR); + MessageBoxL("其他异常:" + CString(err), "异常", MB_ICONERROR); } SAFE_DELETE_ARRAY(szBuffer); - CDialog::OnOK(); + __super::OnOK(); } BOOL CBuildDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); // TODO: 在此添加额外的初始化 CEdit* pEdit = (CEdit*)GetDlgItem(IDC_EDIT_IP); pEdit->LimitText(99); - m_ComboExe.InsertString(IndexTestRun_DLL, "TestRun - 磁盘DLL"); - m_ComboExe.InsertString(IndexTestRun_MemDLL, "TestRun - 内存DLL"); - m_ComboExe.InsertString(IndexTestRun_InjSC, "TestRun - 注入任务管理器"); + m_ComboExe.InsertStringL(IndexTestRun_DLL, "TestRun - 磁盘DLL"); + m_ComboExe.InsertStringL(IndexTestRun_MemDLL, "TestRun - 内存DLL"); + m_ComboExe.InsertStringL(IndexTestRun_InjSC, "TestRun - 注入任务管理器"); - m_ComboExe.InsertString(IndexGhost, "ghost.exe"); - m_ComboExe.InsertString(IndexServerDll, "ServerDll.dll"); - m_ComboExe.InsertString(IndexTinyRun, "TinyRun.dll"); - m_ComboExe.InsertString(IndexGhostMsc, "ghost.exe - Windows 服务"); - m_ComboExe.InsertString(IndexTestRunMsc, "TestRun - Windows 服务"); - m_ComboExe.InsertString(OTHER_ITEM, CString("选择文件")); + m_ComboExe.InsertStringL(IndexGhost, "ghost.exe"); + m_ComboExe.InsertStringL(IndexServerDll, "ServerDll.dll"); + m_ComboExe.InsertStringL(IndexTinyRun, "TinyRun.dll"); + m_ComboExe.InsertStringL(IndexGhostMsc, "ghost.exe - Windows 服务"); + m_ComboExe.InsertStringL(IndexTestRunMsc, "TestRun - Windows 服务"); + m_ComboExe.InsertStringL(OTHER_ITEM, CString("选择文件")); m_ComboExe.SetCurSel(IndexTestRun_MemDLL); - m_ComboBits.InsertString(0, "64位"); - m_ComboBits.InsertString(1, "32位"); + m_ComboBits.InsertStringL(0, "64位"); + m_ComboBits.InsertStringL(1, "32位"); m_ComboBits.SetCurSel(0); - m_ComboRunType.InsertString(RUNNING_RANDOM, "随机上线"); - m_ComboRunType.InsertString(RUNNING_PARALLEL, "并发上线"); + m_ComboRunType.InsertStringL(RUNNING_RANDOM, "随机上线"); + m_ComboRunType.InsertStringL(RUNNING_PARALLEL, "并发上线"); m_ComboRunType.SetCurSel(RUNNING_RANDOM); - m_ComboProto.InsertString(PROTO_TCP, "TCP"); - m_ComboProto.InsertString(PROTO_UDP, "UDP"); - m_ComboProto.InsertString(PROTO_HTTP, "HTTP"); - m_ComboProto.InsertString(PROTO_RANDOM, "随机"); - m_ComboProto.InsertString(PROTO_KCP, "KCP"); + m_ComboProto.InsertStringL(PROTO_TCP, "TCP"); + m_ComboProto.InsertStringL(PROTO_UDP, "UDP"); + m_ComboProto.InsertStringL(PROTO_HTTP, "HTTP"); + m_ComboProto.InsertStringL(PROTO_RANDOM, "随机"); + m_ComboProto.InsertStringL(PROTO_KCP, "KCP"); m_ComboProto.SetCurSel(PROTO_TCP); - m_ComboEncrypt.InsertString(PROTOCOL_SHINE, "Shine"); - m_ComboEncrypt.InsertString(PROTOCOL_HELL, "HELL"); + m_ComboEncrypt.InsertStringL(PROTOCOL_SHINE, "Shine"); + m_ComboEncrypt.InsertStringL(PROTOCOL_HELL, "HELL"); m_ComboEncrypt.SetCurSel(PROTOCOL_HELL); - m_ComboCompress.InsertString(CLIENT_COMPRESS_NONE, "无"); - m_ComboCompress.InsertString(CLIENT_COMPRESS_UPX, "UPX"); - m_ComboCompress.InsertString(CLIENT_COMPRESS_SC_AES, "ShellCode AES"); - m_ComboCompress.InsertString(CLIENT_PE_TO_SEHLLCODE, "PE->ShellCode"); - m_ComboCompress.InsertString(CLIENT_COMPRESS_SC_AES_OLD, "ShellCode AES"); + m_ComboCompress.InsertStringL(CLIENT_COMPRESS_NONE, "无"); + m_ComboCompress.InsertStringL(CLIENT_COMPRESS_UPX, "UPX"); + m_ComboCompress.InsertStringL(CLIENT_COMPRESS_SC_AES, "ShellCode AES"); + m_ComboCompress.InsertStringL(CLIENT_PE_TO_SEHLLCODE, "PE->ShellCode"); + m_ComboCompress.InsertStringL(CLIENT_COMPRESS_SC_AES_OLD, "ShellCode AES"); m_ComboCompress.SetCurSel(CLIENT_COMPRESS_SC_AES_OLD); - m_ComboPayload.InsertString(Payload_Self, "载荷写入当前程序尾部"); - m_ComboPayload.InsertString(Payload_Raw, "载荷写入单独的二进制文件"); - m_ComboPayload.InsertString(Payload_BMP, "载荷写入 BMP 格式图片"); - m_ComboPayload.InsertString(Payload_JPG, "载荷写入 JPG 格式图片"); - m_ComboPayload.InsertString(Payload_PNG, "载荷写入 PNG 格式图片"); - m_ComboPayload.InsertString(Payload_ZIP, "载荷写入 ZIP 压缩包"); - m_ComboPayload.InsertString(Payload_PDF, "载荷写入 PDF 文件"); + m_ComboPayload.InsertStringL(Payload_Self, "载荷写入当前程序尾部"); + m_ComboPayload.InsertStringL(Payload_Raw, "载荷写入单独的二进制文件"); + m_ComboPayload.InsertStringL(Payload_BMP, "载荷写入 BMP 格式图片"); + m_ComboPayload.InsertStringL(Payload_JPG, "载荷写入 JPG 格式图片"); + m_ComboPayload.InsertStringL(Payload_PNG, "载荷写入 PNG 格式图片"); + m_ComboPayload.InsertStringL(Payload_ZIP, "载荷写入 ZIP 压缩包"); + m_ComboPayload.InsertStringL(Payload_PDF, "载荷写入 PDF 文件"); m_ComboPayload.SetCurSel(Payload_Self); m_ComboPayload.ShowWindow(SW_HIDE); m_StaticPayload.ShowWindow(SW_HIDE); @@ -643,6 +643,7 @@ BOOL CBuildDlg::OnInitDialog() m_runasAdmin = FALSE; m_MainMenu.LoadMenuA(IDR_MENU_BUILD); + TranslateMenu(&m_MainMenu); CMenu* SubMenu = m_MainMenu.GetSubMenu(0); SubMenu->CheckMenuItem(ID_MENU_ENCRYPT_IP, MF_CHECKED); SubMenu->CheckMenuItem(ID_CLIENT_RUNAS_ADMIN, MF_UNCHECKED); @@ -665,7 +666,7 @@ CString CBuildDlg::GetFilePath(CString type, CString filter, BOOL isOpen) CComPtr spDesktop; HRESULT hr = SHGetDesktopFolder(&spDesktop); if (FAILED(hr)) { - MessageBox("Explorer 未正确初始化! 请稍后再试。", "提示"); + MessageBoxL("Explorer 未正确初始化! 请稍后再试。", "提示", MB_ICONINFORMATION); return ""; } // 过滤器:显示所有文件和特定类型文件(例如文本文件) @@ -674,7 +675,7 @@ CString CBuildDlg::GetFilePath(CString type, CString filter, BOOL isOpen) try { ret = fileDlg.DoModal(); } catch (...) { - MessageBox("文件对话框未成功打开! 请稍后再试。", "提示"); + MessageBoxL("文件对话框未成功打开! 请稍后再试。", "提示", MB_ICONINFORMATION); return ""; } if (ret == IDOK) { @@ -734,9 +735,9 @@ void CBuildDlg::OnHelpFindden() void CBuildDlg::OnMenuEncryptIp() { - m_strEncryptIP = m_strEncryptIP == "是" ? "否" : "是"; + m_strEncryptIP = m_strEncryptIP == _L(_T("是")) ? _L(_T("否")) : _L(_T("是")); CMenu* SubMenu = m_MainMenu.GetSubMenu(0); - SubMenu->CheckMenuItem(ID_MENU_ENCRYPT_IP, m_strEncryptIP == "是" ? MF_CHECKED : MF_UNCHECKED); + SubMenu->CheckMenuItem(ID_MENU_ENCRYPT_IP, m_strEncryptIP == _L(_T("是")) ? MF_CHECKED : MF_UNCHECKED); } @@ -748,7 +749,7 @@ void CBuildDlg::OnClientRunasAdmin() static bool warned = false; if (m_runasAdmin && !warned) { warned = true; - MessageBox("安装Windows服务必须设置,客户端运行时会请求管理员权限,可能会触发系统UAC提示。\n" + MessageBoxL("安装Windows服务必须设置,客户端运行时会请求管理员权限,可能会触发系统UAC提示。\n" "如果未设置,则程序会以当前用户的权限运行,通常也能安装成功。", "提示", MB_ICONINFORMATION); } } @@ -767,7 +768,7 @@ void CBuildDlg::OnCbnSelchangeComboCompress() static bool warned = false; if (m_ComboCompress.GetCurSel() == CLIENT_COMPRESS_SC_AES && !warned) { warned = true; - MessageBoxA(_T("使用 ShellCode AES 在程序尾部追加载荷,可能无法在某些服务器系统运行! " + MessageBoxL(_T("使用 ShellCode AES 在程序尾部追加载荷,可能无法在某些服务器系统运行! " "请自行验证。或者选择其他载荷,或者切换为 ShellCode AES Old 模式生成!"), "提示", MB_ICONWARNING); } @@ -860,7 +861,7 @@ void CBuildDlg::OnEnKillfocusEditInstallDir() if (strText.IsEmpty()) return; if (!IsValidFileName(strText)) { - MessageBoxA(_T("文件名不合法,请检查:\n") + MessageBoxL(_T("文件名不合法,请检查:\n") _T("1. 不能包含 \\ / : * ? \" < > |\n") _T("2. 不能是系统保留名称 (CON, PRN 等)\n") _T("3. 不能以空格或点结尾"), "提示", MB_ICONWARNING); @@ -880,7 +881,7 @@ void CBuildDlg::OnEnKillfocusEditInstallName() if (strText.IsEmpty()) return; if (!IsValidFileName(strText)) { - MessageBoxA(_T("文件名不合法,请检查:\n") + MessageBoxL(_T("文件名不合法,请检查:\n") _T("1. 不能包含 \\ / : * ? \" < > |\n") _T("2. 不能是系统保留名称 (CON, PRN 等)\n") _T("3. 不能以空格或点结尾"), "提示", MB_ICONWARNING); @@ -911,7 +912,7 @@ void CBuildDlg::OnBnClickedCheckFileserver() static bool warned = false; if (!warned && checked) { warned = true; - MessageBoxA("请提供载荷的下载地址。下载地址前缀为 http 或 https。" + MessageBoxL("请提供载荷的下载地址。下载地址前缀为 http 或 https。" "默认由本机提供载荷下载服务,请将载荷文件放在\"Payloads\"目录。" "由本机提供下载时,下载地址可以省略输入。", "提示", MB_ICONINFORMATION); } diff --git a/server/2015Remote/BuildDlg.h b/server/2015Remote/BuildDlg.h index f803e83..b2ab4cb 100644 --- a/server/2015Remote/BuildDlg.h +++ b/server/2015Remote/BuildDlg.h @@ -1,6 +1,7 @@ #pragma once #include "Buffer.h" +#include "LangManager.h" LPBYTE ReadResource(int resourceId, DWORD& dwSize); @@ -10,7 +11,7 @@ CString BuildPayloadUrl(const char* ip, const char* name); // CBuildDlg 对话框 -class CBuildDlg : public CDialog +class CBuildDlg : public CDialogLang { DECLARE_DYNAMIC(CBuildDlg) diff --git a/server/2015Remote/CClientListDlg.cpp b/server/2015Remote/CClientListDlg.cpp index f6d1056..0f94b34 100644 --- a/server/2015Remote/CClientListDlg.cpp +++ b/server/2015Remote/CClientListDlg.cpp @@ -123,7 +123,7 @@ static int CompareClientByColumn(const std::pair& a, IMPLEMENT_DYNAMIC(CClientListDlg, CDialogEx) CClientListDlg::CClientListDlg(_ClientList* clients, CMy2015RemoteDlg* pParent) - : g_ClientList(clients), g_pParent(pParent), CDialogEx(IDD_DIALOG_CLIENTLIST, pParent) + : g_ClientList(clients), g_pParent(pParent), CDialogLangEx(IDD_DIALOG_CLIENTLIST, pParent) , m_nSortColumn(-1) , m_bSortAscending(TRUE) , m_nTipItem(-1) @@ -137,7 +137,7 @@ CClientListDlg::~CClientListDlg() void CClientListDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_CLIENT_LIST, m_ClientList); } @@ -153,7 +153,7 @@ END_MESSAGE_MAP() BOOL CClientListDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); HICON hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_MACHINE)); SetIcon(hIcon, FALSE); @@ -177,7 +177,7 @@ BOOL CClientListDlg::OnInitDialog() // 添加列(第一列序号不允许隐藏) for (int i = 0; i < g_nColumnCount; i++) { BOOL bCanHide = (i != COL_NO); // 序号列不允许隐藏 - m_ClientList.AddColumn(i, g_ColumnInfos[i].Name, g_ColumnInfos[i].Width, LVCFMT_LEFT, bCanHide); + m_ClientList.AddColumn(i, _L(g_ColumnInfos[i].Name), g_ColumnInfos[i].Width, LVCFMT_LEFT, bCanHide); } // 初始化列(计算百分比、加载配置、应用列宽) @@ -271,13 +271,13 @@ void CClientListDlg::DisplayClients() const ClientValue& val = groupInfo.Clients[0].second; CString strNo; - strNo.Format(_T("%d"), groupInfo.GroupId); + strNo.FormatL(_T("%d"), groupInfo.GroupId); CString strID; - strID.Format(_T("%llu"), key); + strID.FormatL(_T("%llu"), key); CString strLevel; - strLevel.Format(_T("%d"), val.Level); + strLevel.FormatL(_T("%d"), val.Level); CString strAuth = val.Authorized ? _T("Y") : _T("N"); @@ -299,10 +299,10 @@ void CClientListDlg::DisplayClients() else { // 多个设备时,显示可展开的分组行 CString strNo; - strNo.Format(_T("%d"), groupInfo.GroupId); + strNo.FormatL(_T("%d"), groupInfo.GroupId); CString strCount; - strCount.Format(_T("%s (%d台设备)"), groupInfo.bExpanded ? _T("-") : _T("+"), (int)clientCount); + strCount.FormatL(_T("%s (%d\u53f0\u8bbe\u5907)"), groupInfo.bExpanded ? _T("-") : _T("+"), (int)clientCount); nItem = m_ClientList.InsertItem(nRow, strNo); m_ClientList.SetItemText(nItem, COL_ID, strCount); @@ -327,10 +327,10 @@ void CClientListDlg::DisplayClients() const ClientValue& val = client.second; CString strSubNo, strID; - strID.Format(_T("%llu"), key); + strID.FormatL(_T("%llu"), key); CString strLevel; - strLevel.Format(_T("%d"), val.Level); + strLevel.FormatL(_T("%d"), val.Level); CString strAuth = val.Authorized ? _T("Y") : _T("N"); @@ -395,7 +395,7 @@ void CClientListDlg::AdjustColumnWidths() void CClientListDlg::OnSize(UINT nType, int cx, int cy) { - CDialogEx::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); if (m_ClientList.GetSafeHwnd() == NULL) { return; // 控件还没创建 @@ -494,7 +494,7 @@ BOOL CClientListDlg::PreTranslateMessage(MSG* pMsg) } } - return CDialogEx::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CClientListDlg::OnCancel() @@ -508,7 +508,7 @@ void CClientListDlg::PostNcDestroy() g_pParent->m_pClientListDlg = nullptr; } - CDialogEx::PostNcDestroy(); + __super::PostNcDestroy(); delete this; } diff --git a/server/2015Remote/CClientListDlg.h b/server/2015Remote/CClientListDlg.h index 7de852a..38689cb 100644 --- a/server/2015Remote/CClientListDlg.h +++ b/server/2015Remote/CClientListDlg.h @@ -31,7 +31,7 @@ struct GroupInfo { // CClientListDlg 对话框 -class CClientListDlg : public CDialogEx +class CClientListDlg : public CDialogLangEx { DECLARE_DYNAMIC(CClientListDlg) diff --git a/server/2015Remote/CDlgFileSend.cpp b/server/2015Remote/CDlgFileSend.cpp index b101330..38882d8 100644 --- a/server/2015Remote/CDlgFileSend.cpp +++ b/server/2015Remote/CDlgFileSend.cpp @@ -20,7 +20,7 @@ CDlgFileSend::~CDlgFileSend() void CDlgFileSend::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_PROGRESS_FILESEND, m_Progress); } @@ -76,8 +76,8 @@ LRESULT CDlgFileSend::OnUpdateFileProgress(WPARAM wParam, LPARAM lParam) CString status; double percent = pChunk->fileSize ? (pChunk->offset + pChunk->dataLength) * 100. / pChunk->fileSize : 100.; m_bIsSending ? - status.Format("发送文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent): - status.Format("接收文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent); + status.FormatL("发送文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent): + status.FormatL("接收文件(%d/%d): %.2f%%", 1 + pChunk->fileIndex, pChunk->totalNum, percent); SetDlgItemTextA(IDC_STATIC_CURRENTINDEX, status); SetDlgItemTextA(IDC_STATIC_CURRENT_FILE, *pFile); m_Progress.SetPos(percent); diff --git a/server/2015Remote/CDrawingBoard.cpp b/server/2015Remote/CDrawingBoard.cpp index 969c576..25759a9 100644 --- a/server/2015Remote/CDrawingBoard.cpp +++ b/server/2015Remote/CDrawingBoard.cpp @@ -31,7 +31,7 @@ CDrawingBoard::~CDrawingBoard() void CDrawingBoard::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CDrawingBoard, CDialog) @@ -138,7 +138,7 @@ void CDrawingBoard::OnLButtonUp(UINT nFlags, CPoint point) void CDrawingBoard::OnWindowPosChanged(WINDOWPOS* lpwndpos) { - CDialog::OnWindowPosChanged(lpwndpos); + __super::OnWindowPosChanged(lpwndpos); if (!m_bMoving) return; CRect rect; @@ -154,7 +154,7 @@ void CDrawingBoard::OnWindowPosChanged(WINDOWPOS* lpwndpos) void CDrawingBoard::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); if (!m_bSizing) return; // 发送新的窗口尺寸到客户端 @@ -212,7 +212,7 @@ BOOL CDrawingBoard::OnInitDialog() SetIcon(m_hIcon, FALSE); CString str; - str.Format("%s - 画板演示", m_IPAddress); + str.FormatL("%s - 画板演示", m_IPAddress); SetWindowText(str); m_font.CreateFont( @@ -248,12 +248,13 @@ void CDrawingBoard::OnRButtonDown(UINT nFlags, CPoint point) CMenu menu; menu.LoadMenu(IDR_MENU_POPUP); + TranslateMenu(&menu); CMenu* pSubMenu = menu.GetSubMenu(0); if (pSubMenu) pSubMenu->TrackPopupMenu(TPM_LEFTALIGN | TPM_RIGHTBUTTON, m_RightClickPos.x, m_RightClickPos.y, this); - CDialog::OnRButtonDown(nFlags, point); + __super::OnRButtonDown(nFlags, point); } @@ -297,7 +298,7 @@ BOOL CDrawingBoard::PreTranslateMessage(MSG* pMsg) return TRUE; // 吞掉回车 } } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CDrawingBoard::SendTextsToRemote(const CPoint& pt, const CString& text) diff --git a/server/2015Remote/CGridDialog.cpp b/server/2015Remote/CGridDialog.cpp index 60a7fde..41f78d0 100644 --- a/server/2015Remote/CGridDialog.cpp +++ b/server/2015Remote/CGridDialog.cpp @@ -9,7 +9,7 @@ BEGIN_MESSAGE_MAP(CGridDialog, CDialog) ON_MESSAGE(WM_CHILD_CLOSED, &CGridDialog::OnChildClosed) END_MESSAGE_MAP() -CGridDialog::CGridDialog() : CDialog() +CGridDialog::CGridDialog() : CDialogLang() { } @@ -18,7 +18,7 @@ BOOL CGridDialog::OnInitDialog() m_hIcon = ::LoadIconA(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME)); SetIcon(m_hIcon, FALSE); - CDialog::OnInitDialog(); + __super::OnInitDialog(); return TRUE; } @@ -117,7 +117,7 @@ void CGridDialog::LayoutChildren() void CGridDialog::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); if (m_pMaxChild == nullptr) { LayoutChildren(); @@ -207,7 +207,7 @@ void CGridDialog::OnLButtonDblClk(UINT nFlags, CPoint point) } } - CDialog::OnLButtonDblClk(nFlags, point); + __super::OnLButtonDblClk(nFlags, point); } BOOL CGridDialog::PreTranslateMessage(MSG* pMsg) @@ -215,5 +215,5 @@ BOOL CGridDialog::PreTranslateMessage(MSG* pMsg) if (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE) { return TRUE;// 屏蔽Enter和ESC关闭对话 } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } diff --git a/server/2015Remote/CGridDialog.h b/server/2015Remote/CGridDialog.h index d31a6dc..aaa883b 100644 --- a/server/2015Remote/CGridDialog.h +++ b/server/2015Remote/CGridDialog.h @@ -2,10 +2,11 @@ #include #include #include +#include "LangManager.h" #define WM_CHILD_CLOSED (WM_USER + 100) -class CGridDialog : public CDialog +class CGridDialog : public CDialogLang { public: CGridDialog(); diff --git a/server/2015Remote/CListCtrlEx.cpp b/server/2015Remote/CListCtrlEx.cpp index f06d787..5abbfde 100644 --- a/server/2015Remote/CListCtrlEx.cpp +++ b/server/2015Remote/CListCtrlEx.cpp @@ -45,7 +45,7 @@ void CListCtrlEx::SetConfigKey(const CString& strKey) int CListCtrlEx::AddColumn(int nCol, LPCTSTR lpszColumnHeading, int nWidth, int nFormat, BOOL bCanHide) { // 添加到列表控件 - int nResult = InsertColumn(nCol, lpszColumnHeading, nFormat, nWidth); + int nResult = InsertColumnL(nCol, lpszColumnHeading, nFormat, nWidth); if (nResult != -1) { // 保存列信息 @@ -187,7 +187,7 @@ void CListCtrlEx::ShowColumnContextMenu(CPoint pt) if (!m_Columns[i].CanHide) { flags |= MF_GRAYED; } - menu.AppendMenu(flags, 1000 + i, m_Columns[i].Name); + menu.AppendMenuL(flags, 1000 + i, m_Columns[i].Name); } // 显示菜单并获取选择 diff --git a/server/2015Remote/CListCtrlEx.h b/server/2015Remote/CListCtrlEx.h index e36efa9..d73f35d 100644 --- a/server/2015Remote/CListCtrlEx.h +++ b/server/2015Remote/CListCtrlEx.h @@ -38,7 +38,7 @@ public: // 设置配置键名(用于区分不同列表的配置,如 "ClientList", "FileList") void SetConfigKey(const CString& strKey); - // 添加列(替代 InsertColumn) + // 添加列(替代 InsertColumnL) // nCol: 列索引 // lpszColumnHeading: 列标题 // nFormat: 对齐方式,默认左对齐 diff --git a/server/2015Remote/CPasswordDlg.cpp b/server/2015Remote/CPasswordDlg.cpp index b762e2f..c625dde 100644 --- a/server/2015Remote/CPasswordDlg.cpp +++ b/server/2015Remote/CPasswordDlg.cpp @@ -96,7 +96,7 @@ bool IsPwdHashValid(const char* hash) } CPasswordDlg::CPasswordDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_PASSWORD, pParent) + : CDialogLangEx(IDD_DIALOG_PASSWORD, pParent) , m_sDeviceID(_T("")) , m_sPassword(_T("")) , m_sPasscodeHmac(THIS_CFG.GetStr("settings", "PwdHmac", "").c_str()) @@ -111,7 +111,7 @@ CPasswordDlg::~CPasswordDlg() void CPasswordDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_DEVICEID, m_EditDeviceID); DDX_Control(pDX, IDC_EDIT_DEVICEPWD, m_EditPassword); DDX_Text(pDX, IDC_EDIT_DEVICEID, m_sDeviceID); @@ -132,14 +132,14 @@ END_MESSAGE_MAP() BOOL CPasswordDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); // TODO: 在此添加额外的初始化 m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_PASSWORD)); SetIcon(m_hIcon, FALSE); - m_ComboBinding.InsertString(0, "计算机硬件信息"); - m_ComboBinding.InsertString(1, "主控IP或域名信息"); + m_ComboBinding.InsertStringL(0, "计算机硬件信息"); + m_ComboBinding.InsertStringL(1, "主控IP或域名信息"); m_ComboBinding.SetCurSel(m_nBindType); return TRUE; // return TRUE unless you set the focus to a control @@ -154,7 +154,7 @@ void CPasswordDlg::OnCbnSelchangeComboBind() m_EditDeviceID.SetWindowTextA(m_sDeviceID); auto master = THIS_CFG.GetStr("settings", "master", ""); if (m_nBindType == 1) { - MessageBoxA("请确认是否正确设置公网地址(IP或域名)?\r\n" + MessageBoxL("请确认是否正确设置公网地址(IP或域名)?\r\n" "绑定IP后主控只能使用指定IP,绑定域名后\r\n" "主控只能使用指定域名。当前公网地址: \r\n" + CString(master.empty() ? "未设置" : master.c_str()), "提示", MB_OK | MB_ICONWARNING); @@ -169,7 +169,7 @@ void CPasswordDlg::OnOK() THIS_CFG.SetStr("settings", "PwdHmac", m_sPasscodeHmac.GetString()); } - CDialogEx::OnOK(); + __super::OnOK(); } // CPasswordDlg 消息处理程序 @@ -177,7 +177,7 @@ void CPasswordDlg::OnOK() IMPLEMENT_DYNAMIC(CPwdGenDlg, CDialogEx) CPwdGenDlg::CPwdGenDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_KEYGEN, pParent) + : CDialogLangEx(IDD_DIALOG_KEYGEN, pParent) , m_sDeviceID(_T("")) , m_sPassword(_T("")) , m_sUserPwd(_T("")) @@ -194,7 +194,7 @@ CPwdGenDlg::~CPwdGenDlg() void CPwdGenDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_DEVICEID, m_EditDeviceID); DDX_Control(pDX, IDC_EDIT_DEVICEPWD, m_EditPassword); DDX_Control(pDX, IDC_EDIT_USERPWD, m_EditUserPwd); @@ -228,14 +228,14 @@ void CPwdGenDlg::OnBnClickedButtonGenkey() std::string pwdHash = hashSHA256(m_sUserPwd.GetString()); if (pwdHash != GetPwdHash()) { Mprintf("hashSHA256 [%s]: %s\n", m_sUserPwd, pwdHash.c_str()); - MessageBoxA("您输入的密码不正确,无法生成口令!", "提示", MB_OK | MB_ICONWARNING); + MessageBoxL("您输入的密码不正确,无法生成口令!", "提示", MB_OK | MB_ICONWARNING); m_sUserPwd.Empty(); return; } - CString strBeginDate = m_StartTm.Format("%Y%m%d"); - CString strEndDate = m_ExpireTm.Format("%Y%m%d"); + CString strBeginDate = m_StartTm.FormatL("%Y%m%d"); + CString strEndDate = m_ExpireTm.FormatL("%Y%m%d"); CString hostNum; - hostNum.Format("%04d", m_nHostNum); + hostNum.FormatL("%04d", m_nHostNum); // 密码形式:20250209 - 20350209: SHA256: HostNum std::string password = std::string(strBeginDate.GetString()) + " - " + strEndDate.GetBuffer() + ": " + GetPwdHash() + ": " + hostNum.GetBuffer(); std::string finalKey = deriveKey(password, m_sDeviceID.GetString()); @@ -260,7 +260,7 @@ void CPwdGenDlg::OnBnClickedButtonGenkey() BOOL CPwdGenDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); // TODO: 在此添加额外的初始化 m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_ICON_PASSWORD)); diff --git a/server/2015Remote/CPasswordDlg.h b/server/2015Remote/CPasswordDlg.h index 9825e27..7c29793 100644 --- a/server/2015Remote/CPasswordDlg.h +++ b/server/2015Remote/CPasswordDlg.h @@ -4,6 +4,7 @@ #include #include "Resource.h" #include "common/commands.h" +#include "LangManager.h" // CPasswordDlg 对话框 @@ -22,7 +23,7 @@ bool IsPwdHashValid(const char* pwdHash = nullptr); bool WritePwdHash(char* target, const std::string& pwdHash, const Validation &verify); -class CPasswordDlg : public CDialogEx +class CPasswordDlg : public CDialogLangEx { DECLARE_DYNAMIC(CPasswordDlg) @@ -52,7 +53,7 @@ public: }; -class CPwdGenDlg : public CDialogEx +class CPwdGenDlg : public CDialogLangEx { DECLARE_DYNAMIC(CPwdGenDlg) diff --git a/server/2015Remote/CRcEditDlg.cpp b/server/2015Remote/CRcEditDlg.cpp index 40f198e..602229c 100644 --- a/server/2015Remote/CRcEditDlg.cpp +++ b/server/2015Remote/CRcEditDlg.cpp @@ -12,7 +12,7 @@ IMPLEMENT_DYNAMIC(CRcEditDlg, CDialogEx) CRcEditDlg::CRcEditDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_RCEDIT, pParent) + : CDialogLangEx(IDD_DIALOG_RCEDIT, pParent) , m_sExePath(_T("")) , m_sIcoPath(_T("")) { @@ -25,7 +25,7 @@ CRcEditDlg::~CRcEditDlg() void CRcEditDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_EXE_FILE, m_EditExe); DDX_Control(pDX, IDC_EDIT_ICO_FILE, m_EditIco); DDX_Text(pDX, IDC_EDIT_EXE_FILE, m_sExePath); @@ -46,7 +46,7 @@ END_MESSAGE_MAP() BOOL CRcEditDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); // TODO: 在此添加额外的初始化 @@ -58,11 +58,11 @@ BOOL CRcEditDlg::OnInitDialog() void CRcEditDlg::OnOK() { if (m_sExePath.IsEmpty()) { - MessageBox("请选择目标应用程序!", "提示", MB_ICONINFORMATION); + MessageBoxL("请选择目标应用程序!", "提示", MB_ICONINFORMATION); return; } if (m_sIcoPath.IsEmpty()) { - MessageBox("请选择[*.ico]图标文件!", "提示", MB_ICONINFORMATION); + MessageBoxL("请选择[*.ico]图标文件!", "提示", MB_ICONINFORMATION); return; } std::string ReleaseEXE(int resID, const char* name); @@ -70,7 +70,7 @@ void CRcEditDlg::OnOK() std::string rcedit = ReleaseEXE(IDR_BIN_RCEDIT, "rcedit.exe"); if (rcedit.empty()) { - MessageBox("解压程序失败,无法替换图标!", "提示", MB_ICONINFORMATION); + MessageBoxL("解压程序失败,无法替换图标!", "提示", MB_ICONINFORMATION); return; } std::string exe = m_sExePath.GetString(); @@ -78,12 +78,12 @@ void CRcEditDlg::OnOK() std::string cmdLine = "\"" + rcedit + "\" " + "\"" + exe + "\" --set-icon \"" + icon + "\""; int result = run_cmd(cmdLine); if (result) { - MessageBox(CString("替换图标失败,错误代码: ") + std::to_string(result).c_str(), + MessageBoxL(CString("替换图标失败,错误代码: ") + std::to_string(result).c_str(), "提示", MB_ICONINFORMATION); return; } - CDialogEx::OnOK(); + __super::OnOK(); } @@ -95,7 +95,7 @@ void CRcEditDlg::OnBnClickedBtnSelectExe() try { ret = fileDlg.DoModal(); } catch (...) { - MessageBox("文件对话框未成功打开! 请稍后再试。", "提示"); + MessageBoxL("文件对话框未成功打开! 请稍后再试。", "提示", MB_ICONINFORMATION); return; } if (ret == IDOK) { @@ -113,7 +113,7 @@ void CRcEditDlg::OnBnClickedBtnSelectIco() try { ret = fileDlg.DoModal(); } catch (...) { - MessageBox("文件对话框未成功打开! 请稍后再试。", "提示"); + MessageBoxL("文件对话框未成功打开! 请稍后再试。", "提示", MB_ICONINFORMATION); return; } if (ret == IDOK) { diff --git a/server/2015Remote/CRcEditDlg.h b/server/2015Remote/CRcEditDlg.h index 54c3051..bdd986a 100644 --- a/server/2015Remote/CRcEditDlg.h +++ b/server/2015Remote/CRcEditDlg.h @@ -2,11 +2,11 @@ #include #include - +#include "LangManager.h" // CRcEditDlg 对话框 -class CRcEditDlg : public CDialogEx +class CRcEditDlg : public CDialogLangEx { DECLARE_DYNAMIC(CRcEditDlg) diff --git a/server/2015Remote/CTextDlg.cpp b/server/2015Remote/CTextDlg.cpp index fa75ce0..75c7b7f 100644 --- a/server/2015Remote/CTextDlg.cpp +++ b/server/2015Remote/CTextDlg.cpp @@ -15,7 +15,7 @@ IMPLEMENT_DYNAMIC(CTextDlg, CDialog) CTextDlg::CTextDlg(CWnd* pParent /*=nullptr*/) - : CDialog(IDD_TEXT, pParent) + : CDialogLang(IDD_TEXT, pParent) , nowstr(_T("")) , cmeline(_T("")) , oldstr(_T("")) @@ -28,7 +28,7 @@ CTextDlg::~CTextDlg() void CTextDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT1, oldstr); DDX_Text(pDX, IDC_EDIT2, nowstr); DDX_Text(pDX, IDC_EDIT3, cmeline); @@ -47,5 +47,5 @@ END_MESSAGE_MAP() void CTextDlg::OnBnClickedOk() { UpdateData(TRUE); - CDialog::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/CTextDlg.h b/server/2015Remote/CTextDlg.h index c9c3695..2a2b960 100644 --- a/server/2015Remote/CTextDlg.h +++ b/server/2015Remote/CTextDlg.h @@ -1,9 +1,9 @@ #pragma once - +#include "LangManager.h" // CTextDlg 对话框 -class CTextDlg : public CDialog +class CTextDlg : public CDialogLang { DECLARE_DYNAMIC(CTextDlg) diff --git a/server/2015Remote/CUpdateDlg.cpp b/server/2015Remote/CUpdateDlg.cpp index 54a4081..0b55c2f 100644 --- a/server/2015Remote/CUpdateDlg.cpp +++ b/server/2015Remote/CUpdateDlg.cpp @@ -11,7 +11,7 @@ IMPLEMENT_DYNAMIC(CUpdateDlg, CDialogEx) CUpdateDlg::CUpdateDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_UPDATE, pParent) + : CDialogLangEx(IDD_DIALOG_UPDATE, pParent) , m_nSelected(0) { @@ -23,7 +23,7 @@ CUpdateDlg::~CUpdateDlg() void CUpdateDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_UPDATE_SELECT, m_ComboUpdateSelect); DDX_CBIndex(pDX, IDC_COMBO_UPDATE_SELECT, m_nSelected); } @@ -37,11 +37,11 @@ END_MESSAGE_MAP() BOOL CUpdateDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); // TODO: 在此添加额外的初始化 - m_ComboUpdateSelect.InsertString(0, _T("TestRun")); - m_ComboUpdateSelect.InsertString(1, _T("Ghost")); + m_ComboUpdateSelect.InsertStringL(0, _T("TestRun")); + m_ComboUpdateSelect.InsertStringL(1, _T("Ghost")); m_ComboUpdateSelect.SetCurSel(1); return TRUE; diff --git a/server/2015Remote/CUpdateDlg.h b/server/2015Remote/CUpdateDlg.h index 03305e3..2590880 100644 --- a/server/2015Remote/CUpdateDlg.h +++ b/server/2015Remote/CUpdateDlg.h @@ -1,10 +1,10 @@ #pragma once #include "afxdialogex.h" - +#include "LangManager.h" // CUpdateDlg 对话框 -class CUpdateDlg : public CDialogEx +class CUpdateDlg : public CDialogLangEx { DECLARE_DYNAMIC(CUpdateDlg) diff --git a/server/2015Remote/CWalletDlg.cpp b/server/2015Remote/CWalletDlg.cpp index a9e7e91..64bf928 100644 --- a/server/2015Remote/CWalletDlg.cpp +++ b/server/2015Remote/CWalletDlg.cpp @@ -13,7 +13,7 @@ IMPLEMENT_DYNAMIC(CWalletDlg, CDialogEx) CWalletDlg::CWalletDlg(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_WALLET, pParent) + : CDialogLangEx(IDD_DIALOG_WALLET, pParent) { } @@ -24,7 +24,7 @@ CWalletDlg::~CWalletDlg() void CWalletDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_WALLET_BTC, m_EditBTC); DDX_Control(pDX, IDC_EDIT_WALLET_ERC20, m_EditERC20); DDX_Control(pDX, IDC_EDIT_WALLET_OMNI, m_EditOMNI); @@ -47,7 +47,7 @@ END_MESSAGE_MAP() BOOL CWalletDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); auto a = StringToVector(m_str.GetString(), ';', MAX_WALLET_NUM); m_EditBTC.SetWindowTextA(a[ADDR_BTC].c_str()); @@ -94,11 +94,11 @@ void CWalletDlg::OnOK() if (WALLET_UNKNOWN == detectWalletType(a[i].GetString())) { char tip[100]; sprintf(tip, "第 %d 个钱包地址不合法!", i + 1); - MessageBox(CString(tip), "提示", MB_ICONINFORMATION); + MessageBoxL(CString(tip), "提示", MB_ICONINFORMATION); return; } } m_str = JoinCStringArray(a, MAX_WALLET_NUM, _T(';')); - CDialogEx::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/CWalletDlg.h b/server/2015Remote/CWalletDlg.h index 71c3988..6ef6721 100644 --- a/server/2015Remote/CWalletDlg.h +++ b/server/2015Remote/CWalletDlg.h @@ -1,9 +1,9 @@ #pragma once - +#include "LangManager.h" // CWalletDlg 对话框 -class CWalletDlg : public CDialogEx +class CWalletDlg : public CDialogLangEx { DECLARE_DYNAMIC(CWalletDlg) diff --git a/server/2015Remote/Chat.cpp b/server/2015Remote/Chat.cpp index 22cbe9b..d217155 100644 --- a/server/2015Remote/Chat.cpp +++ b/server/2015Remote/Chat.cpp @@ -21,7 +21,7 @@ CChat::CChat(CWnd* pParent, Server* pIOCPServer, ClientContext* pContext) void CChat::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_TIP, m_editTip); DDX_Control(pDX, IDC_EDIT_NEWMSG, m_editNewMsg); DDX_Control(pDX, IDC_EDIT_CHATLOG, m_editChatLog); @@ -44,12 +44,12 @@ END_MESSAGE_MAP() BOOL CChat::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); CString str; - str.Format(_T("远程交谈 - %s"), m_ContextObject->PeerName.c_str()), + str.FormatL(_T("远程交谈 - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str); - m_editTip.SetWindowText(_T("提示: 对方聊天对话框在发送消息后才会弹出")); + m_editTip.SetWindowTextL("提示: 对方聊天对话框在发送消息后才会弹出"); m_editNewMsg.SetLimitText(4079); // TODO: Add extra initialization here BYTE bToken = COMMAND_NEXT_CHAT; @@ -135,7 +135,7 @@ HBRUSH CChat::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) pDC->SetBkColor(clr); // 设置黄色的背景 return CreateSolidBrush(clr); // 作为约定,返回背景色对应的刷子句柄 } else { - return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); + return __super::OnCtlColor(pDC, pWnd, nCtlColor); } } @@ -143,8 +143,7 @@ void CChat::PostNcDestroy() { if (!m_bIsClosed) OnCancel(); - CDialog::PostNcDestroy(); - delete this; + __super::PostNcDestroy(); } BOOL CChat::PreTranslateMessage(MSG* pMsg) @@ -152,7 +151,7 @@ BOOL CChat::PreTranslateMessage(MSG* pMsg) if (pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE) { return true; } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CChat::OnSetfocusEditChatLog() diff --git a/server/2015Remote/DecryptDlg.cpp b/server/2015Remote/DecryptDlg.cpp index 63da659..46f7581 100644 --- a/server/2015Remote/DecryptDlg.cpp +++ b/server/2015Remote/DecryptDlg.cpp @@ -15,7 +15,7 @@ DecryptDlg::~DecryptDlg() void DecryptDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_DECRYPT_RESULT, m_EditDecrypedResult); } @@ -37,11 +37,11 @@ END_MESSAGE_MAP() BOOL DecryptDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, FALSE); CString str; - str.Format("%s - 解密数据", m_IPAddress); + str.FormatL("%s - 解密数据", m_IPAddress); SetWindowText(str); BYTE bToken = COMMAND_NEXT; diff --git a/server/2015Remote/EditDialog.cpp b/server/2015Remote/EditDialog.cpp index c22cd12..6b7a623 100644 --- a/server/2015Remote/EditDialog.cpp +++ b/server/2015Remote/EditDialog.cpp @@ -12,7 +12,7 @@ IMPLEMENT_DYNAMIC(CEditDialog, CDialog) CEditDialog::CEditDialog(CWnd* pParent) - : CDialog(CEditDialog::IDD, pParent) + : CDialogLang(CEditDialog::IDD, pParent) , m_EditString(_T("")) { @@ -24,7 +24,7 @@ CEditDialog::~CEditDialog() void CEditDialog::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_STRING, m_EditString); } @@ -46,5 +46,5 @@ void CEditDialog::OnBnClickedOk() MessageBeep(0); return; //不关闭对话框 } - CDialog::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/EditDialog.h b/server/2015Remote/EditDialog.h index e8256fa..a11b68c 100644 --- a/server/2015Remote/EditDialog.h +++ b/server/2015Remote/EditDialog.h @@ -1,9 +1,9 @@ #pragma once - +#include "LangManager.h" // CEditDialog 对话框 -class CEditDialog : public CDialog +class CEditDialog : public CDialogLang { DECLARE_DYNAMIC(CEditDialog) diff --git a/server/2015Remote/FileManagerDlg.cpp b/server/2015Remote/FileManagerDlg.cpp index 24f120c..e1b5647 100644 --- a/server/2015Remote/FileManagerDlg.cpp +++ b/server/2015Remote/FileManagerDlg.cpp @@ -66,7 +66,7 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientConte void CFileManagerDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFileManagerDlg) DDX_Control(pDX, IDC_REMOTE_PATH, m_Remote_Directory_ComboBox); DDX_Control(pDX, IDC_LOCAL_PATH, m_Local_Directory_ComboBox); @@ -171,7 +171,7 @@ int GetIconIndex(LPCTSTR lpFileName, DWORD dwFileAttributes) BOOL CFileManagerDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); // TODO: Add extra initialization here @@ -227,7 +227,7 @@ BOOL CFileManagerDlg::OnInitDialog() // 设置标题 CString str; - str.Format("%s - 文件管理",m_IPAddress); + str.FormatL("%s - 文件管理",m_IPAddress); SetWindowText(str); // 为列表视图设置ImageList @@ -270,7 +270,7 @@ BOOL CFileManagerDlg::OnInitDialog() void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here // 状态栏还没有创建 @@ -309,10 +309,10 @@ void CFileManagerDlg::FixedLocalDriveList() char *pDrive = NULL; m_list_local.DeleteAllItems(); while(m_list_local.DeleteColumn(0) != 0); - m_list_local.InsertColumn(0, "名称", LVCFMT_LEFT, 200); - m_list_local.InsertColumn(1, "类型", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(2, "总大小", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(3, "可用空间", LVCFMT_LEFT, 115); + m_list_local.InsertColumnL(0, "名称", LVCFMT_LEFT, 200); + m_list_local.InsertColumnL(1, "类型", LVCFMT_LEFT, 100); + m_list_local.InsertColumnL(2, "总大小", LVCFMT_LEFT, 100); + m_list_local.InsertColumnL(3, "可用空间", LVCFMT_LEFT, 115); GetLogicalDriveStrings(sizeof(DriveString), DriveString); pDrive = DriveString; @@ -348,16 +348,16 @@ void CFileManagerDlg::FixedLocalDriveList() m_list_local.SetItemText(nItem, 1, FileSystem); } CString str; - str.Format("%10.1f GB", (float)AmntMB / 1024); + str.FormatL("%10.1f GB", (float)AmntMB / 1024); m_list_local.SetItemText(nItem, 2, str); - str.Format("%10.1f GB", (float)FreeMB / 1024); + str.FormatL("%10.1f GB", (float)FreeMB / 1024); m_list_local.SetItemText(nItem, 3, str); } // 重置本地当前路径 m_Local_Path = ""; m_Local_Directory_ComboBox.ResetContent(); - ShowMessage("本地:装载目录 %s 完成", m_Local_Path); + ShowMessage(_TRF("本地:装载目录 %s 完成"), m_Local_Path); } void CFileManagerDlg::OnDblclkListLocal(NMHDR* pNMHDR, LRESULT* pResult) @@ -403,16 +403,16 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) return; } - m_Local_Directory_ComboBox.InsertString(0, m_Local_Path); + m_Local_Directory_ComboBox.InsertStringL(0, m_Local_Path); m_Local_Directory_ComboBox.SetCurSel(0); // 重建标题 m_list_local.DeleteAllItems(); while(m_list_local.DeleteColumn(0) != 0); - m_list_local.InsertColumn(0, "名称", LVCFMT_LEFT, 200); - m_list_local.InsertColumn(1, "大小", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(2, "类型", LVCFMT_LEFT, 100); - m_list_local.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115); + m_list_local.InsertColumnL(0, "名称", LVCFMT_LEFT, 200); + m_list_local.InsertColumnL(1, "大小", LVCFMT_LEFT, 100); + m_list_local.InsertColumnL(2, "类型", LVCFMT_LEFT, 100); + m_list_local.InsertColumnL(3, "修改日期", LVCFMT_LEFT, 115); int nItemIndex = 0; m_list_local.SetItemData @@ -443,15 +443,15 @@ void CFileManagerDlg::FixedLocalFileList(CString directory) m_list_local.SetItemText(nItem, 2, sfi.szTypeName); CString str; - str.Format("%10d KB", file.GetLength() / 1024 + (file.GetLength() % 1024 ? 1 : 0)); + str.FormatL("%10d KB", file.GetLength() / 1024 + (file.GetLength() % 1024 ? 1 : 0)); m_list_local.SetItemText(nItem, 1, str); CTime time; file.GetLastWriteTime(time); - m_list_local.SetItemText(nItem, 3, time.Format("%Y-%m-%d %H:%M")); + m_list_local.SetItemText(nItem, 3, time.FormatL("%Y-%m-%d %H:%M")); } } - ShowMessage("本地:装载目录 %s 完成", m_Local_Path); + ShowMessage(_TRF("本地:装载目录 %s 完成"), m_Local_Path); } void CFileManagerDlg::DropItemOnList(CListCtrl* pDragList, CListCtrl* pDropList) @@ -628,7 +628,7 @@ void CFileManagerDlg::OnMouseMove(UINT nFlags, CPoint point) SetCursor(LoadCursor(NULL, IDC_NO)); } } - CDialog::OnMouseMove(nFlags, point); + __super::OnMouseMove(nFlags, point); } void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) @@ -661,7 +661,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) DropItemOnList(m_pDragList, m_pDropList); //Call routine to perform the actual drop } } - CDialog::OnLButtonUp(nFlags, point); + __super::OnLButtonUp(nFlags, point); } BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) @@ -713,14 +713,14 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) m_wndToolBar_Remote.OnUpdateCmdUI((CFrameWnd*)this, TRUE); } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CFileManagerDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default m_ProgressCtrl->StepIt(); - CDialog::OnTimer(nIDEvent); + __super::OnTimer(nIDEvent); } void CFileManagerDlg::FixedRemoteDriveList() @@ -735,10 +735,10 @@ void CFileManagerDlg::FixedRemoteDriveList() m_list_remote.DeleteAllItems(); // 重建Column while(m_list_remote.DeleteColumn(0) != 0); - m_list_remote.InsertColumn(0, "名称", LVCFMT_LEFT, 200); - m_list_remote.InsertColumn(1, "类型", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(2, "总大小", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(3, "可用空间", LVCFMT_LEFT, 115); + m_list_remote.InsertColumnL(0, "名称", LVCFMT_LEFT, 200); + m_list_remote.InsertColumnL(1, "类型", LVCFMT_LEFT, 100); + m_list_remote.InsertColumnL(2, "总大小", LVCFMT_LEFT, 100); + m_list_remote.InsertColumnL(3, "可用空间", LVCFMT_LEFT, 115); char *pDrive = NULL; pDrive = (char *)m_bRemoteDriveList; @@ -780,15 +780,15 @@ void CFileManagerDlg::FixedRemoteDriveList() } } CString str; - str.Format("%c:\\", pDrive[i]); + str.FormatL("%c:\\", pDrive[i]); int nItem = m_list_remote.InsertItem(i, str, nIconIndex); m_list_remote.SetItemData(nItem, 1); memcpy(&AmntMB, pDrive + i + 2, 4); memcpy(&FreeMB, pDrive + i + 6, 4); - str.Format("%10.1f GB", (float)AmntMB / 1024); + str.FormatL("%10.1f GB", (float)AmntMB / 1024); m_list_remote.SetItemText(nItem, 2, str); - str.Format("%10.1f GB", (float)FreeMB / 1024); + str.FormatL("%10.1f GB", (float)FreeMB / 1024); m_list_remote.SetItemText(nItem, 3, str); i += 10; @@ -813,7 +813,7 @@ void CFileManagerDlg::FixedRemoteDriveList() m_Remote_Path = ""; m_Remote_Directory_ComboBox.ResetContent(); - ShowMessage("远程:装载目录 %s 完成", m_Remote_Path); + ShowMessage(_TRF("远程:装载目录 %s 完成"), m_Remote_Path); } void CFileManagerDlg::OnClose() @@ -947,7 +947,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_ContextObject->Send2Client(bPacket, PacketSize); LocalFree(bPacket); - m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); + m_Remote_Directory_ComboBox.InsertStringL(0, m_Remote_Path); m_Remote_Directory_ComboBox.SetCurSel(0); // 得到返回数据前禁窗口 @@ -976,10 +976,10 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) // 重建标题 m_list_remote.DeleteAllItems(); while(m_list_remote.DeleteColumn(0) != 0); - m_list_remote.InsertColumn(0, "名称", LVCFMT_LEFT, 200); - m_list_remote.InsertColumn(1, "大小", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(2, "类型", LVCFMT_LEFT, 100); - m_list_remote.InsertColumn(3, "修改日期", LVCFMT_LEFT, 115); + m_list_remote.InsertColumnL(0, "名称", LVCFMT_LEFT, 200); + m_list_remote.InsertColumnL(1, "大小", LVCFMT_LEFT, 100); + m_list_remote.InsertColumnL(2, "类型", LVCFMT_LEFT, 100); + m_list_remote.InsertColumnL(3, "修改日期", LVCFMT_LEFT, 115); int nItemIndex = 0; m_list_remote.SetItemData @@ -1026,11 +1026,11 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) memcpy(&dwFileSizeHigh, pList, 4); memcpy(&dwFileSizeLow, pList + 4, 4); CString strSize; - strSize.Format("%10d KB", (dwFileSizeHigh * (MAXDWORD+long long(1))) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); + strSize.FormatL("%10d KB", (dwFileSizeHigh * (MAXDWORD+long long(1))) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); m_list_remote.SetItemText(nItem, 1, strSize); memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME)); CTime time(ftm_strReceiveLocalFileTime); - m_list_remote.SetItemText(nItem, 3, time.Format("%Y-%m-%d %H:%M")); + m_list_remote.SetItemText(nItem, 3, time.FormatL("%Y-%m-%d %H:%M")); } pList += 16; } @@ -1041,10 +1041,10 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE *pbBuffer, DWORD dwBufferLen) // 恢复窗口 m_list_remote.EnableWindow(TRUE); - ShowMessage("远程:装载目录 %s 完成", m_Remote_Path); + ShowMessage(_TRF("远程:装载目录 %s 完成"), m_Remote_Path); } -void CFileManagerDlg::ShowMessage(char *lpFmt, ...) +void CFileManagerDlg::ShowMessage(const char *lpFmt, ...) { char *buff = new char[1024]; va_list arglist; @@ -1292,7 +1292,7 @@ bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) FixedUploadDirectory(strDirectory); // 如果找到的是目录,则进入此目录进行递归 } else { CString file; - file.Format("%s%s%s", lpPathName, lpszSlash, wfd.cFileName); + file.FormatL("%s%s%s", lpPathName, lpszSlash, wfd.cFileName); //Mprintf("send file %s\n",strFile); m_Remote_Upload_Job.AddTail(file); // 对文件进行操作 @@ -1336,7 +1336,7 @@ void CFileManagerDlg::OnLocalCopy() } //EO while(pos) -- at this point we have deleted the moving items and stored them in memory if (m_Remote_Upload_Job.IsEmpty()) { - ::MessageBox(m_hWnd, "文件夹为空", "警告", MB_OK|MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, "文件夹为空", "警告", MB_OK|MB_ICONWARNING); return; } EnableControl(FALSE); @@ -1359,7 +1359,7 @@ void CFileManagerDlg::OnLocalCompress() std::string target = m_Local_Path.GetString() + ToPekingDateTime(0) + ".zsta"; zsta::Error err = zsta::CZstdArchive::Compress(paths, target); if (err != zsta::Error::Success) { - ::MessageBoxA(m_hWnd, "压缩失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), + MessageBoxAPI_L(m_hWnd, "压缩失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), "错误", MB_OK | MB_ICONERROR); } else { FixedLocalFileList("."); @@ -1402,7 +1402,7 @@ void CFileManagerDlg::OnLocalUnCompress() std::string destDir = GetExtractDir(path); zsta::Error err = zsta::CZstdArchive::Extract(path, destDir); if (err != zsta::Error::Success) { - ::MessageBoxA(m_hWnd, "解压失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), + MessageBoxAPI_L(m_hWnd, "解压失败: " + CString(zsta::CZstdArchive::GetErrorString(err)), "错误", MB_OK | MB_ICONERROR); } else { needRefresh = TRUE; @@ -1462,7 +1462,7 @@ void CFileManagerDlg::OnRemoteCompress() paths.push_back(file.GetBuffer(0)); } if (paths.size() <= 1) { - ::MessageBoxA(m_hWnd, "请先选择要压缩的文件或文件夹!", "提示", MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, "请先选择要压缩的文件或文件夹!", "提示", MB_OK | MB_ICONWARNING); return; } auto pathsMultiString = BuildMultiStringPath(paths); @@ -1490,7 +1490,7 @@ void CFileManagerDlg::OnRemoteUnCompress() } } if (paths.empty()) { - ::MessageBoxA(m_hWnd, "请先选择要解压的.zsta文件!", "提示", MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, "请先选择要解压的.zsta文件!", "提示", MB_OK | MB_ICONWARNING); return; } auto pathsMultiString = BuildMultiStringPath(paths); @@ -1591,10 +1591,10 @@ BOOL CFileManagerDlg::SendDeleteJob() BYTE *bPacket = (BYTE *)LocalAlloc(LPTR, nPacketSize); if (file.GetAt(file.GetLength() - 1) == '\\') { - ShowMessage("远程:删除目录 %s\\*.* 完成", file); + ShowMessage(_TRF("远程:删除目录 %s\\*.* 完成"), file); bPacket[0] = COMMAND_DELETE_DIRECTORY; } else { - ShowMessage("远程:删除文件 %s 完成", file); + ShowMessage(_TRF("远程:删除文件 %s 完成"), file); bPacket[0] = COMMAND_DELETE_FILE; } // 文件偏移,续传时用 @@ -1755,7 +1755,7 @@ void CFileManagerDlg::CreateLocalRecvFile() if (hFile == INVALID_HANDLE_VALUE) { m_nOperatingFileLength = 0; m_nCounter = 0; - ::MessageBox(m_hWnd, m_strReceiveLocalFile + " 文件创建失败", "警告", MB_OK|MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, m_strReceiveLocalFile + " 文件创建失败", "警告", MB_OK|MB_ICONWARNING); return; } SAFE_CLOSE_HANDLE(hFile); @@ -1820,7 +1820,7 @@ void CFileManagerDlg::WriteLocalRecvFile() } } if (i == MAX_WRITE_RETRY && nRet <= 0) { - ::MessageBox(m_hWnd, m_strReceiveLocalFile + " 文件写入失败!", "警告", MB_OK|MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, m_strReceiveLocalFile + " 文件写入失败!", "警告", MB_OK|MB_ICONWARNING); m_bIsStop = true; } SAFE_CLOSE_HANDLE(hFile); @@ -1852,7 +1852,7 @@ void CFileManagerDlg::EndLocalRecvFile() m_nTransferMode = TRANSFER_MODE_NORMAL; EnableControl(TRUE); FixedLocalFileList("."); - ShowMessage("本地:装载目录 %s\\*.* 完成", m_Local_Path); + ShowMessage(_TRF("本地:装载目录 %s\\*.* 完成"), m_Local_Path); } else { // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); @@ -1872,7 +1872,7 @@ void CFileManagerDlg::EndLocalUploadFile() m_bIsStop = false; EnableControl(TRUE); GetRemoteFileList("."); - ShowMessage("远程:装载目录 %s\\*.* 完成", m_Remote_Path); + ShowMessage(_TRF("远程:装载目录 %s\\*.* 完成"), m_Remote_Path); } else { // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); @@ -1887,7 +1887,7 @@ void CFileManagerDlg::EndRemoteDeleteFile() m_bIsStop = false; EnableControl(TRUE); GetRemoteFileList("."); - ShowMessage("远程:装载目录 %s\\*.* 完成", m_Remote_Path); + ShowMessage(_TRF("远程:装载目录 %s\\*.* 完成"), m_Remote_Path); } else { // 我靠,不sleep下会出错,服了可能以前的数据还没send出去 Sleep(5); @@ -1917,11 +1917,12 @@ void CFileManagerDlg::SendStop() void CFileManagerDlg::ShowProgress() { - char *lpDirection = NULL; + CString strDirection; if (m_bIsUpload) - lpDirection = "传送文件"; + strDirection = _L(_T("传送文件")); else - lpDirection = "接收文件"; + strDirection = _L(_T("接收文件")); + char *lpDirection = (char*)(LPCSTR)strDirection; // 防止除零导致未定义行为 if (m_nOperatingFileLength <= 0) { @@ -1947,15 +1948,15 @@ void CFileManagerDlg::OnLocalDelete() m_bIsUpload = true; CString str; if (m_list_local.GetSelectedCount() > 1) - str.Format("确定要将这 %d 项删除吗?", m_list_local.GetSelectedCount()); + str.FormatL("确定要将这 %d 项删除吗?", m_list_local.GetSelectedCount()); else { CString file = m_list_local.GetItemText(m_list_local.GetSelectionMark(), 0); if (m_list_local.GetItemData(m_list_local.GetSelectionMark()) == 1) - str.Format("确实要删除文件夹“%s”并将所有内容删除吗?", file); + str.FormatL("确实要删除文件夹“%s”并将所有内容删除吗?", file); else - str.Format("确实要把“%s”删除吗?", file); + str.FormatL("确实要把“%s”删除吗?", file); } - if (::MessageBox(m_hWnd, str, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO) + if (MessageBoxAPI_L(m_hWnd, str, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO) return; EnableControl(FALSE); @@ -1984,15 +1985,15 @@ void CFileManagerDlg::OnRemoteDelete() // TODO: Add your command handler code here CString str; if (m_list_remote.GetSelectedCount() > 1) - str.Format("确定要将这 %d 项删除吗?", m_list_remote.GetSelectedCount()); + str.FormatL("确定要将这 %d 项删除吗?", m_list_remote.GetSelectedCount()); else { CString file = m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); if (m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) == 1) - str.Format("确实要删除文件夹“%s”并将所有内容删除吗?", file); + str.FormatL("确实要删除文件夹“%s”并将所有内容删除吗?", file); else - str.Format("确实要把“%s”删除吗?", file); + str.FormatL("确实要把“%s”删除吗?", file); } - if (::MessageBox(m_hWnd, str, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO) + if (MessageBoxAPI_L(m_hWnd, str, "确认删除", MB_YESNO|MB_ICONQUESTION) == IDNO) return; m_Remote_Delete_Job.RemoveAll(); POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl @@ -2026,8 +2027,7 @@ void CFileManagerDlg::OnLocalStop() void CFileManagerDlg::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class - delete this; - CDialog::PostNcDestroy(); + __super::PostNcDestroy(); } void CFileManagerDlg::SendTransferMode() @@ -2346,6 +2346,7 @@ void CFileManagerDlg::OnRclickListLocal(NMHDR* pNMHDR, LRESULT* pResult) CListCtrl *pListCtrl = &m_list_local; CMenu popup; popup.LoadMenu(IDR_FILEMANAGER); + TranslateMenu(&popup); CMenu* pM = popup.GetSubMenu(0); CPoint p; GetCursorPos(&p); @@ -2381,6 +2382,7 @@ void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult) CListCtrl *pListCtrl = &m_list_remote; CMenu popup; popup.LoadMenu(IDR_FILEMANAGER); + TranslateMenu(&popup); CMenu* pM = popup.GetSubMenu(0); CPoint p; GetCursorPos(&p); diff --git a/server/2015Remote/FileManagerDlg.h b/server/2015Remote/FileManagerDlg.h index 8fce081..c42f1e4 100644 --- a/server/2015Remote/FileManagerDlg.h +++ b/server/2015Remote/FileManagerDlg.h @@ -78,7 +78,7 @@ public: strList m_Remote_Delete_Job; CTrueColorToolBar m_wndToolBar_Local; CTrueColorToolBar m_wndToolBar_Remote; - void ShowMessage(char *lpFmt, ...); + void ShowMessage(const char *lpFmt, ...); CString m_Remote_Path; BYTE m_bRemoteDriveList[1024]; CString GetParentDirectory(CString strPath); diff --git a/server/2015Remote/FileTransferModeDlg.cpp b/server/2015Remote/FileTransferModeDlg.cpp index fad442f..87ee771 100644 --- a/server/2015Remote/FileTransferModeDlg.cpp +++ b/server/2015Remote/FileTransferModeDlg.cpp @@ -16,7 +16,7 @@ static char THIS_FILE[] = __FILE__; CFileTransferModeDlg::CFileTransferModeDlg(CWnd* pParent /*=NULL*/) - : CDialog(CFileTransferModeDlg::IDD, pParent) + : CDialogLang(CFileTransferModeDlg::IDD, pParent) { //{{AFX_DATA_INIT(CFileTransferModeDlg) // NOTE: the ClassWizard will add member initialization here @@ -26,7 +26,7 @@ CFileTransferModeDlg::CFileTransferModeDlg(CWnd* pParent /*=NULL*/) void CFileTransferModeDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); //{{AFX_DATA_MAP(CFileTransferModeDlg) // NOTE: the ClassWizard will add DDX and DDV calls here //}}AFX_DATA_MAP @@ -51,11 +51,11 @@ void CFileTransferModeDlg::OnEndDialog(UINT id) BOOL CFileTransferModeDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); // TODO: Add extra initialization here CString str; - str.Format("此文件夹已包含一个名为“%s”的文件", m_strFileName); + str.FormatL("此文件夹已包含一个名为“%s”的文件", m_strFileName); for (int i = 0; i < str.GetLength(); i += 120) { str.Insert(i, "\n"); diff --git a/server/2015Remote/FileTransferModeDlg.h b/server/2015Remote/FileTransferModeDlg.h index de115ed..e39b71c 100644 --- a/server/2015Remote/FileTransferModeDlg.h +++ b/server/2015Remote/FileTransferModeDlg.h @@ -6,11 +6,12 @@ #endif // _MSC_VER > 1000 // FileTransferModeDlg.h : header file // +#include "LangManager.h" ///////////////////////////////////////////////////////////////////////////// // CFileTransferModeDlg dialog - class CFileTransferModeDlg : public CDialog + class CFileTransferModeDlg : public CDialogLang { // Construction public: diff --git a/server/2015Remote/HideScreenSpyDlg.cpp b/server/2015Remote/HideScreenSpyDlg.cpp index 126cd03..17c58b8 100644 --- a/server/2015Remote/HideScreenSpyDlg.cpp +++ b/server/2015Remote/HideScreenSpyDlg.cpp @@ -80,7 +80,7 @@ CHideScreenSpyDlg::~CHideScreenSpyDlg() void CHideScreenSpyDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } @@ -155,9 +155,9 @@ bool CHideScreenSpyDlg::SaveSnapshot() BOOL CHideScreenSpyDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); CString strString; - strString.Format("%s - 远程虚拟屏幕 %d×%d", m_IPAddress, + strString.FormatL("%s - 远程虚拟屏幕 %d×%d", m_IPAddress, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight); SetWindowText(strString); @@ -168,47 +168,47 @@ BOOL CHideScreenSpyDlg::OnInitDialog() SetClassLongPtr(m_hWnd, GCLP_HCURSOR, (LONG_PTR)LoadCursor(NULL, IDC_NO)); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_SET_FLUSH, _T("刷新(&F)")); - pSysMenu->AppendMenu(MF_STRING, IDM_CONTROL, _T("控制屏幕(&Y)")); - pSysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, _T("保存快照(&S)")); - pSysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI_S, _T("录像(MJPEG)")); - pSysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI_H264, _T("录像(H264)")); - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_GET_CLIPBOARD, _T("获取剪贴板(&R)")); - pSysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, _T("设置剪贴板(&L)")); - pSysMenu->AppendMenu(MF_STRING, IDM_SETSCERRN, _T("修复分辨率(&G)")); - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_QUALITY60, _T("清晰度低60/100")); - pSysMenu->AppendMenu(MF_STRING, IDM_QUALITY85, _T("清晰度中85/100")); - pSysMenu->AppendMenu(MF_STRING, IDM_QUALITY100, _T("清晰度高100/100")); - pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_SET_FLUSH, _T("刷新(&F)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_CONTROL, _T("控制屏幕(&Y)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_SAVEDIB, _T("保存快照(&S)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_SAVEAVI_S, _T("录像(MJPEG)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_SAVEAVI_H264, _T("录像(H264)")); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_GET_CLIPBOARD, _T("获取剪贴板(&R)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_SET_CLIPBOARD, _T("设置剪贴板(&L)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_SETSCERRN, _T("修复分辨率(&G)")); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_QUALITY60, _T("清晰度低60/100")); + pSysMenu->AppendMenuL(MF_STRING, IDM_QUALITY85, _T("清晰度中85/100")); + pSysMenu->AppendMenuL(MF_STRING, IDM_QUALITY100, _T("清晰度高100/100")); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); /* - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_1, _T("FPS-1")); - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_5, _T("FPS-5")); - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_10, _T("FPS-10")); - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_15, _T("FPS-15")); - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_20, _T("FPS-20")); - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_25, _T("FPS-25")); - pSysMenu->AppendMenu(MF_STRING, IDM_FPS_30, _T("FPS-30")); - pSysMenu->AppendMenu(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_1, _T("FPS-1")); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_5, _T("FPS-5")); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_10, _T("FPS-10")); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_15, _T("FPS-15")); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_20, _T("FPS-20")); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_25, _T("FPS-25")); + pSysMenu->AppendMenuL(MF_STRING, IDM_FPS_30, _T("FPS-30")); + pSysMenu->AppendMenuL(MF_SEPARATOR); */ - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Explorer, _T("打开-文件管理(&B)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_run, _T("打开-运行(&H)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Powershell, _T("打开-Powershell(&N)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Explorer, _T("打开-文件管理(&B)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_run, _T("打开-运行(&H)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Powershell, _T("打开-Powershell(&N)")); /* - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Chrome, _T("打开-Chrome(&I)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Edge, _T("打开-Edge(&M)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Brave, _T("打开-Brave(&D)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Firefox, _T("打开-Firefox(&V)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_Iexplore, _T("打开-Iexplore(&Z)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Chrome, _T("打开-Chrome(&I)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Edge, _T("打开-Edge(&M)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Brave, _T("打开-Brave(&D)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Firefox, _T("打开-Firefox(&V)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_Iexplore, _T("打开-Iexplore(&Z)")); */ - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_zdy, _T("自定义CMD命令(&y)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_zdy2, _T("高级自定义命令(&O)")); - pSysMenu->AppendMenu(MF_STRING, IDM_OPEN_close, _T("清理后台(&J)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_zdy, _T("自定义CMD命令(&y)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_zdy2, _T("高级自定义命令(&O)")); + pSysMenu->AppendMenuL(MF_STRING, IDM_OPEN_close, _T("清理后台(&J)")); pSysMenu->CheckMenuRadioItem(IDM_QUALITY60, IDM_QUALITY100, IDM_QUALITY85, MF_BYCOMMAND); } @@ -407,7 +407,7 @@ void CHideScreenSpyDlg::DrawNextScreenDiff(PBYTE pDeCompressionData, unsigned lo void CHideScreenSpyDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (!IsWindowVisible()) @@ -467,8 +467,8 @@ void CHideScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) FCCHandler handler = nID == IDM_SAVEAVI_S ? ENCODER_MJPEG : ENCODER_H264; int code; if (code = m_aviStream.Open(m_aviFile, m_BitmapInfor_Full, rate, handler)) { - MessageBox(CString("Create Video(*.avi) Failed:\n") + m_aviFile + "\r\n错误代码: " + - CBmpToAvi::GetErrMsg(code).c_str(), "提示"); + MessageBoxL(CString("Create Video(*.avi) Failed:\n") + m_aviFile + "\r\n错误代码: " + + CBmpToAvi::GetErrMsg(code).c_str(), "提示", MB_ICONINFORMATION); m_aviFile = _T(""); } else { ::SetTimer(m_hWnd, TIMER_ID, duration, NULL); @@ -677,7 +677,7 @@ void CHideScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) } break; default: - CDialog::OnSysCommand(nID, lParam); + __super::OnSysCommand(nID, lParam); } } @@ -700,7 +700,7 @@ void CHideScreenSpyDlg::DrawTipString(CString str) BOOL CHideScreenSpyDlg::PreTranslateMessage(MSG* pMsg) { if (m_bIsClosed) - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); switch (pMsg->message) { case WM_ERASEBKGND: return TRUE; @@ -739,7 +739,7 @@ BOOL CHideScreenSpyDlg::PreTranslateMessage(MSG* pMsg) if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_ESCAPE || pMsg->wParam == VK_RETURN)) return TRUE; - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CHideScreenSpyDlg::SendScaledMouseMessage(MSG* pMsg, bool makeLP) @@ -829,7 +829,7 @@ void CHideScreenSpyDlg::DoPaint() } if (m_bIsClosed) return; StretchBlt(m_hFullDC, 0, 0, m_CRect.Width(), m_CRect.Height(), m_hFullMemDC, 0, 0, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight, SRCCOPY); - // Do not call CDialog::OnPaint() for painting messages + // Do not call __super::OnPaint() for painting messages } void CHideScreenSpyDlg::OnPaint() @@ -842,7 +842,7 @@ void CHideScreenSpyDlg::OnPaint() } if (m_bIsClosed) return; StretchBlt(m_hFullDC, 0, 0, m_CRect.Width(), m_CRect.Height(), m_hFullMemDC, 0, 0, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight, SRCCOPY); - CDialog::OnPaint(); + __super::OnPaint(); } LRESULT CHideScreenSpyDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) @@ -860,7 +860,7 @@ LRESULT CHideScreenSpyDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam return TRUE; } - return CDialog::WindowProc(message, wParam, lParam); + return __super::WindowProc(message, wParam, lParam); } void CHideScreenSpyDlg::OnTimer(UINT_PTR nIDEvent) @@ -874,7 +874,7 @@ void CHideScreenSpyDlg::OnTimer(UINT_PTR nIDEvent) SetTextColor(m_hFullDC, RGB(0xff, 0x00, 0x00)); TextOut(m_hFullDC, 0, 0, lpTipsString, lstrlen(lpTipsString)); } - CDialog::OnTimer(nIDEvent); + __super::OnTimer(nIDEvent); } bool CHideScreenSpyDlg::JPG_BMP(int cbit, void* input, int inlen, void* output) diff --git a/server/2015Remote/IOCPServer.cpp b/server/2015Remote/IOCPServer.cpp index b769e6c..2ccde24 100644 --- a/server/2015Remote/IOCPServer.cpp +++ b/server/2015Remote/IOCPServer.cpp @@ -32,8 +32,9 @@ std::string GetRemoteIP(SOCKET sock) return buf; } -IOCPServer::IOCPServer(void) +IOCPServer::IOCPServer(HWND hWnd) { + m_hMainWnd = hWnd; WSADATA wsaData; if (WSAStartup(MAKEWORD(2,2), &wsaData)!=0) { return; @@ -761,6 +762,18 @@ PCONTEXT_OBJECT IOCPServer::AllocateContext(SOCKET s) CLock cs(m_cs); if (m_ContextConnectionList.GetCount() >= m_ulMaxConnections) { + static uint64_t notifyTime = 0; + auto now = time(0); + if (now - notifyTime > 15) { + notifyTime = now; + Mprintf("!!! AllocateContext: 达到最大连接数 %lu,拒绝新连接\n", m_ulMaxConnections); + if (m_hMainWnd) { + char tip[256]; + sprintf_s(tip, _TRF("达到最大连接数限制: %lu, 请释放连接"), m_ulMaxConnections); + PostMessageA(m_hMainWnd, WM_SHOWNOTIFY, (WPARAM)new CharMsg(_TR("达到最大连接数")), + (LPARAM)new CharMsg(tip)); + } + } return NULL; } diff --git a/server/2015Remote/IOCPServer.h b/server/2015Remote/IOCPServer.h index 2aa4695..80f5857 100644 --- a/server/2015Remote/IOCPServer.h +++ b/server/2015Remote/IOCPServer.h @@ -5,6 +5,7 @@ #pragma comment(lib,"ws2_32.lib") #include "Server.h" #include +#include "LangManager.h" #define NC_CLIENT_CONNECT 0x0001 #define NC_RECEIVE 0x0004 @@ -55,6 +56,7 @@ protected: CRITICAL_SECTION m_cs; ContextObjectList m_ContextConnectionList; ContextObjectList m_ContextFreePoolList; + HWND m_hMainWnd = nullptr; private: static DWORD WINAPI ListenThreadProc(LPVOID lParam); @@ -81,7 +83,7 @@ private: } public: - IOCPServer(void); + IOCPServer(HWND hWnd = nullptr); ~IOCPServer(void); int GetPort() const override { @@ -111,7 +113,7 @@ typedef CONTEXT_OBJECT ClientContext; #define m_DeCompressionBuffer InDeCompressedBuffer // 所有动态创建的对话框的基类 -class CDialogBase : public CDialog +class CDialogBase : public CDialogLang { public: CONTEXT_OBJECT* m_ContextObject; @@ -126,7 +128,7 @@ public: m_bIsClosed(false), m_bIsProcessing(false), m_ContextObject(pContext), m_iocpServer(pIOCPServer), - CDialog(nIDTemplate, pParent) + CDialogLang(nIDTemplate, pParent) { m_bConnected = TRUE; m_nDisconnectTime = 0; @@ -174,7 +176,7 @@ public: Sleep(200); if(m_hIcon) DestroyIcon(m_hIcon); m_hIcon = NULL; - CDialog::OnClose(); + __super::OnClose(); if (GetSafeHwnd()) DestroyWindow(); diff --git a/server/2015Remote/InputDlg.cpp b/server/2015Remote/InputDlg.cpp index bf5fa4d..ad4d08f 100644 --- a/server/2015Remote/InputDlg.cpp +++ b/server/2015Remote/InputDlg.cpp @@ -11,7 +11,7 @@ IMPLEMENT_DYNAMIC(CInputDialog, CDialogEx) CInputDialog::CInputDialog(CWnd* pParent /*=nullptr*/) - : CDialogEx(IDD_DIALOG_INPUT, pParent) + : CDialogLangEx(IDD_DIALOG_INPUT, pParent) , m_sSecondInput(_T("")) , m_sTipInfo(_T("")) { @@ -24,7 +24,7 @@ CInputDialog::~CInputDialog() void CInputDialog::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_STATIC_SECOND, m_Static2thInput); DDX_Control(pDX, IDC_EDIT_SECOND, m_Edit2thInput); DDX_Text(pDX, IDC_EDIT_SECOND, m_sSecondInput); @@ -57,7 +57,7 @@ void CInputDialog::Init2(LPCTSTR name, LPCTSTR defaultValue) BOOL CInputDialog::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, FALSE); @@ -81,5 +81,5 @@ void CInputDialog::OnBnClickedOk() { GetDlgItem(IDC_EDIT_FOLDERNAME)->GetWindowText(m_str); - CDialogEx::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/InputDlg.h b/server/2015Remote/InputDlg.h index 645470c..e4d1151 100644 --- a/server/2015Remote/InputDlg.h +++ b/server/2015Remote/InputDlg.h @@ -1,10 +1,11 @@ #pragma once #include "resource.h" +#include "LangManager.h" // CInputDialog 对话框 -class CInputDialog : public CDialogEx +class CInputDialog : public CDialogLangEx { DECLARE_DYNAMIC(CInputDialog) diff --git a/server/2015Remote/KeyBoardDlg.cpp b/server/2015Remote/KeyBoardDlg.cpp index 9389139..466d55f 100644 --- a/server/2015Remote/KeyBoardDlg.cpp +++ b/server/2015Remote/KeyBoardDlg.cpp @@ -28,7 +28,7 @@ CKeyBoardDlg::CKeyBoardDlg(CWnd* pParent, Server* pIOCPServer, ClientContext *pC void CKeyBoardDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); //{{AFX_DATA_MAP(CKeyBoardDlg) DDX_Control(pDX, IDC_EDIT, m_edit); //}}AFX_DATA_MAP @@ -49,13 +49,12 @@ END_MESSAGE_MAP() void CKeyBoardDlg::PostNcDestroy() { // TODO: Add your specialized code here and/or call the base class - delete this; - CDialog::PostNcDestroy(); + __super::PostNcDestroy(); } BOOL CKeyBoardDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); // TODO: Add extra initialization here SetIcon(m_hIcon, TRUE); // Set big icon @@ -64,10 +63,10 @@ BOOL CKeyBoardDlg::OnInitDialog() CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { //pSysMenu->DeleteMenu(SC_TASKLIST, MF_BYCOMMAND); - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_ENABLE_OFFLINE, "离线记录(&O)"); - pSysMenu->AppendMenu(MF_STRING, IDM_CLEAR_RECORD, "清空记录(&C)"); - pSysMenu->AppendMenu(MF_STRING, IDM_SAVE_RECORD, "保存记录(&S)"); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_ENABLE_OFFLINE, "离线记录(&O)"); + pSysMenu->AppendMenuL(MF_STRING, IDM_CLEAR_RECORD, "清空记录(&C)"); + pSysMenu->AppendMenuL(MF_STRING, IDM_SAVE_RECORD, "保存记录(&S)"); if (m_bIsOfflineRecord) pSysMenu->CheckMenuItem(IDM_ENABLE_OFFLINE, MF_CHECKED); } @@ -88,7 +87,7 @@ BOOL CKeyBoardDlg::OnInitDialog() void CKeyBoardDlg::UpdateTitle() { CString str; - str.Format(_T("%s - 键盘记录"), m_IPAddress); + str.FormatL(_T("%s - 键盘记录"), m_IPAddress); if (m_bIsOfflineRecord) str += " (离线记录已开启)"; else @@ -118,14 +117,14 @@ void CKeyBoardDlg::AddKeyBoardData() bool CKeyBoardDlg::SaveRecord() { - CString strFileName = m_IPAddress + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.txt"); + CString strFileName = m_IPAddress + CTime::GetCurrentTime().FormatL("_%Y-%m-%d_%H-%M-%S.txt"); CFileDialog dlg(FALSE, "txt", strFileName, OFN_OVERWRITEPROMPT, "文本文档(*.txt)|*.txt|", this); if(dlg.DoModal () != IDOK) return false; CFile file; if (!file.Open( dlg.GetPathName(), CFile::modeWrite | CFile::modeCreate)) { - MessageBox("文件保存失败:"+dlg.GetPathName(), "提示"); + MessageBoxL("文件保存失败:"+dlg.GetPathName(), "提示", MB_ICONINFORMATION); return false; } // Write the DIB header and the bits @@ -159,7 +158,7 @@ void CKeyBoardDlg::OnSysCommand(UINT nID, LPARAM lParam) } else if (nID == IDM_SAVE_RECORD) { SaveRecord(); } else { - CDialog::OnSysCommand(nID, lParam); + __super::OnSysCommand(nID, lParam); } } @@ -176,7 +175,7 @@ void CKeyBoardDlg::ResizeEdit() } void CKeyBoardDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (IsWindowVisible()) @@ -190,7 +189,7 @@ BOOL CKeyBoardDlg::PreTranslateMessage(MSG* pMsg) if (pMsg->message == WM_KEYDOWN && (pMsg->wParam == VK_RETURN || pMsg->wParam == VK_ESCAPE)) { return true; } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CKeyBoardDlg::OnClose() diff --git a/server/2015Remote/LangManager.h b/server/2015Remote/LangManager.h new file mode 100644 index 0000000..d216d5a --- /dev/null +++ b/server/2015Remote/LangManager.h @@ -0,0 +1,684 @@ +#pragma once + +#include +#include +#include +#include + +// 语言管理类 - 支持多语言切换 +class CLangManager +{ +private: + std::map m_strings; // 中文 -> 目标语言 + CString m_currentLang; // 当前语言代码 + CString m_langDir; // 语言文件目录 + + CLangManager() {} + CLangManager(const CLangManager&) = delete; + CLangManager& operator=(const CLangManager&) = delete; + +public: + static CLangManager& Instance() + { + static CLangManager instance; + return instance; + } + + // 初始化语言目录 + void Init(const CString& langDir = _T("")) + { + if (langDir.IsEmpty()) { + // 默认使用 exe 所在目录下的 lang 文件夹 + TCHAR path[MAX_PATH]; + GetModuleFileName(NULL, path, MAX_PATH); + CString exePath(path); + int pos = exePath.ReverseFind(_T('\\')); + if (pos > 0) { + m_langDir = exePath.Left(pos) + _T("\\lang"); + } + } else { + m_langDir = langDir; + } + + // 确保目录存在 + CreateDirectory(m_langDir, NULL); + } + + // 获取可用的语言列表 + std::vector GetAvailableLanguages() + { + std::vector langs; + CString searchPath = m_langDir + _T("\\*.ini"); + + WIN32_FIND_DATA fd; + HANDLE hFind = FindFirstFile(searchPath, &fd); + if (hFind != INVALID_HANDLE_VALUE) { + do { + CString filename(fd.cFileName); + int dotPos = filename.ReverseFind(_T('.')); + if (dotPos > 0) { + langs.push_back(filename.Left(dotPos)); + } + } while (FindNextFile(hFind, &fd)); + FindClose(hFind); + } + return langs; + } + + // 检查语言文件编码是否为 ANSI + // 返回 false 表示文件不存在或编码不是 ANSI(检测 BOM 和 UTF-8 无 BOM) + bool CheckEncoding(const CString& langCode) + { + if (langCode == _T("zh_CN") || langCode.IsEmpty()) { + TRACE("[LangEnc] zh_CN or empty, skip check\n"); + return true; + } + + CString langFile = m_langDir + _T("\\") + langCode + _T(".ini"); + TRACE("[LangEnc] Checking: %s\n", (LPCSTR)langFile); + + FILE* f = nullptr; + if (fopen_s(&f, (LPCSTR)langFile, "rb") != 0 || !f) { + TRACE("[LangEnc] fopen failed\n"); + return false; + } + + // 读取文件内容(最多检测前 4KB 即可判断) + unsigned char buf[4096]; + size_t n = fread(buf, 1, sizeof(buf), f); + fclose(f); + TRACE("[LangEnc] Read %zu bytes\n", n); + + if (n == 0) return false; + + // 检测 BOM + if (n >= 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF) { + TRACE("[LangEnc] Detected UTF-8 BOM\n"); + return false; + } + if (n >= 2 && buf[0] == 0xFF && buf[1] == 0xFE) { + TRACE("[LangEnc] Detected UTF-16 LE BOM\n"); + return false; + } + if (n >= 2 && buf[0] == 0xFE && buf[1] == 0xFF) { + TRACE("[LangEnc] Detected UTF-16 BE BOM\n"); + return false; + } + + // 检测 UTF-8 无 BOM:扫描是否存在合法的 UTF-8 多字节序列 + // 中文 UTF-8 为 3 字节 (E0-EF + 80-BF + 80-BF) + // GBK 为 2 字节 (81-FE + 40-FE),字节模式不同 + int utf8SeqCount = 0; + for (size_t i = 0; i < n; ) { + unsigned char c = buf[i]; + if (c < 0x80) { + i++; + } else if ((c & 0xE0) == 0xC0 && i + 1 < n + && (buf[i+1] & 0xC0) == 0x80) { + utf8SeqCount++; // 2 字节 UTF-8 + i += 2; + } else if ((c & 0xF0) == 0xE0 && i + 2 < n + && (buf[i+1] & 0xC0) == 0x80 + && (buf[i+2] & 0xC0) == 0x80) { + utf8SeqCount++; // 3 字节 UTF-8(中文) + i += 3; + } else if ((c & 0xF8) == 0xF0 && i + 3 < n + && (buf[i+1] & 0xC0) == 0x80 + && (buf[i+2] & 0xC0) == 0x80 + && (buf[i+3] & 0xC0) == 0x80) { + utf8SeqCount++; // 4 字节 UTF-8 + i += 4; + } else { + // 高字节不符合 UTF-8 规则 + // 但如果在缓冲区末尾,可能是多字节序列被截断,不应误判 + if (i + 3 >= n && c >= 0xC0) { + TRACE("[LangEnc] Truncated at offset %zu: 0x%02X, skip\n", i, c); + break; // 缓冲区尾部截断,跳出循环按已有结果判断 + } + // 确实是 ANSI/GBK + TRACE("[LangEnc] GBK byte at offset %zu: 0x%02X → ANSI\n", i, c); + return true; + } + } + + TRACE("[LangEnc] utf8SeqCount=%d → %s\n", utf8SeqCount, + utf8SeqCount > 0 ? "UTF-8 (not ANSI)" : "pure ASCII (ANSI)"); + // 存在多字节序列且全部符合 UTF-8 规则 → 判定为 UTF-8 + return (utf8SeqCount == 0); + } + + // 加载语言文件 + bool Load(const CString& langCode) + { + m_strings.clear(); + m_currentLang = langCode; + + // 如果是中文,不需要加载翻译 + if (langCode == _T("zh_CN") || langCode.IsEmpty()) { + return true; + } + + CString langFile = m_langDir + _T("\\") + langCode + _T(".ini"); + + // 检查文件是否存在 + if (GetFileAttributes(langFile) == INVALID_FILE_ATTRIBUTES) { + return false; + } + + // 读取 [Strings] 节的所有键值对 + TCHAR buffer[32768] = { 0 }; // 用于获取所有键名 + GetPrivateProfileSection(_T("Strings"), buffer, sizeof(buffer)/sizeof(TCHAR), langFile); + + // 解析键值对 (格式: key=value\0key=value\0\0) + TCHAR* p = buffer; + while (*p) { + CString line(p); + int eqPos = line.Find(_T('=')); + if (eqPos > 0) { + CString key = line.Left(eqPos); + CString value = line.Mid(eqPos + 1); + m_strings[key] = value; + } + p += _tcslen(p) + 1; + } + + return true; + } + + // 获取翻译字符串 + // key: 中文原文 + // 返回: 翻译后的文本,如果没有翻译则返回原文 + CString Get(const CString& key) + { + if (m_currentLang == _T("zh_CN") || m_currentLang.IsEmpty()) { + return key; // 中文直接返回 + } + + auto it = m_strings.find(key); + if (it != m_strings.end()) { + return it->second; + } + return key; // 没有翻译则返回原文 + } + + // 获取翻译字符串 (std::string 版本) + std::string Get(const std::string& key) + { + CString result = Get(CString(key.c_str())); + CT2A ansi(result); + return std::string(ansi); + } + + // 获取当前语言 + CString GetCurrentLanguage() const + { + return m_currentLang; + } + + // 是否为中文模式(无需翻译) + bool IsChinese() const + { + return m_currentLang.IsEmpty() || m_currentLang == _T("zh_CN"); + } + + // 获取可用语言数量(包括内置的简体中文) + // 返回 1 表示只有简体中文,无其他语言文件 + size_t GetLanguageCount() + { + auto langs = GetAvailableLanguages(); + // 检查是否有 zh_CN.ini 文件 + bool hasZhCN = false; + for (const auto& lang : langs) { + if (lang == _T("zh_CN")) { + hasZhCN = true; + break; + } + } + // 简体中文始终存在,若 zh_CN.ini 不存在则额外 +1 + return hasZhCN ? langs.size() : langs.size() + 1; + } +}; + +// 全局访问宏 +#define g_Lang CLangManager::Instance() + +// 翻译宏 - 用于代码中的字符串字面量 +// 用法: _TR("中文字符串") +#define _TR(str) g_Lang.Get(CString(_T(str))) + +// 翻译宏 - 用于格式化函数 (sprintf_s, _stprintf_s 等可变参数函数) +// 用法: _stprintf_s(buf, _TRF("连接 %s 失败"), ip); +#define _TRF(str) ((LPCTSTR)_TR(str)) + +// 翻译函数 - 用于 CString 变量或 LPCTSTR +// 用法: _L(strVar) 或 _L(_T("中文")) +inline CString _L(const CString& str) { return g_Lang.Get(str); } +inline CString _L(LPCTSTR str) { return g_Lang.Get(CString(str)); } + +// 翻译宏 - 用于格式化函数中的变量 (返回 LPCTSTR) +// 用法: _stprintf_s(buf, _LF(strVar), arg); +// 注意: 必须是宏,函数版本会导致悬空指针 +#define _LF(str) ((LPCTSTR)_L(str)) + +// CString::Format 的多语言版本 (用于全局替换 .FormatL) +// 用法: str.FormatLL("连接 %s 失败", ip); +// 展开: str.FormatL(_TR("连接 %s 失败"), ip); +// 注意: 不需要翻译的字符串也可以用,找不到翻译会返回原文 +#define FormatL(fmt, ...) Format(_TR(fmt), __VA_ARGS__) + +// ============================================ +// 带自动翻译的 MFC 函数宏 (L 后缀 = Language) +// ============================================ + +// MessageBox 系列 +// MFC 成员函数版本 (CWnd::MessageBox) +#define MessageBoxL(text, caption, type) \ + MessageBox(_TR(text), _TR(caption), type) + +// 全局 API 版本 (::MessageBox / ::MessageBoxA / ::MessageBoxW) +#define MessageBoxAPI_L(hwnd, text, caption, type) \ + ::MessageBox(hwnd, _TR(text), _TR(caption), type) + +// 简写:hwnd 为 NULL 时 +#define MsgBoxL(text, caption, type) \ + ::MessageBox(NULL, _TR(text), _TR(caption), type) + +#define AfxMessageBoxL(text, type) \ + AfxMessageBox(_TR(text), type) + +// SetWindowText / SetDlgItemText +#define SetWindowTextL(text) \ + SetWindowText(_TR(text)) + +#define SetDlgItemTextL(id, text) \ + SetDlgItemText(id, _TR(text)) + +// 列表控件 +#define InsertColumnL(index, text, format, width) \ + InsertColumn(index, _TR(text), format, width) + +#define InsertItemL(index, text) \ + InsertItem(index, _TR(text)) + +#define SetItemTextL(item, subitem, text) \ + SetItemText(item, subitem, _TR(text)) + +// ComboBox / ListBox +#define AddStringL(text) \ + AddString(_TR(text)) + +#define InsertStringL(index, text) \ + InsertString(index, _TR(text)) + +// Tab 控件 +#define InsertTabItemL(index, text) \ + InsertItem(index, _TR(text)) + +// 状态栏 +#define SetPaneTextL(index, text) \ + SetPaneText(index, _TR(text)) + +// 菜单 +#define AppendMenuL(flags, id, text) \ + AppendMenu(flags, id, _TR(text)) + +#define AppendMenuSeparator(p) \ + AppendMenu(p) + +#define InsertMenuL(pos, flags, id, text) \ + InsertMenu(pos, flags, id, _TR(text)) + +#define ModifyMenuL(pos, flags, id, text) \ + ModifyMenu(pos, flags, id, _TR(text)) + +// 翻译对话框所有控件 +inline void TranslateDialog(CWnd* pWnd) +{ + if (g_Lang.IsChinese()) { + return; // 中文模式不需要翻译 + } + + if (!pWnd || !pWnd->GetSafeHwnd()) { + return; + } + + // 翻译对话框标题 + CString title; + pWnd->GetWindowText(title); + if (!title.IsEmpty()) { + CString newTitle = g_Lang.Get(title); + if (newTitle != title) { + pWnd->SetWindowText(newTitle); + } + } + + // 遍历所有子控件 + CWnd* pChild = pWnd->GetWindow(GW_CHILD); + while (pChild) { + // 获取控件文本 + CString text; + pChild->GetWindowText(text); + + if (!text.IsEmpty()) { + CString newText = g_Lang.Get(text); + if (newText != text) { + pChild->SetWindowText(newText); + } + } + + // 如果是菜单按钮或有子菜单,也需要处理 + // 递归处理子窗口(如 GroupBox 内的控件) + if (pChild->GetWindow(GW_CHILD)) { + TranslateDialog(pChild); + } + + pChild = pChild->GetNextWindow(); + } +} + +// 翻译菜单 +inline void TranslateMenu(CMenu* pMenu) +{ + if (!pMenu || !pMenu->GetSafeHmenu() || g_Lang.IsChinese()) { + return; + } + + UINT count = pMenu->GetMenuItemCount(); + for (UINT i = 0; i < count; i++) { + CString text; + pMenu->GetMenuString(i, text, MF_BYPOSITION); + if (!text.IsEmpty()) { + CString newText = g_Lang.Get(text); + if (newText != text) { + // 保留快捷键部分 (Tab 后的内容,如 Ctrl+S) + int tabPos = text.Find(_T('\t')); + if (tabPos > 0) { + CString shortcut = text.Mid(tabPos); + int newTabPos = newText.Find(_T('\t')); + if (newTabPos < 0) { + newText += shortcut; + } + } + + // 检查是否是弹出菜单(有子菜单) + CMenu* pSubMenu = pMenu->GetSubMenu(i); + if (pSubMenu) { + // 弹出菜单使用 MF_POPUP + pMenu->ModifyMenu(i, MF_BYPOSITION | MF_POPUP | MF_STRING, + (UINT_PTR)pSubMenu->GetSafeHmenu(), newText); + } else { + // 普通菜单项 + pMenu->ModifyMenu(i, MF_BYPOSITION | MF_STRING, + pMenu->GetMenuItemID(i), newText); + } + } + } + + // 递归处理子菜单 + CMenu* pSubMenu = pMenu->GetSubMenu(i); + if (pSubMenu) { + TranslateMenu(pSubMenu); + } + } +} + +// 加载菜单并翻译 (用于 LoadMenu 动态加载菜单后自动翻译) +inline BOOL LoadMenuL(CMenu& menu, UINT nIDResource) +{ + if (!menu.LoadMenu(nIDResource)) return FALSE; + TranslateMenu(&menu); + return TRUE; +} + +inline BOOL LoadMenuL(CMenu* pMenu, UINT nIDResource) +{ + if (!pMenu || !pMenu->LoadMenu(nIDResource)) return FALSE; + TranslateMenu(pMenu); + return TRUE; +} + +// 翻译列表控件表头 +inline void TranslateListHeader(CListCtrl* pList) +{ + if (!pList || g_Lang.IsChinese()) { + return; + } + + CHeaderCtrl* pHeader = pList->GetHeaderCtrl(); + if (!pHeader) { + return; + } + + int count = pHeader->GetItemCount(); + for (int i = 0; i < count; i++) { + HDITEM hdi; + TCHAR text[256] = { 0 }; + hdi.mask = HDI_TEXT; + hdi.pszText = text; + hdi.cchTextMax = 256; + + if (pHeader->GetItem(i, &hdi)) { + CString newText = g_Lang.Get(CString(text)); + if (newText != text) { + hdi.pszText = (LPTSTR)(LPCTSTR)newText; + pHeader->SetItem(i, &hdi); + } + } + } +} + +// 支持多语言的对话框基类 (基于 CDialog) +// 用法: 将 class CMyDlg : public CDialog 改为 class CMyDlg : public CDialogLang +class CDialogLang : public CDialog +{ +public: + CDialogLang(){} + + CDialogLang(UINT nIDTemplate, CWnd* pParent = NULL) + : CDialog(nIDTemplate, pParent) {} + + CDialogLang(LPCTSTR lpszTemplateName, CWnd* pParent = NULL) + : CDialog(lpszTemplateName, pParent) {} + +protected: + virtual BOOL OnInitDialog() override + { + BOOL ret = __super::OnInitDialog(); + TranslateDialog(this); + TranslateMenu(GetMenu()); // 自动翻译菜单 + return ret; + } +}; + +// 支持多语言的对话框基类 (基于 CDialogEx) +// 用法: 将 class CMyDlg : public CDialogEx 改为 class CMyDlg : public CDialogLangEx +class CDialogLangEx : public CDialogEx +{ +public: + CDialogLangEx(UINT nIDTemplate, CWnd* pParent = NULL) + : CDialogEx(nIDTemplate, pParent) {} + + CDialogLangEx(LPCTSTR lpszTemplateName, CWnd* pParent = NULL) + : CDialogEx(lpszTemplateName, pParent) {} + +protected: + virtual BOOL OnInitDialog() override + { + BOOL ret = __super::OnInitDialog(); + TranslateDialog(this); + TranslateMenu(GetMenu()); // 自动翻译菜单 + return ret; + } +}; + +// ============================================ +// 语言选择对话框(动态创建,无需 RC 资源) +// ============================================ +class CLangSelectDlg : public CDialog +{ +public: + CString m_strSelectedLang; + CComboBox m_comboLang; + + CLangSelectDlg(CWnd* pParent = NULL) : CDialog(), m_pParent(pParent) {} + + virtual INT_PTR DoModal() override + { + InitModalIndirect(CreateDialogTemplate(), m_pParent); + return CDialog::DoModal(); + } + + // 静态方法:显示对话框并返回选择的语言代码 + // 返回空字符串表示用户取消 + static CString Show(CWnd* pParent = NULL) + { + CLangSelectDlg dlg(pParent); + if (dlg.DoModal() == IDOK) { + return dlg.m_strSelectedLang; + } + return _T(""); + } + +protected: + CWnd* m_pParent; + std::vector m_templateBuffer; + std::vector m_langCodes; + + // 语言代码到显示名称的映射 + static CString GetLanguageDisplayName(const CString& langCode) + { + if (langCode == _T("zh_CN")) return _T("简体中文"); + if (langCode == _T("zh_TW")) return _T("繁體中文"); + if (langCode == _T("en_US")) return _T("English"); + return langCode; + } + + LPCDLGTEMPLATE CreateDialogTemplate() + { + const WORD DLG_WIDTH = 200; + const WORD DLG_HEIGHT = 75; + + m_templateBuffer.clear(); + + DLGTEMPLATE dlgTemplate = { 0 }; + dlgTemplate.style = DS_MODALFRAME | DS_CENTER | WS_POPUP | WS_CAPTION | WS_SYSMENU; + dlgTemplate.cdit = 4; + dlgTemplate.cx = DLG_WIDTH; + dlgTemplate.cy = DLG_HEIGHT; + + AppendData(&dlgTemplate, sizeof(DLGTEMPLATE)); + AppendWord(0); // 菜单 + AppendWord(0); // 窗口类 + AppendString(_T("选择语言 / Select Language")); + AlignToDword(); + + // 静态文本 + AddControl(0x0082, 15, 15, 40, 12, (WORD)-1, + SS_LEFT | WS_CHILD | WS_VISIBLE, _T("语言:")); + + // ComboBox + AddControl(0x0085, 55, 13, 130, 150, 1001, + CBS_DROPDOWNLIST | WS_CHILD | WS_VISIBLE | WS_TABSTOP | WS_VSCROLL, _T("")); + + // 确定按钮 + AddControl(0x0080, 45, 50, 50, 14, IDOK, + BS_DEFPUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, _T("确定")); + + // 取消按钮 + AddControl(0x0080, 105, 50, 50, 14, IDCANCEL, + BS_PUSHBUTTON | WS_CHILD | WS_VISIBLE | WS_TABSTOP, _T("取消")); + + return (LPCDLGTEMPLATE)m_templateBuffer.data(); + } + + void AppendData(const void* data, size_t size) + { + const BYTE* p = (const BYTE*)data; + m_templateBuffer.insert(m_templateBuffer.end(), p, p + size); + } + + void AppendWord(WORD w) { AppendData(&w, sizeof(WORD)); } + + void AppendString(LPCTSTR str) + { +#ifdef UNICODE + AppendData(str, (_tcslen(str) + 1) * sizeof(WCHAR)); +#else + int len = MultiByteToWideChar(CP_ACP, 0, str, -1, NULL, 0); + std::vector wstr(len); + MultiByteToWideChar(CP_ACP, 0, str, -1, wstr.data(), len); + AppendData(wstr.data(), len * sizeof(WCHAR)); +#endif + } + + void AlignToDword() + { + while (m_templateBuffer.size() % 4 != 0) + m_templateBuffer.push_back(0); + } + + void AddControl(WORD classAtom, short x, short y, short cx, short cy, + WORD id, DWORD style, LPCTSTR text) + { + AlignToDword(); + DLGITEMTEMPLATE item = { 0 }; + item.style = style; + item.x = x; item.y = y; item.cx = cx; item.cy = cy; + item.id = id; + AppendData(&item, sizeof(DLGITEMTEMPLATE)); + AppendWord(0xFFFF); + AppendWord(classAtom); + AppendString(text); + AppendWord(0); + } + + virtual BOOL OnInitDialog() override + { + CDialog::OnInitDialog(); + + // 翻译对话框控件(标题、标签、按钮) + TranslateDialog(this); + + m_comboLang.SubclassDlgItem(1001, this); + + // 添加简体中文 + int idx = m_comboLang.AddString(_T("简体中文")); + m_langCodes.push_back(_T("zh_CN")); + m_comboLang.SetItemData(idx, 0); + + // 添加其他语言 + auto langs = g_Lang.GetAvailableLanguages(); + for (const auto& lang : langs) { + if (lang == _T("zh_CN")) continue; + CString displayName = GetLanguageDisplayName(lang); + idx = m_comboLang.AddString(displayName); + m_comboLang.SetItemData(idx, m_langCodes.size()); + m_langCodes.push_back(lang); + } + + // 选中当前语言 + CString currentLang = g_Lang.GetCurrentLanguage(); + if (currentLang.IsEmpty()) currentLang = _T("zh_CN"); + for (size_t i = 0; i < m_langCodes.size(); i++) { + if (m_langCodes[i] == currentLang) { + m_comboLang.SetCurSel((int)i); + break; + } + } + + CenterWindow(); + return TRUE; + } + + virtual void OnOK() override + { + int sel = m_comboLang.GetCurSel(); + if (sel >= 0) { + size_t idx = (size_t)m_comboLang.GetItemData(sel); + if (idx < m_langCodes.size()) { + m_strSelectedLang = m_langCodes[idx]; + } + } + CDialog::OnOK(); + } +}; diff --git a/server/2015Remote/RegisterDlg.cpp b/server/2015Remote/RegisterDlg.cpp index c1fc5ce..5aabe51 100644 --- a/server/2015Remote/RegisterDlg.cpp +++ b/server/2015Remote/RegisterDlg.cpp @@ -40,7 +40,7 @@ CRegisterDlg::~CRegisterDlg() void CRegisterDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_TREE, m_Tree); DDX_Control(pDX, IDC_LIST, m_ControlList); } @@ -57,13 +57,13 @@ END_MESSAGE_MAP() BOOL CRegisterDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); // TODO: 在此添加额外的初始化 CString str; - str.Format("%s - 注册表管理", m_IPAddress); + str.FormatL("%s - 注册表管理", m_IPAddress); SetWindowText(str); m_ImageListTree.Create(18, 18, ILC_COLOR16,10, 0); //制作 树控件上的图标 @@ -75,7 +75,7 @@ BOOL CRegisterDlg::OnInitDialog() m_Tree.SetImageList(&m_ImageListTree,TVSIL_NORMAL); - m_hRoot = m_Tree.InsertItem("注册表管理",0,0,0,0); //0 + m_hRoot = m_Tree.InsertItem(_TR("注册表管理"),0,0,0,0); //0 HKCU = m_Tree.InsertItem("HKEY_CURRENT_USER",1,1,m_hRoot,0); //1 HKLM = m_Tree.InsertItem("HKEY_LOCAL_MACHINE",1,1,m_hRoot,0); HKUS = m_Tree.InsertItem("HKEY_USERS",1,1,m_hRoot,0); @@ -84,9 +84,9 @@ BOOL CRegisterDlg::OnInitDialog() m_Tree.Expand(m_hRoot,TVE_EXPAND); - m_ControlList.InsertColumn(0,"名称",LVCFMT_LEFT,150,-1); - m_ControlList.InsertColumn(1,"类型",LVCFMT_LEFT,60,-1); - m_ControlList.InsertColumn(2,"数据",LVCFMT_LEFT,300,-1); + m_ControlList.InsertColumnL(0,"名称",LVCFMT_LEFT,150,-1); + m_ControlList.InsertColumnL(1,"类型",LVCFMT_LEFT,60,-1); + m_ControlList.InsertColumnL(2,"数据",LVCFMT_LEFT,300,-1); m_ControlList.SetExtendedStyle(LVS_EX_FULLROWSELECT); //////添加图标////// m_ImageListControlList.Create(16,16,TRUE,2,2); @@ -136,9 +136,9 @@ void CRegisterDlg::OnTvnSelchangedTree(NMHDR *pNMHDR, LRESULT *pResult) char bToken=GetFatherPath(strFullPath); //[2] \1\2\3 //愈加一个键 - int nitem=m_ControlList.InsertItem(0,"(默认)",0); + int nitem=m_ControlList.InsertItem(0,_TR("(默认)"),0); m_ControlList.SetItemText(nitem,1,"REG_SZ"); - m_ControlList.SetItemText(nitem,2,"(数据未设置值)"); + m_ControlList.SetItemText(nitem,2,_TR("(数据未设置值)")); strFullPath.Insert(0,bToken);//插入 那个根键 bToken=COMMAND_REG_FIND; @@ -274,7 +274,7 @@ void CRegisterDlg::AddKey(char* szBuffer) INT_PTR d=(INT_PTR)szValueData; memcpy((void*)&d,szValueData,sizeof(INT_PTR)); CString strValue; - strValue.Format("0x%x",d); + strValue.FormatL("0x%x",d); sprintf(ValueData," (%d)",d); strValue+=" "; strValue+=ValueData; diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index 3bc7fab..8356a1c 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -156,7 +156,7 @@ CScreenSpyDlg::~CScreenSpyDlg() void CScreenSpyDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } @@ -197,7 +197,7 @@ void CScreenSpyDlg::OnLButtonDblClk(UINT nFlags, CPoint point) GetParent()->SendMessage(WM_LBUTTONDBLCLK, nFlags, MAKELPARAM(ptScreen.x, ptScreen.y)); } } - CDialog::OnLButtonDblClk(nFlags, point); + __super::OnLButtonDblClk(nFlags, point); } void CScreenSpyDlg::PrepareDrawing(const LPBITMAPINFO bmp) @@ -208,7 +208,7 @@ void CScreenSpyDlg::PrepareDrawing(const LPBITMAPINFO bmp) m_BitmapData_Full = NULL; CString strString; - strString.Format("%s - 远程桌面控制 %d×%d", m_IPAddress, bmp->bmiHeader.biWidth, bmp->bmiHeader.biHeight); + strString.FormatL("%s - 远程桌面控制 %d×%d", m_IPAddress, bmp->bmiHeader.biWidth, bmp->bmiHeader.biHeight); SetWindowText(strString); uint64_t dlg = (uint64_t)this; Mprintf("%s [对话框ID: %llu]\n", strString.GetString(), dlg); @@ -231,7 +231,7 @@ void CScreenSpyDlg::PrepareDrawing(const LPBITMAPINFO bmp) BOOL CScreenSpyDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon,FALSE); DragAcceptFiles(TRUE); ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD); @@ -241,38 +241,38 @@ BOOL CScreenSpyDlg::OnInitDialog() CMenu* SysMenu = GetSystemMenu(FALSE); if (SysMenu != NULL) { - SysMenu->AppendMenu(MF_SEPARATOR); - SysMenu->AppendMenu(MF_STRING, IDM_CONTROL, "控制屏幕(&Y)"); - SysMenu->AppendMenu(MF_STRING, IDM_FULLSCREEN, "全屏(&F)"); - SysMenu->AppendMenu(MF_STRING, IDM_REMOTE_CURSOR, "使用远程光标(&C)"); - SysMenu->AppendMenu(MF_STRING, IDM_ADAPTIVE_SIZE, "自适应窗口大小(&A)"); - SysMenu->AppendMenu(MF_STRING, IDM_TRACE_CURSOR, "跟踪被控端鼠标(&T)"); - SysMenu->AppendMenu(MF_STRING, IDM_BLOCK_INPUT, "锁定被控端鼠标和键盘(&L)"); - SysMenu->AppendMenu(MF_SEPARATOR); - SysMenu->AppendMenu(MF_STRING, IDM_SAVEDIB, "保存快照(&S)"); - SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, _T("录像(MJPEG)")); - SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI_H264, _T("录像(H264)")); - SysMenu->AppendMenu(MF_STRING, IDM_GET_CLIPBOARD, "获取剪贴板(&R)"); - SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "设置剪贴板(&L)"); - SysMenu->AppendMenu(MF_SEPARATOR); - SysMenu->AppendMenu(MF_STRING, IDM_SWITCHSCREEN, "切换显示器(&1)"); - SysMenu->AppendMenu(MF_STRING, IDM_MULTITHREAD_COMPRESS, "多线程压缩(&2)"); - SysMenu->AppendMenu(MF_STRING, IDM_ORIGINAL_SIZE, "原始分辨率(&3)"); - SysMenu->AppendMenu(MF_STRING, IDM_SCREEN_1080P, "限制为1080P(&4)"); - SysMenu->AppendMenu(MF_SEPARATOR); + SysMenu->AppendMenuSeparator(MF_SEPARATOR); + SysMenu->AppendMenuL(MF_STRING, IDM_CONTROL, "控制屏幕(&Y)"); + SysMenu->AppendMenuL(MF_STRING, IDM_FULLSCREEN, "全屏(&F)"); + SysMenu->AppendMenuL(MF_STRING, IDM_REMOTE_CURSOR, "使用远程光标(&C)"); + SysMenu->AppendMenuL(MF_STRING, IDM_ADAPTIVE_SIZE, "自适应窗口大小(&A)"); + SysMenu->AppendMenuL(MF_STRING, IDM_TRACE_CURSOR, "跟踪被控端鼠标(&T)"); + SysMenu->AppendMenuL(MF_STRING, IDM_BLOCK_INPUT, "锁定被控端鼠标和键盘(&L)"); + SysMenu->AppendMenuSeparator(MF_SEPARATOR); + SysMenu->AppendMenuL(MF_STRING, IDM_SAVEDIB, "保存快照(&S)"); + SysMenu->AppendMenuL(MF_STRING, IDM_SAVEAVI, _T("录像(MJPEG)")); + SysMenu->AppendMenuL(MF_STRING, IDM_SAVEAVI_H264, _T("录像(H264)")); + SysMenu->AppendMenuL(MF_STRING, IDM_GET_CLIPBOARD, "获取剪贴板(&R)"); + SysMenu->AppendMenuL(MF_STRING, IDM_SET_CLIPBOARD, "设置剪贴板(&L)"); + SysMenu->AppendMenuSeparator(MF_SEPARATOR); + SysMenu->AppendMenuL(MF_STRING, IDM_SWITCHSCREEN, "切换显示器(&1)"); + SysMenu->AppendMenuL(MF_STRING, IDM_MULTITHREAD_COMPRESS, "多线程压缩(&2)"); + SysMenu->AppendMenuL(MF_STRING, IDM_ORIGINAL_SIZE, "原始分辨率(&3)"); + SysMenu->AppendMenuL(MF_STRING, IDM_SCREEN_1080P, "限制为1080P(&4)"); + SysMenu->AppendMenuSeparator(MF_SEPARATOR); SysMenu->CheckMenuItem(IDM_FULLSCREEN, m_Settings.FullScreen ? MF_CHECKED : MF_UNCHECKED); SysMenu->CheckMenuItem(IDM_REMOTE_CURSOR, m_Settings.RemoteCursor ? MF_CHECKED : MF_UNCHECKED); CMenu fpsMenu; if (fpsMenu.CreatePopupMenu()) { - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_10, "最大帧率FPS:10"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_15, "最大帧率FPS:15"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_20, "最大帧率FPS:20"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_25, "最大帧率FPS:25"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_30, "最大帧率FPS:30"); - fpsMenu.AppendMenu(MF_STRING, IDM_FPS_UNLIMITED, "最大帧率无限制"); - SysMenu->AppendMenuA(MF_STRING | MF_POPUP, (UINT_PTR)fpsMenu.Detach(), _T("帧率设置")); + fpsMenu.AppendMenuL(MF_STRING, IDM_FPS_10, "最大帧率FPS:10"); + fpsMenu.AppendMenuL(MF_STRING, IDM_FPS_15, "最大帧率FPS:15"); + fpsMenu.AppendMenuL(MF_STRING, IDM_FPS_20, "最大帧率FPS:20"); + fpsMenu.AppendMenuL(MF_STRING, IDM_FPS_25, "最大帧率FPS:25"); + fpsMenu.AppendMenuL(MF_STRING, IDM_FPS_30, "最大帧率FPS:30"); + fpsMenu.AppendMenuL(MF_STRING, IDM_FPS_UNLIMITED, "最大帧率无限制"); + SysMenu->AppendMenuL(MF_STRING | MF_POPUP, (UINT_PTR)fpsMenu.Detach(), _T("帧率设置")); } BOOL all = THIS_CFG.GetInt("settings", "MultiScreen"); @@ -650,7 +650,7 @@ BOOL CScreenSpyDlg::OnSetCursor(CWnd* pWnd, UINT nHitTest, UINT message) ::SetCursor(NULL); // 只要在客户区,始终隐藏系统光标 return TRUE; // 告诉 Windows 我们处理过了 } - return CDialog::OnSetCursor(pWnd, nHitTest, message); + return __super::OnSetCursor(pWnd, nHitTest, message); } VOID CScreenSpyDlg::DrawTipString(CString strString, int fillMode) @@ -709,7 +709,7 @@ std::string GetScreenShotPath(CWnd *parent, const CString& ip, const CString &fi std::string path; std::string folder = THIS_CFG.GetStr("settings", "ScreenShot", ""); if (folder.empty() || !DirectoryExists(folder.c_str())) { - CString strFileName = ip + CTime::GetCurrentTime().Format(_T("_%Y%m%d%H%M%S.")) + suffix; + CString strFileName = ip + CTime::GetCurrentTime().FormatL(_T("_%Y%m%d%H%M%S.")) + suffix; CFileDialog dlg(FALSE, suffix, strFileName, OFN_OVERWRITEPROMPT, filter, parent); if (dlg.DoModal() != IDOK) return ""; @@ -773,8 +773,8 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) FCCHandler handler = nID == IDM_SAVEAVI ? ENCODER_MJPEG : ENCODER_H264; int code; if (code = m_aviStream.Open(m_aviFile, m_BitmapInfor_Full, rate, handler)) { - MessageBox(CString("Create Video(*.avi) Failed:\n") + m_aviFile + "\r\n错误代码: " + - CBmpToAvi::GetErrMsg(code).c_str(), "提示"); + MessageBoxL(CString("Create Video(*.avi) Failed:\n") + m_aviFile + "\r\n错误代码: " + + CBmpToAvi::GetErrMsg(code).c_str(), "提示", MB_ICONINFORMATION); m_aviFile = _T(""); } else { ::SetTimer(m_hWnd, TIMER_ID, duration, NULL); @@ -873,7 +873,7 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) } } - CDialog::OnSysCommand(nID, lParam); + __super::OnSysCommand(nID, lParam); } void CScreenSpyDlg::OnTimer(UINT_PTR nIDEvent) @@ -906,7 +906,7 @@ void CScreenSpyDlg::OnTimer(UINT_PTR nIDEvent) KillTimer(3); PostMessageA(WM_PAINT); } - CDialog::OnTimer(nIDEvent); + __super::OnTimer(nIDEvent); } BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) @@ -953,7 +953,7 @@ BOOL CScreenSpyDlg::PreTranslateMessage(MSG* pMsg) break; } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } @@ -1108,7 +1108,7 @@ void CScreenSpyDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) ScrollWindow(nPrevPos - si.nPos, 0, NULL, NULL); } - CDialog::OnHScroll(nSBCode, nPrevPos, pScrollBar); + __super::OnHScroll(nSBCode, nPrevPos, pScrollBar); } @@ -1153,7 +1153,7 @@ void CScreenSpyDlg::OnVScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar) ScrollWindow(0, nPrevPos - si.nPos, NULL, NULL); } - CDialog::OnVScroll(nSBCode, nPrevPos, pScrollBar); + __super::OnVScroll(nSBCode, nPrevPos, pScrollBar); } @@ -1243,19 +1243,19 @@ bool CScreenSpyDlg::LeaveFullScreen() void CScreenSpyDlg::OnLButtonDown(UINT nFlags, CPoint point) { - CDialog::OnLButtonDown(nFlags, point); + __super::OnLButtonDown(nFlags, point); } void CScreenSpyDlg::OnLButtonUp(UINT nFlags, CPoint point) { - CDialog::OnLButtonUp(nFlags, point); + __super::OnLButtonUp(nFlags, point); } BOOL CScreenSpyDlg::OnMouseWheel(UINT nFlags, short zDelta, CPoint pt) { - return CDialog::OnMouseWheel(nFlags, zDelta, pt); + return __super::OnMouseWheel(nFlags, zDelta, pt); } @@ -1284,7 +1284,7 @@ void CScreenSpyDlg::OnMouseMove(UINT nFlags, CPoint point) SetClassLongPtr(m_hWnd, GCLP_HCURSOR, m_bIsCtrl ? (LONG_PTR)m_hRemoteCursor : (LONG_PTR)LoadCursor(NULL, IDC_NO)); } - CDialog::OnMouseMove(nFlags, point); + __super::OnMouseMove(nFlags, point); } void CScreenSpyDlg::OnMouseLeave() @@ -1297,13 +1297,13 @@ void CScreenSpyDlg::OnMouseLeave() void CScreenSpyDlg::OnKillFocus(CWnd* pNewWnd) { - CDialog::OnKillFocus(pNewWnd); + __super::OnKillFocus(pNewWnd); } void CScreenSpyDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (!IsWindowVisible()) diff --git a/server/2015Remote/ServicesDlg.cpp b/server/2015Remote/ServicesDlg.cpp index ea69404..c88586d 100644 --- a/server/2015Remote/ServicesDlg.cpp +++ b/server/2015Remote/ServicesDlg.cpp @@ -31,7 +31,7 @@ CServicesDlg::~CServicesDlg() void CServicesDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST, m_ControlList); DDX_Control(pDX, IDC_STATIC_COUNT, m_ServicesCount); } @@ -55,20 +55,20 @@ END_MESSAGE_MAP() BOOL CServicesDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); CString strString; - strString.Format("%s - 服务管理",m_IPAddress); + strString.FormatL("%s - 服务管理",m_IPAddress); SetWindowText(strString); m_ControlList.SetExtendedStyle( LVS_EX_FULLROWSELECT); - m_ControlList.InsertColumn(0, "真实名称", LVCFMT_LEFT, 150); - m_ControlList.InsertColumn(1, "显示名称", LVCFMT_LEFT, 260); - m_ControlList.InsertColumn(2, "启动类型", LVCFMT_LEFT, 80); - m_ControlList.InsertColumn(3, "运行状态", LVCFMT_LEFT, 80); - m_ControlList.InsertColumn(4, "可执行文件路径", LVCFMT_LEFT, 380); + m_ControlList.InsertColumnL(0, "真实名称", LVCFMT_LEFT, 150); + m_ControlList.InsertColumnL(1, "显示名称", LVCFMT_LEFT, 260); + m_ControlList.InsertColumnL(2, "启动类型", LVCFMT_LEFT, 80); + m_ControlList.InsertColumnL(3, "运行状态", LVCFMT_LEFT, 80); + m_ControlList.InsertColumnL(4, "可执行文件路径", LVCFMT_LEFT, 380); ShowServicesList(); return TRUE; // return TRUE unless you set the focus to a control @@ -107,7 +107,7 @@ int CServicesDlg::ShowServicesList(void) } CString strTemp; - strTemp.Format("服务个数:%d",i); + strTemp.FormatL("服务个数:%d",i); m_ServicesCount.SetWindowText(strTemp); @@ -219,6 +219,7 @@ void CServicesDlg::OnNMRClickList(NMHDR *pNMHDR, LRESULT *pResult) CMenu Menu; Menu.LoadMenu(IDR_MENU_SERVICES); + TranslateMenu(&Menu); CMenu *SubMenu=Menu.GetSubMenu(0); CPoint Point; GetCursorPos(&Point); @@ -260,7 +261,7 @@ void CServicesDlg::ServicesConfig(BYTE bCmd) void CServicesDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); if (!m_ControlList.GetSafeHwnd()) return; // 确保控件已创建 diff --git a/server/2015Remote/SettingDlg.cpp b/server/2015Remote/SettingDlg.cpp index 93c3d14..7bcd2f2 100644 --- a/server/2015Remote/SettingDlg.cpp +++ b/server/2015Remote/SettingDlg.cpp @@ -13,7 +13,7 @@ IMPLEMENT_DYNAMIC(CSettingDlg, CDialog) CSettingDlg::CSettingDlg(CWnd* pParent) - : CDialog(CSettingDlg::IDD, pParent) + : CDialogLang(CSettingDlg::IDD, pParent) , m_nListenPort("6543") , m_nMax_Connect(0) , m_sScreenCapture(_T("GDI")) @@ -34,7 +34,7 @@ CSettingDlg::~CSettingDlg() void CSettingDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_PORT, m_nListenPort); DDV_MaxChars(pDX, m_nListenPort, 32); DDX_Text(pDX, IDC_EDIT_MAX, m_nMax_Connect); @@ -84,7 +84,7 @@ END_MESSAGE_MAP() BOOL CSettingDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); IPConverter cvt; m_sPublicIP = THIS_CFG.GetStr("settings", "master", "").c_str(); m_sPublicIP = m_sPublicIP.IsEmpty() ? cvt.getPublicIP().c_str() : m_sPublicIP; @@ -100,40 +100,40 @@ BOOL CSettingDlg::OnInitDialog() int n = algo.IsEmpty() ? ALGORITHM_DIFF : atoi(algo.GetString()); switch (n) { case ALGORITHM_GRAY: - m_sScreenCompress = "灰度图像传输"; + m_sScreenCompress = _L(_T("灰度图像传输")); break; case ALGORITHM_DIFF: - m_sScreenCompress = "屏幕差异算法"; + m_sScreenCompress = _L(_T("屏幕差异算法")); break; case ALGORITHM_H264: - m_sScreenCompress = "H264压缩算法"; + m_sScreenCompress = _L(_T("H264压缩算法")); break; default: break; } - m_ComboScreenCompress.InsertString(ALGORITHM_GRAY, "灰度图像传输"); - m_ComboScreenCompress.InsertString(ALGORITHM_DIFF, "屏幕差异算法"); - m_ComboScreenCompress.InsertString(ALGORITHM_H264, "H264压缩算法"); + m_ComboScreenCompress.InsertStringL(ALGORITHM_GRAY, "灰度图像传输"); + m_ComboScreenCompress.InsertStringL(ALGORITHM_DIFF, "屏幕差异算法"); + m_ComboScreenCompress.InsertStringL(ALGORITHM_H264, "H264压缩算法"); - m_ComboScreenCapture.InsertString(0, "GDI"); - m_ComboScreenCapture.InsertString(1, "DXGI"); - m_ComboScreenCapture.InsertString(2, "VIRTUAL"); + m_ComboScreenCapture.InsertStringL(0, "GDI"); + m_ComboScreenCapture.InsertStringL(1, "DXGI"); + m_ComboScreenCapture.InsertStringL(2, "VIRTUAL"); m_sScreenCapture = DXGI==1 ? "DXGI" : (DXGI == 2 ? "VIRTUAL" : "GDI"); - m_ComboSoftwareDetect.InsertString(SOFTWARE_CAMERA, "摄像头"); - m_ComboSoftwareDetect.InsertString(SOFTWARE_TELEGRAM, "电报"); + m_ComboSoftwareDetect.InsertStringL(SOFTWARE_CAMERA, "摄像头"); + m_ComboSoftwareDetect.InsertStringL(SOFTWARE_TELEGRAM, "电报"); auto str = THIS_CFG.GetStr("settings", "ReportInterval", "5"); m_nReportInterval = atoi(str.c_str()); n = THIS_CFG.GetInt("settings", "SoftwareDetect"); switch (n) { case SOFTWARE_CAMERA: - m_sSoftwareDetect = "摄像头"; + m_sSoftwareDetect = _L(_T("摄像头")); break; case SOFTWARE_TELEGRAM: - m_sSoftwareDetect = "电报"; + m_sSoftwareDetect = _L(_T("电报")); break; default: - m_sSoftwareDetect = "摄像头"; + m_sSoftwareDetect = _L(_T("摄像头")); break; } BOOL all = THIS_CFG.GetInt("settings", "MultiScreen"); @@ -154,11 +154,11 @@ BOOL CSettingDlg::OnInitDialog() m_nFileServerPort = THIS_CFG.GetInt("settings", "FileSvrPort", 80); int size = THIS_CFG.GetInt("settings", "VideoWallSize"); - m_ComboVideoWall.InsertString(0, "无"); - m_ComboVideoWall.InsertString(1, "2 x 2"); - m_ComboVideoWall.InsertString(2, "3 x 3"); - m_ComboVideoWall.InsertString(3, "4 x 4"); - m_ComboVideoWall.InsertString(4, "5 x 5"); + m_ComboVideoWall.InsertStringL(0, "无"); + m_ComboVideoWall.InsertStringL(1, "2 x 2"); + m_ComboVideoWall.InsertStringL(2, "3 x 3"); + m_ComboVideoWall.InsertStringL(3, "4 x 4"); + m_ComboVideoWall.InsertStringL(4, "5 x 5"); if (size < 1 || size > 5) size = 1; m_ComboVideoWall.SetCurSel(size-1); @@ -204,7 +204,7 @@ void CSettingDlg::OnBnClickedButtonSettingapply() void CSettingDlg::OnEnChangeEditPort() { // TODO: 如果该控件是 RICHEDIT 控件,它将不 - // 发送此通知,除非重写 CDialog::OnInitDialog() + // 发送此通知,除非重写 __super::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 @@ -218,7 +218,7 @@ void CSettingDlg::OnEnChangeEditPort() void CSettingDlg::OnEnChangeEditMax() { // TODO: 如果该控件是 RICHEDIT 控件,它将不 - // 发送此通知,除非重写 CDialog::OnInitDialog() + // 发送此通知,除非重写 __super::OnInitDialog() // 函数并调用 CRichEditCtrl().SetEventMask(), // 同时将 ENM_CHANGE 标志“或”运算到掩码中。 @@ -234,7 +234,7 @@ void CSettingDlg::OnOK() { OnBnClickedButtonSettingapply(); - CDialog::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/SettingDlg.h b/server/2015Remote/SettingDlg.h index b3d88e9..fd70923 100644 --- a/server/2015Remote/SettingDlg.h +++ b/server/2015Remote/SettingDlg.h @@ -1,10 +1,10 @@ #pragma once #include "afxwin.h" - +#include "LangManager.h" // CSettingDlg 对话框 -class CSettingDlg : public CDialog +class CSettingDlg : public CDialogLang { DECLARE_DYNAMIC(CSettingDlg) diff --git a/server/2015Remote/ShellDlg.cpp b/server/2015Remote/ShellDlg.cpp index d779806..ae9e14f 100644 --- a/server/2015Remote/ShellDlg.cpp +++ b/server/2015Remote/ShellDlg.cpp @@ -43,7 +43,7 @@ CShellDlg::~CShellDlg() void CShellDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT, m_Edit); } @@ -60,14 +60,14 @@ END_MESSAGE_MAP() BOOL CShellDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); m_nCurSel = 0; m_nReceiveLength = 0; SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon,FALSE); CString str; - str.Format("%s - 远程终端", m_IPAddress); + str.FormatL("%s - 远程终端", m_IPAddress); SetWindowText(str); BYTE bToken = COMMAND_NEXT; @@ -236,13 +236,13 @@ BOOL CShellDlg::PreTranslateMessage(MSG* pMsg) } } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } HBRUSH CShellDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { - HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); + HBRUSH hbr = __super::OnCtlColor(pDC, pWnd, nCtlColor); if ((pWnd->GetDlgCtrlID() == IDC_EDIT) && (nCtlColor == CTLCOLOR_EDIT)) { COLORREF clr = RGB(255, 255, 255); @@ -251,7 +251,7 @@ HBRUSH CShellDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) pDC->SetBkColor(clr); //设置黑色的背景 return CreateSolidBrush(clr); //作为约定,返回背景色对应的刷子句柄 } else { - return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); + return __super::OnCtlColor(pDC, pWnd, nCtlColor); } return hbr; } @@ -259,7 +259,7 @@ HBRUSH CShellDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) void CShellDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); if (!m_Edit.GetSafeHwnd()) return; // 确保控件已创建 diff --git a/server/2015Remote/SplashDlg.cpp b/server/2015Remote/SplashDlg.cpp index ffc9989..1e911e5 100644 --- a/server/2015Remote/SplashDlg.cpp +++ b/server/2015Remote/SplashDlg.cpp @@ -220,7 +220,7 @@ void CSplashDlg::OnPaint() // 绘制进度百分比 CString strPercent; - strPercent.Format(_T("%d%%"), m_nProgress); + strPercent.FormatL(_T("%d%%"), m_nProgress); memDC.SetTextColor(RGB(100, 200, 255)); textRect = CRect(rect.Width() - 80, 150, rect.Width() - 30, 180); memDC.DrawText(strPercent, textRect, DT_RIGHT | DT_SINGLELINE | DT_VCENTER); diff --git a/server/2015Remote/SplashDlg.h b/server/2015Remote/SplashDlg.h index 0a5be57..729a588 100644 --- a/server/2015Remote/SplashDlg.h +++ b/server/2015Remote/SplashDlg.h @@ -10,8 +10,11 @@ public: // 创建并显示启动画面 BOOL Create(CWnd* pParent = NULL); +private: + friend class CMy2015RemoteApp; int SafeMessageBox(LPCTSTR lpszText, LPCTSTR lpszCaption, UINT nType); +public: // 更新进度 (0-100) - 通过消息队列(用于跨线程) void SetProgress(int nPercent); diff --git a/server/2015Remote/SystemDlg.cpp b/server/2015Remote/SystemDlg.cpp index 60abd27..573e5e8 100644 --- a/server/2015Remote/SystemDlg.cpp +++ b/server/2015Remote/SystemDlg.cpp @@ -34,7 +34,7 @@ CSystemDlg::~CSystemDlg() void CSystemDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_SYSTEM, m_ControlList); } @@ -62,29 +62,29 @@ END_MESSAGE_MAP() BOOL CSystemDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, TRUE); SetIcon(m_hIcon, FALSE); CString str; m_bHow==TOKEN_PSLIST - ? str.Format("%s - 进程管理", m_IPAddress) - :str.Format("%s - 窗口管理", m_IPAddress); + ? str.FormatL("%s - 进程管理", m_IPAddress) + :str.FormatL("%s - 窗口管理", m_IPAddress); SetWindowText(str);//设置对话框标题 m_ControlList.SetExtendedStyle(LVS_EX_FLATSB | LVS_EX_FULLROWSELECT); if (m_bHow==TOKEN_PSLIST) { //进程管理初始化列表 - m_ControlList.InsertColumn(0, "映像名称", LVCFMT_LEFT, 180); - m_ControlList.InsertColumn(1, "PID", LVCFMT_LEFT, 70); - m_ControlList.InsertColumn(2, "程序路径", LVCFMT_LEFT, 320); - m_ControlList.InsertColumn(3, "架构", LVCFMT_LEFT, 70); + m_ControlList.InsertColumnL(0, "映像名称", LVCFMT_LEFT, 180); + m_ControlList.InsertColumnL(1, "PID", LVCFMT_LEFT, 70); + m_ControlList.InsertColumnL(2, "程序路径", LVCFMT_LEFT, 320); + m_ControlList.InsertColumnL(3, "架构", LVCFMT_LEFT, 70); ShowProcessList(); //由于第一个发送来的消息后面紧跟着进程的数据所以把数据显示到列表当中\0\0 } else if (m_bHow==TOKEN_WSLIST) { //窗口管理初始化列表 //初始化 窗口管理的列表 - m_ControlList.InsertColumn(0, "句柄", LVCFMT_LEFT, 80); - m_ControlList.InsertColumn(1, "窗口名称", LVCFMT_LEFT, 420); - m_ControlList.InsertColumn(2, "窗口状态", LVCFMT_LEFT, 200); - m_ControlList.InsertColumn(3, "所属进程ID", LVCFMT_LEFT, 100); + m_ControlList.InsertColumnL(0, "句柄", LVCFMT_LEFT, 80); + m_ControlList.InsertColumnL(1, "窗口名称", LVCFMT_LEFT, 420); + m_ControlList.InsertColumnL(2, "窗口状态", LVCFMT_LEFT, 200); + m_ControlList.InsertColumnL(3, "所属进程ID", LVCFMT_LEFT, 100); ShowWindowsList(); } @@ -169,7 +169,7 @@ void CSystemDlg::ShowWindowsList(void) szTitle = (char *)szBuffer + dwOffset + sizeof(DWORD); //窗口标题 WindowAttrs attrs = {}; ParseWindowAttrs(szTitle, &attrs); - str.Format("%5u", *lpPID); + str.FormatL("%5u", *lpPID); CString pidStr = attrs.dwPid ? std::to_string(attrs.dwPid).c_str() : "N/A"; m_ControlList.InsertItem(i, str); // 句柄 m_ControlList.SetItemText(i, 1, attrs.szTitle); // 标题 @@ -180,7 +180,7 @@ void CSystemDlg::ShowWindowsList(void) m_ControlList.SetItemData(i, (DWORD_PTR)data); //(d) dwOffset += sizeof(DWORD) + lstrlen(szTitle) + 1; } - str.Format("窗口名称 窗口个数【%d】", i); //修改CtrlList + str.FormatL("窗口名称 窗口个数【%d】", i); //修改CtrlList LVCOLUMN lvc; lvc.mask = LVCF_TEXT; lvc.pszText = str.GetBuffer(0); @@ -207,7 +207,7 @@ void CSystemDlg::ShowProcessList(void) //他的数据结构的构建很巧妙 m_ControlList.InsertItem(i, arr[0].c_str()); //将得到的数据加入到列表当中 - str.Format("%5u", *PID); + str.FormatL("%5u", *PID); m_ControlList.SetItemText(i, 1, str); m_ControlList.SetItemText(i, 2, szProcessFullPath); m_ControlList.SetItemText(i, 3, arr[1].empty() ? "N/A" : arr[1].c_str()); @@ -218,7 +218,7 @@ void CSystemDlg::ShowProcessList(void) dwOffset += sizeof(DWORD) + lstrlen(szExeFile) + lstrlen(szProcessFullPath) + 2; //跳过这个数据结构 进入下一个循环 } - str.Format("程序个数 / %d", i); + str.FormatL("程序个数 / %d", i); LVCOLUMN lvc; lvc.mask = LVCF_TEXT; lvc.pszText = str.GetBuffer(0); @@ -303,6 +303,7 @@ void CSystemDlg::OnNMRClickListSystem(NMHDR *pNMHDR, LRESULT *pResult) } else if (m_bHow==TOKEN_WSLIST) { Menu.LoadMenu(IDR_WINDOW_LIST); } + TranslateMenu(&Menu); CMenu* SubMenu = Menu.GetSubMenu(0); CPoint Point; GetCursorPos(&Point); @@ -325,16 +326,15 @@ void CSystemDlg::OnPlistKill() //加入结束进程的数据头 szBuffer[0] = COMMAND_KILLPROCESS; //显示警告信息 - char *szTips = "警告: 终止进程会导致不希望发生的结果,\n" - "包括数据丢失和系统不稳定。在被终止前,\n" - "进程将没有机会保存其状态和数据。"; + CString csTips = _TR("警告: 终止进程会导致不希望发生的结果,\n包括数据丢失和系统不稳定。在被终止前,\n进程将没有机会保存其状态和数据。"); + char *szTips = (char*)(LPCSTR)csTips; CString str; if (ListCtrl->GetSelectedCount() > 1) { - str.Format("%s确实\n想终止这%d项进程吗?", szTips, ListCtrl->GetSelectedCount()); + str.FormatL("%s确实\n想终止这%d项进程吗?", szTips, ListCtrl->GetSelectedCount()); } else { - str.Format("%s确实\n想终止该项进程吗?", szTips); + str.FormatL("%s确实\n想终止该项进程吗?", szTips); } - if (::MessageBox(m_hWnd, str, "进程结束警告", MB_YESNO | MB_ICONQUESTION) == IDNO) { + if (MessageBoxAPI_L(m_hWnd, str, "进程结束警告", MB_YESNO | MB_ICONQUESTION) == IDNO) { LocalFree(szBuffer); return; } @@ -514,7 +514,7 @@ void CSystemDlg::OnWlistMin() void CSystemDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); if (!m_ControlList.GetSafeHwnd()) return; // 确保控件已创建 @@ -537,9 +537,9 @@ void CSystemDlg::OnPlistInject() return; if (ListCtrl->GetSelectedCount() != 1) - ::MessageBox(m_hWnd, "只能同时向一个进程进行代码注入!", "提示", MB_ICONINFORMATION); + MessageBoxAPI_L(m_hWnd, "只能同时向一个进程进行代码注入!", "提示", MB_ICONINFORMATION); - if (::MessageBox(m_hWnd, "确定要向目标进程 (仅限64位) 进行代码注入吗?\n此操作可能被安全软件阻止,或导致进程崩溃!", + if (MessageBoxAPI_L(m_hWnd, "确定要向目标进程 (仅限64位) 进行代码注入吗?\n此操作可能被安全软件阻止,或导致进程崩溃!", "警告", MB_YESNO | MB_ICONQUESTION) == IDNO) return; @@ -565,9 +565,9 @@ void CSystemDlg::OnPlistAntiBlackScreen() return; if (ListCtrl->GetSelectedCount() != 1) - ::MessageBox(m_hWnd, "只能同时向一个进程进行反黑屏操作!", "提示", MB_ICONINFORMATION); + MessageBoxAPI_L(m_hWnd, "只能同时向一个进程进行反黑屏操作!", "提示", MB_ICONINFORMATION); - if (::MessageBox(m_hWnd, "确定要向目标进程进行反黑屏吗?\n请确保目标进程、DLL及被控端架构务必相同!", + if (MessageBoxAPI_L(m_hWnd, "确定要向目标进程进行反黑屏吗?\n请确保目标进程、DLL及被控端架构务必相同!", "警告", MB_YESNO | MB_ICONQUESTION) == IDNO) return; diff --git a/server/2015Remote/TalkDlg.cpp b/server/2015Remote/TalkDlg.cpp index 6d00ae2..5d118b8 100644 --- a/server/2015Remote/TalkDlg.cpp +++ b/server/2015Remote/TalkDlg.cpp @@ -21,7 +21,7 @@ CTalkDlg::~CTalkDlg() void CTalkDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT_TALK, m_EditTalk); m_EditTalk.SetLimitText(TALK_DLG_MAXLEN); } @@ -38,7 +38,7 @@ END_MESSAGE_MAP() BOOL CTalkDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, FALSE); BYTE bToken = COMMAND_NEXT; @@ -83,7 +83,7 @@ BOOL CTalkDlg::PreTranslateMessage(MSG* pMsg) } } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } diff --git a/server/2015Remote/ToolbarDlg.cpp b/server/2015Remote/ToolbarDlg.cpp index ae76646..85f7e99 100644 --- a/server/2015Remote/ToolbarDlg.cpp +++ b/server/2015Remote/ToolbarDlg.cpp @@ -7,7 +7,7 @@ IMPLEMENT_DYNAMIC(CToolbarDlg, CDialogEx) CToolbarDlg::CToolbarDlg(CScreenSpyDlg* pParent) - : CDialogEx(IDD_TOOLBAR_DLG, pParent) + : CDialogLangEx(IDD_TOOLBAR_DLG, pParent) { m_pParent = pParent; } @@ -18,7 +18,7 @@ CToolbarDlg::~CToolbarDlg() void CToolbarDlg::DoDataExchange(CDataExchange* pDX) { - CDialogEx::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CToolbarDlg, CDialogEx) @@ -156,7 +156,7 @@ void CToolbarDlg::OnBnClickedClose() BOOL CToolbarDlg::OnInitDialog() { - CDialogEx::OnInitDialog(); + __super::OnInitDialog(); // 加载用户设置 LoadSettings(); diff --git a/server/2015Remote/ToolbarDlg.h b/server/2015Remote/ToolbarDlg.h index da9b462..19e48d2 100644 --- a/server/2015Remote/ToolbarDlg.h +++ b/server/2015Remote/ToolbarDlg.h @@ -1,9 +1,10 @@ #pragma once #include "Resource.h" +#include "LangManager.h" class CScreenSpyDlg; -class CToolbarDlg : public CDialogEx +class CToolbarDlg : public CDialogLangEx { DECLARE_DYNAMIC(CToolbarDlg) private: diff --git a/server/2015Remote/TrueColorToolBar.cpp b/server/2015Remote/TrueColorToolBar.cpp index 40bb5b1..a5462d9 100644 --- a/server/2015Remote/TrueColorToolBar.cpp +++ b/server/2015Remote/TrueColorToolBar.cpp @@ -17,6 +17,7 @@ #include "stdafx.h" #include "TrueColorToolBar.h" +#include "LangManager.h" #ifdef _DEBUG #define new DEBUG_NEW @@ -126,6 +127,7 @@ void CTrueColorToolBar::OnToolbarDropDown(NMHDR* pnmh, LRESULT *plr) CMenu menu; menu.LoadMenu(DropDownInfo.uMenuID); + TranslateMenu(&menu); CMenu* pPopup = menu.GetSubMenu(0); CRect rc; diff --git a/server/2015Remote/VideoDlg.cpp b/server/2015Remote/VideoDlg.cpp index 74b9348..18a087b 100644 --- a/server/2015Remote/VideoDlg.cpp +++ b/server/2015Remote/VideoDlg.cpp @@ -26,14 +26,14 @@ void CVideoDlg::SaveAvi(void) return; } - CString strFileName = m_IPAddress + CTime::GetCurrentTime().Format("_%Y-%m-%d_%H-%M-%S.avi"); + CString strFileName = m_IPAddress + CTime::GetCurrentTime().FormatL("_%Y-%m-%d_%H-%M-%S.avi"); CFileDialog dlg(FALSE, "avi", strFileName, OFN_OVERWRITEPROMPT, "视频文件(*.avi)|*.avi|", this); if(dlg.DoModal () != IDOK) return; m_aviFile = dlg.GetPathName(); int code; if (code = m_aviStream.Open(m_aviFile, m_BitmapInfor_Full)) { - MessageBox("创建录像文件失败:"+m_aviFile + "\r\n错误代码: " + CBmpToAvi::GetErrMsg(code).c_str(), "提示"); + MessageBoxL("创建录像文件失败:"+m_aviFile + "\r\n错误代码: " + CBmpToAvi::GetErrMsg(code).c_str(), "提示", MB_ICONINFORMATION); m_aviFile.Empty(); } else { pSysMenu->CheckMenuItem(IDM_SAVEAVI, MF_CHECKED); @@ -99,7 +99,7 @@ CVideoDlg::~CVideoDlg() void CVideoDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } @@ -115,20 +115,20 @@ END_MESSAGE_MAP() BOOL CVideoDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); CMenu* SysMenu = GetSystemMenu(FALSE); if (SysMenu != NULL) { m_hDD = DrawDibOpen(); m_hDC = ::GetDC(m_hWnd); - SysMenu->AppendMenu(MF_STRING, IDM_ENABLECOMPRESS, "视频压缩(&C)"); - SysMenu->AppendMenu(MF_STRING, IDM_SAVEAVI, "保存录像(&V)"); - SysMenu->AppendMenu(MF_SEPARATOR); + SysMenu->AppendMenuL(MF_STRING, IDM_ENABLECOMPRESS, "视频压缩(&C)"); + SysMenu->AppendMenuL(MF_STRING, IDM_SAVEAVI, "保存录像(&V)"); + SysMenu->AppendMenuSeparator(MF_SEPARATOR); CString strString; - strString.Format("%s - 视频管理 %d×%d", m_IPAddress, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight); + strString.FormatL("%s - 视频管理 %d×%d", m_IPAddress, m_BitmapInfor_Full->bmiHeader.biWidth, m_BitmapInfor_Full->bmiHeader.biHeight); SetWindowText(strString); @@ -248,7 +248,7 @@ void CVideoDlg::OnSysCommand(UINT nID, LPARAM lParam) } } - CDialog::OnSysCommand(nID, lParam); + __super::OnSysCommand(nID, lParam); } diff --git a/server/2015Remote/file/CFileManagerDlg.cpp b/server/2015Remote/file/CFileManagerDlg.cpp index 4ca31e6..12ccd1d 100644 --- a/server/2015Remote/file/CFileManagerDlg.cpp +++ b/server/2015Remote/file/CFileManagerDlg.cpp @@ -58,7 +58,7 @@ CFileManagerDlg::CFileManagerDlg(CWnd* pParent, Server* pIOCPServer, ClientConte void CFileManagerDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_REMOTE_PATH, m_Remote_Directory_ComboBox); DDX_Control(pDX, IDC_LIST_REMOTE, m_list_remote); DDX_Control(pDX, IDC_LIST_REMOTE_DRIVER, m_list_remote_driver); @@ -152,14 +152,14 @@ BOOL CFileManagerDlg::MyShell_GetImageLists() BOOL CFileManagerDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); RECT rect; GetClientRect(&rect); // 设置标题 CString str; - str.Format(_T("文件管理 - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str); + str.FormatL(_T("文件管理 - %s"), m_ContextObject->PeerName.c_str()), SetWindowText(str); // 创建带进度条的状态栏 if (!m_wndStatusBar.Create(this) || @@ -197,23 +197,23 @@ BOOL CFileManagerDlg::OnInitDialog() m_list_remote_search.SetImageList(&(THIS_APP->m_pImageList_Large), LVSIL_NORMAL); m_list_remote_search.SetImageList(&(THIS_APP->m_pImageList_Small), LVSIL_SMALL); - m_list_remote_driver.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 50); - m_list_remote_driver.InsertColumn(1, _T("类型"), LVCFMT_LEFT, 38); - m_list_remote_driver.InsertColumn(2, _T("总大小"), LVCFMT_LEFT, 70); - m_list_remote_driver.InsertColumn(3, _T("可用空间"), LVCFMT_LEFT, 70); + m_list_remote_driver.InsertColumnL(0, _T("名称"), LVCFMT_LEFT, 50); + m_list_remote_driver.InsertColumnL(1, _T("类型"), LVCFMT_LEFT, 38); + m_list_remote_driver.InsertColumnL(2, _T("总大小"), LVCFMT_LEFT, 70); + m_list_remote_driver.InsertColumnL(3, _T("可用空间"), LVCFMT_LEFT, 70); - m_list_remote.InsertColumn(0, _T("名称"), LVCFMT_LEFT, 250); - m_list_remote.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 70); - m_list_remote.InsertColumn(2, _T("类型"), LVCFMT_LEFT, 120); - m_list_remote.InsertColumn(3, _T("修改日期"), LVCFMT_LEFT, 115); + m_list_remote.InsertColumnL(0, _T("名称"), LVCFMT_LEFT, 250); + m_list_remote.InsertColumnL(1, _T("大小"), LVCFMT_LEFT, 70); + m_list_remote.InsertColumnL(2, _T("类型"), LVCFMT_LEFT, 120); + m_list_remote.InsertColumnL(3, _T("修改日期"), LVCFMT_LEFT, 115); m_list_remote.SetParenDlg(this); //设置搜索list表头 m_list_remote_search.ShowWindow(SW_HIDE); - m_list_remote_search.InsertColumn(0, _T("文件名"), LVCFMT_LEFT, 130); - m_list_remote_search.InsertColumn(1, _T("大小"), LVCFMT_LEFT, 100); - m_list_remote_search.InsertColumn(2, _T("修改日期"), LVCFMT_LEFT, 100); - m_list_remote_search.InsertColumn(3, _T("文件路径"), LVCFMT_LEFT, 450); + m_list_remote_search.InsertColumnL(0, _T("文件名"), LVCFMT_LEFT, 130); + m_list_remote_search.InsertColumnL(1, _T("大小"), LVCFMT_LEFT, 100); + m_list_remote_search.InsertColumnL(2, _T("修改日期"), LVCFMT_LEFT, 100); + m_list_remote_search.InsertColumnL(3, _T("文件路径"), LVCFMT_LEFT, 450); SetWindowPos(NULL, 0, 0, 830, 500, SWP_NOMOVE); FixedRemoteDriveList(); @@ -223,7 +223,7 @@ BOOL CFileManagerDlg::OnInitDialog() void CFileManagerDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here // 状态栏还没有创建 @@ -297,7 +297,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) } if (hwnd == NULL) { - ::MessageBox(NULL, _T("请拖拽到文件管理器选定目录中"), TEXT("错误"), 0); + MessageBoxAPI_L(NULL, _T("请拖拽到文件管理器选定目录中"), TEXT("错误"), 0); } else { ::SendMessage(hwnd, WM_GETTEXT, 1024, (LPARAM)str); strLpath = str + 4; @@ -323,7 +323,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) } if (file.IsEmpty()) { EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); return; } @@ -338,7 +338,7 @@ void CFileManagerDlg::OnLButtonUp(UINT nFlags, CPoint point) SendDownloadJob(); } } - CDialog::OnLButtonUp(nFlags, point); + __super::OnLButtonUp(nFlags, point); } @@ -361,14 +361,14 @@ BOOL CFileManagerDlg::PreTranslateMessage(MSG* pMsg) pMsg->wParam = HTCAPTION; } - return CDialog::PreTranslateMessage(pMsg); + return __super::PreTranslateMessage(pMsg); } void CFileManagerDlg::OnTimer(UINT_PTR nIDEvent) { // TODO: Add your message handler code here and/or call default m_ProgressCtrl->StepIt(); - CDialog::OnTimer(nIDEvent); + __super::OnTimer(nIDEvent); } void CFileManagerDlg::FixedRemoteDriveList() @@ -422,15 +422,15 @@ void CFileManagerDlg::FixedRemoteDriveList() } //显示驱动器名 CString str; - str.Format(_T("%c:\\"), pDrive[i]); + str.FormatL(_T("%c:\\"), pDrive[i]); int nItem = m_list_remote_driver.InsertItem(i, str, nIconIndex); m_list_remote_driver.SetItemData(nItem, 1); //显示驱动器大小 memcpy(&AmntMB, pDrive + i + 4, 4); memcpy(&FreeMB, pDrive + i + 8, 4); - str.Format(_T("%0.1f GB"), (float)AmntMB / 1024); + str.FormatL(_T("%0.1f GB"), (float)AmntMB / 1024); m_list_remote_driver.SetItemText(nItem, 2, str); - str.Format(_T("%0.1f GB"), (float)FreeMB / 1024); + str.FormatL(_T("%0.1f GB"), (float)FreeMB / 1024); m_list_remote_driver.SetItemText(nItem, 3, str); i += 12; @@ -453,8 +453,8 @@ void CFileManagerDlg::FixedRemoteDriveList() count++; } - m_list_remote_driver.InsertItem(0, _T("桌面"), nIconIndex); - m_list_remote_driver.InsertItem(0, _T("最近"), nIconIndex); + m_list_remote_driver.InsertItem(0, _TR("桌面"), nIconIndex); + m_list_remote_driver.InsertItem(0, _TR("最近"), nIconIndex); count += 2; // 重置远程当前路径 @@ -463,7 +463,7 @@ void CFileManagerDlg::FixedRemoteDriveList() DRIVE_CAZ = FALSE; DWORD_PTR dwResult; - ShowMessage(_T("远程计算机:磁盘列表")); + ShowMessage(_TRF("远程计算机:磁盘列表")); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); @@ -483,7 +483,7 @@ void CFileManagerDlg::fixNetHood(BYTE* pbuffer, int buffersize) str = pszFileName; int nItem = m_list_remote_driver.InsertItem(m_list_remote_driver.GetItemCount(), str, DRIVE_REMOTE); m_list_remote_driver.SetItemData(nItem, 1); - m_list_remote_driver.SetItemText(nItem, 1, _T("共享")); + m_list_remote_driver.SetItemText(nItem, 1, _L(_T("共享"))); m_list_remote_driver.SetItemText(nItem, 2, _T("")); m_list_remote_driver.SetItemText(nItem, 3, _T("")); dwOffset += (strsize + sizeof(int)); @@ -604,7 +604,7 @@ void CFileManagerDlg::OnReceiveComplete() break; case TOKEN_FILE_INFO: { CString szInfo = (TCHAR*)m_ContextObject->m_DeCompressionBuffer.GetBuffer(1); - if (MessageBox(szInfo, _T("路径 确认拷贝到剪切板"), MB_ICONEXCLAMATION | MB_YESNO) == IDYES) { + if (MessageBoxL(szInfo, _T("路径 确认拷贝到剪切板"), MB_ICONEXCLAMATION | MB_YESNO) == IDYES) { CStringA a; a = szInfo; ::OpenClipboard(::GetDesktopWindow()); @@ -628,8 +628,8 @@ void CFileManagerDlg::OnReceiveComplete() break; case TOKEN_FILE_ZIPOK: { GetRemoteFileList(_T(".")); - ShowMessage(_T("压缩完成")); - MessageBox(0, _T("ZIP压缩完成")); + ShowMessage(_TRF("压缩完成")); + MessageBoxL(_T("ZIP压缩完成"), "提示", MB_ICONINFORMATION); } break; case TOKEN_FILE_GETINFO: { @@ -664,7 +664,7 @@ void CFileManagerDlg::OnReceiveComplete() int i; memcpy(&i, m_ContextObject->m_DeCompressionBuffer.GetBuffer() + 1, sizeof(int)); CString strMsgShow; - strMsgShow.Format(_T("已经搜索 %d 请勿再次搜索"), i); + strMsgShow.FormatL(_T("已经搜索 %d 请勿再次搜索"), i); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } break; @@ -720,7 +720,7 @@ void CFileManagerDlg::GetRemoteFileList(CString directory) m_ContextObject->Send2Client(bPacket, PacketSize); LocalFree(bPacket); - m_Remote_Directory_ComboBox.InsertString(0, m_Remote_Path); + m_Remote_Directory_ComboBox.InsertStringL(0, m_Remote_Path); m_Remote_Directory_ComboBox.SetCurSel(0); // 得到返回数据前禁窗口 @@ -782,7 +782,7 @@ void CFileManagerDlg::OnDblclkListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) m_ContextObject->Send2Client(bPacket, PacketSize); LocalFree(bPacket); - m_Remote_Directory_ComboBox.InsertString(0, directory); + m_Remote_Directory_ComboBox.InsertStringL(0, directory); m_Remote_Directory_ComboBox.SetCurSel(0); // 得到返回数据前禁窗口 @@ -858,15 +858,15 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) memcpy(&dwFileSizeLow, pList + 4, 4); __int64 nFileSize = ((__int64)dwFileSizeHigh << 32) + dwFileSizeLow; if (nFileSize >= 1024 * 1024 * 1024) - strFileSize.Format(_T("%0.2f GB"), (double)nFileSize / (1024 * 1024 * 1024)); + strFileSize.FormatL(_T("%0.2f GB"), (double)nFileSize / (1024 * 1024 * 1024)); else if (nFileSize >= 1024 * 1024) - strFileSize.Format(_T("%0.2f MB"), (double)nFileSize / (1024 * 1024)); + strFileSize.FormatL(_T("%0.2f MB"), (double)nFileSize / (1024 * 1024)); else - strFileSize.Format(_T("%I64u KB"), nFileSize / 1024 + (nFileSize % 1024 ? 1 : 0)); + strFileSize.FormatL(_T("%I64u KB"), nFileSize / 1024 + (nFileSize % 1024 ? 1 : 0)); m_list_remote.SetItemText(nItem, 1, strFileSize); memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME)); CTime time(ftm_strReceiveLocalFileTime); - m_list_remote.SetItemText(nItem, 3, time.Format(_T("%Y-%m-%d %H:%M"))); + m_list_remote.SetItemText(nItem, 3, time.FormatL(_T("%Y-%m-%d %H:%M"))); } pList += 16; } @@ -879,13 +879,13 @@ void CFileManagerDlg::FixedRemoteFileList(BYTE* pbBuffer, DWORD dwBufferLen) m_list_remote_driver.EnableWindow(TRUE); if (DRIVE_CAZ == FALSE) { DWORD_PTR dwResult; - ShowMessage(_T("远程目录:%s"), m_Remote_Path); + ShowMessage(_TRF("远程目录:%s"), m_Remote_Path); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); } } -void CFileManagerDlg::ShowMessage(TCHAR* lpFmt, ...) +void CFileManagerDlg::ShowMessage(const TCHAR* lpFmt, ...) { TCHAR buff[1024]; va_list arglist; @@ -974,7 +974,7 @@ bool CFileManagerDlg::FixedUploadDirectory(LPCTSTR lpPathName) FixedUploadDirectory(strDirectory); // 如果找到的是目录,则进入此目录进行递归 } else { CString file; - file.Format(_T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName); + file.FormatL(_T("%s%s%s"), lpPathName, lpszSlash, wfd.cFileName); m_Remote_Upload_Job.AddTail(file); // 对文件进行操作 } @@ -1020,7 +1020,7 @@ void CFileManagerDlg::OnTransferSend() } if (m_Remote_Upload_Job.IsEmpty()) { - ::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); return; } EnableControl(FALSE); @@ -1046,7 +1046,7 @@ void CFileManagerDlg::TransferSend(CString file) } if (m_Remote_Upload_Job.IsEmpty()) { - ::MessageBox(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, _T("文件夹为空"), _T("警告"), MB_OK | MB_ICONWARNING); return; } EnableControl(FALSE); @@ -1062,11 +1062,14 @@ CString CFileManagerDlg::GetDirectoryPath(BOOL bIncludeFiles) BROWSEINFO bi = { 0 }; //因为已经初始化为0.所以有些项不用再重复赋值了 bi.hwndOwner = m_hWnd; bi.pszDisplayName = szBrowsePath; + CString strBrowseTitle; if (bIncludeFiles) { - bi.lpszTitle = _T("请选择上传路径: "); + strBrowseTitle = _L(_T("请选择上传路径: ")); + bi.lpszTitle = strBrowseTitle; bi.ulFlags = BIF_BROWSEINCLUDEFILES; } else { - bi.lpszTitle = _T("请选择下载路径: "); + strBrowseTitle = _L(_T("请选择下载路径: ")); + bi.lpszTitle = strBrowseTitle; bi.ulFlags = BIF_RETURNONLYFSDIRS; } LPITEMIDLIST lpiml = { 0 }; @@ -1100,7 +1103,7 @@ void CFileManagerDlg::OnRemoteCopy() } if (file.IsEmpty()) { EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); return; } @@ -1159,7 +1162,7 @@ BOOL CFileManagerDlg::SendUploadJob() m_Local_Path = _T(""); m_Remote_Upload_Job.RemoveHead(); EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("请选择目录!"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, _T("请选择目录!"), _T("警告"), MB_OK | MB_ICONWARNING); return 0; } @@ -1367,7 +1370,7 @@ void CFileManagerDlg::CreateLocalRecvFile() if (m_hFileRecv == INVALID_HANDLE_VALUE) { m_nOperatingFileLength = 0; m_nCounter = 0; - ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件创建失败"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, m_strReceiveLocalFile + _T(" 文件创建失败"), _T("警告"), MB_OK | MB_ICONWARNING); return; } @@ -1423,7 +1426,7 @@ void CFileManagerDlg::WriteLocalRecvFile() break; } if (i == MAX_WRITE_RETRY && !bResult) { - ::MessageBox(m_hWnd, m_strReceiveLocalFile + _T(" 文件写入失败!"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, m_strReceiveLocalFile + _T(" 文件写入失败!"), _T("警告"), MB_OK | MB_ICONWARNING); m_bIsStop = true; } else { dwOffsetLow = 0; @@ -1520,9 +1523,9 @@ void CFileManagerDlg::EndRemoteDeleteFile() GetRemoteFileList(_T(".")); DWORD_PTR dwResult; if (m_strFileName.GetAt(m_strFileName.GetLength() - 1) == '\\') - ShowMessage(_T("删除目录:%s (完成)"), m_strFileName); + ShowMessage(_TRF("删除目录:%s (完成)"), m_strFileName); else - ShowMessage(_T("删除文件:%s (完成)"), m_strFileName); + ShowMessage(_TRF("删除文件:%s (完成)"), m_strFileName); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, 0, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, NULL, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); DRIVE_CAZ = TRUE; @@ -1559,11 +1562,11 @@ void CFileManagerDlg::SendStop(BOOL bIsDownload) void CFileManagerDlg::ShowProgress() { - TCHAR* lpDirection = NULL; + CString lpDirection; if (m_bIsUpload) - lpDirection = _T("文件上传"); + lpDirection = _L(_T("文件上传")); else - lpDirection = _T("文件下载"); + lpDirection = _L(_T("文件下载")); if (m_nCounter == -1) { m_nCounter = m_nOperatingFileLength; @@ -1573,11 +1576,11 @@ void CFileManagerDlg::ShowProgress() CString str; DWORD_PTR dwResult; if (m_nCounter >= 1024 * 1024 * 1024) - str.Format(_T("%.2f GB (%d%%)"), (double)m_nCounter / (1024 * 1024 * 1024), progress); + str.FormatL(_T("%.2f GB (%d%%)"), (double)m_nCounter / (1024 * 1024 * 1024), progress); else if (m_nCounter >= 1024 * 1024) - str.Format(_T("%.2f MB (%d%%)"), (double)m_nCounter / (1024 * 1024), progress); + str.FormatL(_T("%.2f MB (%d%%)"), (double)m_nCounter / (1024 * 1024), progress); else - str.Format(_T("%I64u KB (%d%%)"), m_nCounter / 1024 + (m_nCounter % 1024 ? 1 : 0), progress); + str.FormatL(_T("%I64u KB (%d%%)"), m_nCounter / 1024 + (m_nCounter % 1024 ? 1 : 0), progress); ShowMessage(_T("%s: %s"), lpDirection, m_strFileName); SendMessageTimeout(m_ProgressCtrl->GetSafeHwnd(), PBM_SETPOS, (WPARAM)progress, 0, SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)str.GetBuffer(0), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, &dwResult); @@ -1594,15 +1597,15 @@ void CFileManagerDlg::OnRemoteDelete() // TODO: Add your command handler code here CString str; if (m_list_remote.GetSelectedCount() > 1) - str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote.GetSelectedCount()); + str.FormatL(_T("确定要将这 %d 项删除吗?"), m_list_remote.GetSelectedCount()); else { CString file = m_list_remote.GetItemText(m_list_remote.GetSelectionMark(), 0); if (m_list_remote.GetItemData(m_list_remote.GetSelectionMark()) == 1) - str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); + str.FormatL(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); else - str.Format(_T("确实要把“%s”删除吗?"), file); + str.FormatL(_T("确实要把“%s”删除吗?"), file); } - if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) + if (MessageBoxAPI_L(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) return; m_Remote_Delete_Job.RemoveAll(); POSITION pos = m_list_remote.GetFirstSelectedItemPosition(); //iterator for the CListCtrl @@ -1630,8 +1633,7 @@ void CFileManagerDlg::PostNcDestroy() { if (!m_bIsClosed) OnClose(); - CDialog::PostNcDestroy(); - delete this; + __super::PostNcDestroy(); } void CFileManagerDlg::SendTransferMode() @@ -1944,7 +1946,7 @@ void CFileManagerDlg::OnRemoteCopyFile() memcpy(lpPacket + 1, file.GetBuffer(0), nPacketLength - 1); m_ContextObject->Send2Client(lpPacket, nPacketLength); LocalFree(lpPacket); - ShowMessage(_T("准备粘贴")); + ShowMessage(_TRF("准备粘贴")); } void CFileManagerDlg::OnRemotePasteFile() @@ -1980,7 +1982,7 @@ void CFileManagerDlg::OnRemotezip() m_ContextObject->Send2Client(lpPacket, nPacketLength); LocalFree(lpPacket); - ShowMessage(_T("开始压缩,不要关闭窗口,其他操作继续")); + ShowMessage(_TRF("开始压缩,不要关闭窗口,其他操作继续")); } void CFileManagerDlg::OnRemotezipstop() @@ -1993,7 +1995,7 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) { CMenu mListmeau; mListmeau.CreatePopupMenu(); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("分区高级搜索")); + mListmeau.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("分区高级搜索")); POINT mousepos; GetCursorPos(&mousepos); int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL); @@ -2027,7 +2029,7 @@ void CFileManagerDlg::OnRclickListRemotedriver(NMHDR* pNMHDR, LRESULT* pResult) memcpy(S_search.TC_disk, str_disk.GetBuffer(), str_disk.GetLength() * sizeof(TCHAR)); if (dlg.m_str.GetLength() > (MAX_PATH - 5)) { - MessageBox(_T("搜索关键词太长"), _T("注意")); + MessageBoxL(_T("搜索关键词太长"), _T("注意"), MB_ICONINFORMATION); return ; } memcpy(S_search.TC_search, dlg.m_str.GetBuffer(), dlg.m_str.GetLength() * sizeof(TCHAR)); @@ -2053,6 +2055,7 @@ void CFileManagerDlg::OnRclickListRemote(NMHDR* pNMHDR, LRESULT* pResult) CListCtrl* pListCtrl = &m_list_remote; CMenu popup; popup.LoadMenu(IDR_FILEMANAGER); + TranslateMenu(&popup); CMenu* pM = popup.GetSubMenu(0); CPoint p; GetCursorPos(&p); @@ -2122,9 +2125,9 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) { CMenu mListmeau; mListmeau.CreatePopupMenu(); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("下载(附带目录结构)")); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("删除")); - mListmeau.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("打开文件位置")); + mListmeau.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("下载(附带目录结构)")); + mListmeau.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("删除")); + mListmeau.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("打开文件位置")); POINT mousepos; GetCursorPos(&mousepos); int nMenuResult = ::TrackPopupMenu(mListmeau, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, mousepos.x, mousepos.y, 0, GetSafeHwnd(), NULL); @@ -2149,7 +2152,7 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) } if (file.IsEmpty()) { EnableControl(TRUE); - ::MessageBox(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); + MessageBoxAPI_L(m_hWnd, _T("请选择文件!"), _T("警告"), MB_OK | MB_ICONWARNING); return; } strLpath = GetDirectoryPath(FALSE); @@ -2168,15 +2171,15 @@ void CFileManagerDlg::OnRclickListSearch(NMHDR* pNMHDR, LRESULT* pResult) // TODO: Add your command handler code here CString str; if (m_list_remote_search.GetSelectedCount() > 1) - str.Format(_T("确定要将这 %d 项删除吗?"), m_list_remote_search.GetSelectedCount()); + str.FormatL(_T("确定要将这 %d 项删除吗?"), m_list_remote_search.GetSelectedCount()); else { CString file = m_list_remote_search.GetItemText(m_list_remote_search.GetSelectionMark(), 0); if (m_list_remote_search.GetItemData(m_list_remote_search.GetSelectionMark()) == 1) - str.Format(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); + str.FormatL(_T("确实要删除文件夹“%s”并将所有内容删除吗?"), file); else - str.Format(_T("确实要把“%s”删除吗?"), file); + str.FormatL(_T("确实要把“%s”删除吗?"), file); } - if (::MessageBox(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) + if (MessageBoxAPI_L(m_hWnd, str, _T("确认删除"), MB_YESNO | MB_ICONQUESTION) == IDNO) return; m_Remote_Delete_Job.RemoveAll(); POSITION pos = m_list_remote_search.GetFirstSelectedItemPosition(); //iterator for the CListCtrl @@ -2373,7 +2376,7 @@ void CFileManagerDlg::OnBtnSearch() m_ContextObject->Send2Client(lpBuffer, nPacketSize); SAFE_DELETE_AR(lpBuffer); // 设置按钮状态 - m_BtnSearch.SetWindowText(_T("正在搜索...")); + m_BtnSearch.SetWindowText(_TR("正在搜索...")); m_list_remote_search.ShowWindow(SW_SHOW); GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(FALSE); @@ -2384,8 +2387,8 @@ void CFileManagerDlg::OnBtnSearch() void CFileManagerDlg::SearchEnd() { int len = m_list_remote_search.GetItemCount(); - m_BtnSearch.SetWindowText(_T("重新搜索")); - ShowMessage(_T("搜索完毕 共:%d 个文件"), len); + m_BtnSearch.SetWindowText(_TR("重新搜索")); + ShowMessage(_TRF("搜索完毕 共:%d 个文件"), len); m_list_remote_search.EnableWindow(TRUE); GetDlgItem(IDC_BTN_SEARCH)->EnableWindow(TRUE); GetDlgItem(ID_SEARCH_STOP)->EnableWindow(FALSE); @@ -2408,7 +2411,7 @@ void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLe pszFileName = (TCHAR*) ++pList; CString csFilePath, csFileFullName; - csFilePath.Format(_T("%s"), pszFileName); + csFilePath.FormatL(_T("%s"), pszFileName); int nPos = csFilePath.ReverseFind(_T('\\')); csFileFullName = csFilePath.Right(csFilePath.GetLength() - nPos - 1);// 获取文件全名,包括文件名和扩展名 @@ -2420,12 +2423,12 @@ void CFileManagerDlg::FixedRemoteSearchFileList(BYTE* pbBuffer, DWORD dwBufferLe memcpy(&dwFileSizeHigh, pList, 4); memcpy(&dwFileSizeLow, pList + 4, 4); CString strSize; - strSize.Format(_T("%10d KB"), (dwFileSizeHigh * (MAXDWORD)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); + strSize.FormatL(_T("%10d KB"), (dwFileSizeHigh * (MAXDWORD)) / 1024 + dwFileSizeLow / 1024 + (dwFileSizeLow % 1024 ? 1 : 0)); m_list_remote_search.SetItemText(nItem, 1, strSize); memcpy(&ftm_strReceiveLocalFileTime, pList + 8, sizeof(FILETIME)); CTime time(ftm_strReceiveLocalFileTime); - m_list_remote_search.SetItemText(nItem, 2, time.Format(_T("%Y-%m-%d %H:%M"))); + m_list_remote_search.SetItemText(nItem, 2, time.FormatL(_T("%Y-%m-%d %H:%M"))); PathRemoveFileSpec(pszFileName); //去除文件名获取文件路径 m_list_remote_search.SetItemText(nItem, 3, pszFileName); @@ -2482,7 +2485,7 @@ void CFileManagerDlg::ShowSearchPlugList() } m_list_remote_search.EnableWindow(TRUE); CString strMsgShow; - strMsgShow.Format(_T("共搜索到 %d 个"), i); + strMsgShow.FormatL(_T("共搜索到 %d 个"), i); DWORD_PTR dwResult; SendMessageTimeout(m_wndStatusBar.GetSafeHwnd(), SB_SETTEXT, 2, (LPARAM)(strMsgShow.GetBuffer()), SMTO_ABORTIFHUNG | SMTO_BLOCK, 500, & dwResult); m_list_remote_search.ShowWindow( SW_SHOW); diff --git a/server/2015Remote/file/CFileManagerDlg.h b/server/2015Remote/file/CFileManagerDlg.h index 63bbe0d..608ed0e 100644 --- a/server/2015Remote/file/CFileManagerDlg.h +++ b/server/2015Remote/file/CFileManagerDlg.h @@ -73,7 +73,7 @@ public: strList m_Remote_Upload_Job; strList m_Remote_Delete_Job; - void ShowMessage(TCHAR* lpFmt, ...); + void ShowMessage(const TCHAR* lpFmt, ...); CString m_Remote_Path; CStringA CopyFileNAme;; BYTE m_bRemoteDriveList[2048]; diff --git a/server/2015Remote/file/CFileTransferModeDlg.cpp b/server/2015Remote/file/CFileTransferModeDlg.cpp index e69266b..c976206 100644 --- a/server/2015Remote/file/CFileTransferModeDlg.cpp +++ b/server/2015Remote/file/CFileTransferModeDlg.cpp @@ -14,14 +14,14 @@ using namespace file; CFileTransferModeDlg::CFileTransferModeDlg(CWnd* pParent /*=NULL*/) - : CDialog(CFileTransferModeDlg::IDD, pParent) + : CDialogLang(CFileTransferModeDlg::IDD, pParent) { } void CFileTransferModeDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); } @@ -46,10 +46,10 @@ void CFileTransferModeDlg::OnEndDialog(UINT id) BOOL CFileTransferModeDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); CString str; - str.Format(_T("此文件夹已包含一个名为“%s”的文件"), m_strFileName); + str.FormatL(_T("此文件夹已包含一个名为“%s”的文件"), m_strFileName); for (int i = 0; i < str.GetLength(); i += 120) { str.Insert(i, _T("\n")); diff --git a/server/2015Remote/file/CFileTransferModeDlg.h b/server/2015Remote/file/CFileTransferModeDlg.h index bed3072..8ceeda4 100644 --- a/server/2015Remote/file/CFileTransferModeDlg.h +++ b/server/2015Remote/file/CFileTransferModeDlg.h @@ -3,11 +3,12 @@ ///////////////////////////////////////////////////////////////////////////// // CFileTransferModeDlg dialog +#include "LangManager.h" namespace file { -class CFileTransferModeDlg : public CDialog +class CFileTransferModeDlg : public CDialogLang { public: CString m_strFileName; diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini new file mode 100644 index 0000000..a9b4f69 --- /dev/null +++ b/server/2015Remote/lang/en_US.ini @@ -0,0 +1,1120 @@ +; English Language File +; Format: Chinese=English + +[Strings] +; ============================================ +; Main Window & Menus (保持完整,菜单不缩减) +; ============================================ +远程控制=Remote Control +菜单(&F)=&Menu +文件(&F)=&File +设置(&S)=&Settings +工具(&T)=&Tools +帮助(&H)=&Help +参数(&P)=&Params +扩展(&X)=E&xtensions +其他(&H)=&Other +退出=Exit +退出(&Q)=E&xit +关于=About +关于YAMA=About YAMA + +; ============================================ +; Toolbar +; ============================================ +生成客户端=Build Client +刷新=Refresh +设置=Settings +终端管理=Terminal +进程管理=Process +窗口管理=Windows +桌面管理=Desktop +文件管理=Files +语音管理=Audio +视频管理=Video +服务管理=Services +注册表管理=Registry +键盘记录=Keylog +参数设置=Settings +生成服务端=Build Svc +帮助=Help + +; ============================================ +; Client List Headers +; ============================================ +序号=No. +IP地址=IP Addr +地区=Region +计算机名=PC Name +操作系统=OS +CPU=CPU +摄像头=Camera +延迟=Ping +版本=Ver +启动时间=Uptime +备注=Note +分组=Group + +; ============================================ +; Online List Headers (g_Column_Data_Online) +; ============================================ +IP=IP +端口=Port +地理位置=Location +计算机名/备注=PC/Note +安装时间=Install Time +活动窗口=Active Window +RTT=RTT + +; ============================================ +; Message List Headers (g_Column_Data_Message) +; ============================================ +信息类型=Msg Type +时间=Time +信息内容=Content + +; ============================================ +; Dialog Captions (对话框标题保持清晰) +; ============================================ +远程桌面=Remote Desktop +文件管理=File Manager +进程管理=Process Mgr +窗口管理=Window Mgr +命令行=Shell +注册表=Registry +注册表管理=Registry Mgr +服务管理=Service Mgr +服务管理器=Service Mgr +键盘记录=Keylogger +语音监听=Audio Spy +视频监控=Video Spy +视频查看=Video View +远程终端=Terminal +远程文件=Remote File +远程音频=Remote Audio +远程视频=Remote Video +系统管理=System Mgr +生成服务端=Build Server +即时消息=Message +虚拟屏幕=Virtual Screen +隐私屏幕=Privacy Screen +代理服务=Proxy Service +注入设置=Inject Config +创建计划任务=Scheduled Task +解密数据=Decrypt Data +画板=Drawing +屏幕墙=Screen Wall +替换图标=Replace Icon +发送文件=Send File +历史主机=Host History +升级程序=Update +确认文件替换=Confirm Replace +文件已经存在=File Exists +压缩文件框=Compress +新建=New +口令=Password +生成口令=Gen Password +拷贝目录-运行命令=Copy & Run +对话=Dialog + +; ============================================ +; Language Selection Dialog +; ============================================ +选择语言 / Select Language=Select Language +语言:=Language: + +; ============================================ +; Common Buttons +; ============================================ +确定=OK +取消=Cancel +应用=Apply +关闭=Close +是=Yes +否=No +浏览=Browse +保存=Save +打开=Open +发送=Send +生成=Generate +创建=Create +启动=Start +停止=Stop +暂停=Pause +继续=Resume +注入=Inject +锁定=Lock +覆盖=Overwrite +继传=Resume +跳过=Skip +全部覆盖=Overwrite All +全部继传=Resume All +全部跳过=Skip All + +; ============================================ +; File Manager +; ============================================ +本地文件=Local Files +远程文件=Remote Files +本地=Local +远程=Remote +本地路径:=Local Path: +远程路径:=Remote Path: +上传=Upload +下载=Download +删除=Delete +新建文件夹=New Folder +文件名=Name +大小=Size +修改时间=Modified +搜索文件名:=Search: +包含子文件夹=Include Subdirs +开始搜索=Search +停止搜索=Stop +搜索栏=Results +上一层=Up +切换显示=Toggle View +路径:=Path: +传输(&T)=&Transfer +自定义压缩(&C)=Custom &Compress +自定义解压(&U)=Custom &Extract +重命名(&R)=&Rename +删除(&D)=&Delete +新建文件夹(&N)=&New Folder +本地打开(&O)=&Open Local +远程打开(&O)=&Open Remote +显示运行(&S)=Run &Visible +隐藏运行(&H)=Run &Hidden +刷新(&R)=&Refresh +大图标=Large Icons +小图标=Small Icons +列表=List +详细信息=Details + +; ============================================ +; Process Manager +; ============================================ +进程名=Name +进程ID=PID +结束进程=End Process +结束(&T)=&Terminate +刷新(&R)=&Refresh +结束=End +反黑屏=Anti-Black + +; ============================================ +; Window Manager +; ============================================ +隐藏=Hide +显示=Show +最大化=Maximize +最小化=Minimize + +; ============================================ +; Screen Spy / Remote Desktop +; ============================================ +全屏=Fullscreen +控制=Control +仅查看=View Only +画质=Quality +帧率=FPS +黑白屏幕=Grayscale +高速屏幕=High Speed +极速屏幕=Ultra Speed +屏幕截图方法:=Capture: +图像压缩方法:=Compress: +多显示器支持:=Multi-Mon: +退出全屏=Exit Full +控制屏幕=Control +放下面=Send Back +透明度=Opacity +截图=Capture + +; ============================================ +; Settings Dialog +; ============================================ +常规设置=General +网络设置=Network +参数设置=Parameters +桌面管理=Desktop +监听端口=Listen Port +监听端口:=Port: +最大连接数=Max Conns +最大连接数:=Max Conns: +语言=Language +保存设置=Save +公网地址:=Public IP: +上报间隔:=Interval: +软件检测:=Detection: +多屏上墙:=Multi-Wall: +UDP协议参数:=UDP Params: +FRP 代理:=FRP Proxy: +服务端口:=Server Port: +下载端口:=DL Port: +操作提示: 1.监听端口支持填写多个,用英文分号分隔;程序同时监听TCP和UDP,且支持基于UDP的KCP;=Tip: Multiple ports separated by semicolons; supports TCP, UDP and KCP. +操作提示: 2.如果被控端跨网、地区或国家,务必设置公网IP;勾选FRP反向代理并设置服务端口和 token。=Tip: Set public IP for cross-network; enable FRP and set port/token. + +; ============================================ +; Build Client Dialog +; ============================================ +服务程序:=Program: +架构:=Arch: +模式:=Mode: +未选择文件=Not selected +主控IP地址:=Master IP: +协议:=Protocol: +加密:=Encrypt: +分组名称:=Group: +加壳:=Packer: +载荷类型:=Payload: +程序增肥:=Padding: +安装目录:=Install Dir: +程序名称:=Name: +下载服务=Download Svc +下载地址(默认本机):=Download URL: +通用=General +高级 (非必填项)=Advanced (Optional) +提示: 多个上线地址用分号分隔,99个字符以内。仅供学习和自用,严禁用于非法目的使用。=Tip: Multiple addresses separated by semicolons, max 99 chars. + +; ============================================ +; Service Manager +; ============================================ +服务名称:=Service: +显示名称:=Display: +描述:=Desc: +可执行文件路径=Exe Path +启动类型:=Startup: +服务状态:=Status: +启动方式=Startup Type +自动启动=Auto +手动启动=Manual +停止服务=Stop Svc +启动服务=Start Svc + +; ============================================ +; Audio Dialog +; ============================================ +正在监听远程声音...=Listening remote audio... +发送本地语音到远程=Send local audio + +; ============================================ +; Chat Dialog +; ============================================ +发送消息=Send Msg +结束交谈=End Chat +锁定屏幕\n屏蔽功能键=Lock Screen\nBlock Keys +解除锁定=Unlock + +; ============================================ +; Authorization Dialog +; ============================================ +序 列 号:=Serial No: +授权口令:=Auth Code: +授权方式:=Auth Type: +验 证 码:=Verify: +序列号:=Serial: +密 码:=Password: +口 令:=Token: +有效期:=Expiry: +连接数:=Max Conns: + +; ============================================ +; Injection Dialog +; ============================================ +文件路径: =File Path: +注入方式:=Inject Type: +落地目录:=Drop Dir: + +; ============================================ +; Scheduled Task Dialog +; ============================================ +任务名:=Task Name: +文件路径:=File Path: +作者:=Author: +描述:=Desc: + +; ============================================ +; New Folder Dialog +; ============================================ +请输入目录:=Dir Name: +另一个输入框:=Input: +提示信息=Info +输入数据:=Input Data: + +; ============================================ +; Copy Directory Dialog +; ============================================ +原目录=Source Dir +现目录=Target Dir +命令=Command + +; ============================================ +; Replace Icon Dialog +; ============================================ +目标程序=Target Exe +图标文件=Icon File +提示: 替换完成后,请刷新程序进行查看;如若未成功,请更换图标重试。=Tip: Refresh after replace; try another icon if failed. + +; ============================================ +; Send File Dialog +; ============================================ +发送文件(999/999):=Sending (999/999): + +; ============================================ +; Update Dialog +; ============================================ +目标程序类型:=Target Type: + +; ============================================ +; Wallet Dialog +; ============================================ +比特币 (BTC):=Bitcoin (BTC): +提示信息: 劫持并替换被控端钱包地址;总字符数最多是470,只填写所需的地址,不需要全部填满。=Tip: Replace wallet address; max 470 chars total. +警告信息: 此功能仅用于开源项目之研究,用户自行承担后果,不得用于非法目的。=Warning: For research only; user assumes all responsibility. + +; ============================================ +; Rar/Compress Dialog +; ============================================ +Rar文件名称:=Rar Filename: + +; ============================================ +; Context Menu - Client Management (菜单保持完整) +; ============================================ +修改备注=Edit Note +修改分组=Edit Group +添加关注=Add Watch +客户管理=Client Mgmt +转移主机=Transfer Host +分享主机=Share Host +删除主机=Delete Host +卸载主机=Uninstall Host +客户代理=Client Proxy +代理映射=Proxy Mapping +代理端口=Proxy Port +提权运行=Run as Admin +执行程序=Execute +下载执行=Download & Run +上传执行=Upload & Run +升级程序=Update +延长授权=Extend Auth +撤销授权=Revoke Auth +注入记事本=Inject Notepad +机器管理=Machine Mgmt +注销=Log Off +关机=Shutdown +重启=Restart + +; ============================================ +; Main Menu Items (菜单保持完整) +; ============================================ +设置(&S)=&Settings +钱包(&W)=&Wallet +输入口令(&I)=&Input Password +仅生成 -> C语言数组=Generate -> C Array +仅生成 -> bin 文件=Generate -> bin File +测试 bin 文件(&T)=&Test bin File +生成+混淆 -> C语言数组=Generate+Obfuscate -> C Array +生成+混淆 -> bin 文件=Generate+Obfuscate -> bin File +解混淆+测试 bin 文件(&D)=&Deobfuscate+Test bin +生成+AES -> C语言数组=Generate+AES -> C Array +生成+AES -> bin 文件=Generate+AES -> bin File +测试 AES bin文件=Test AES bin File +替换图标(&R)=&Replace Icon +刷新插件(&P)=Refresh &Plugins +口令生成(&A)=&Auth Generate +主控生成(&M)=&Master Generate +上线提醒=Online Notify +启用日志=Enable Log +转发系统热键=Forward Hotkeys +守护主控程序=Guard Master +历史主机(&C)=&Client History +迁移数据(&D)=Backup &Data +导入数据(&I)=&Import Data +获取插件(&P)=Get &Plugins +切换语言(&L)=Switch &Language +免责声明=Disclaimer +发送反馈=Send Feedback +软件介绍=About Software +请求授权=Request Auth + +; ============================================ +; Build Settings Menu (菜单保持完整) +; ============================================ +参数详解(&A)=Parameter &Details +加密 IP (&E)=&Encrypt IP +随机名称(&R)=&Random Name +提权安装(&P)=Install as &Admin +标识信息(&F)=&Fingerprint Info + +; ============================================ +; Decrypt Menu (菜单保持完整) +; ============================================ +解密(&D)=&Decrypt +Chrome 浏览器=Chrome Browser +Edge 浏览器=Edge Browser +360 极速浏览器=360 Speed Browser +360 浏览器=360 Browser +QQ 浏览器=QQ Browser + +; ============================================ +; Drawing Menu (菜单保持完整) +; ============================================ +置顶窗口=Always on Top +半透明=Transparent +位置跟随=Follow Position +大小跟随=Follow Size +编辑=Edit +文字=Text +清空=Clear + +; ============================================ +; Tray Menu +; ============================================ +显示=Show +退出=Exit + +; ============================================ +; Status Bar +; ============================================ +进度=Progress + +; ============================================ +; String Table +; ============================================ +远程终端=Terminal +进程管理=Process Mgr +窗口管理=Window Mgr +远程桌面=Remote Desktop +文件管理=File Manager +语音监听=Audio Monitor +视频查看=Video Viewer +服务管理=Service Mgr +注册表查看=Registry View +服务生成=Build Service +帮助=Help +参数配置=Configuration +键盘记录=Keylogger + +; ============================================ +; Status Messages +; ============================================ +在线=Online +离线=Offline +连接中=Connecting +已连接=Connected +未连接=Disconnected + +; ============================================ +; Confirmation Messages +; ============================================ +确定要退出吗?=Are you sure to exit? +确定要删除选中的客户端吗?=Delete selected clients? +连接成功=Connected +连接失败=Connect Failed +操作成功=Success +操作失败=Failed + +; ============================================ +; MessageBox Titles +; ============================================ +提示=Info +错误=Error +警告=Warning +确认删除=Confirm Delete +异常=Exception +免责声明=Disclaimer +进程结束警告=End Process Warning +路径 确认拷贝到剪切板=Copy Path to Clipboard +注意=Notice + +; ============================================ +; MessageBox Messages - Main Dialog +; ============================================ +一个主控程序已经在运行,请检查任务管理器。=A master program is already running. Check Task Manager. +请勿HOOK此程序!=Do not HOOK this program! +创建执行代码的子菜单失败!=Failed to create code execution submenu! +请选择一个被控程序进行升级!=Please select a client to upgrade! +确定升级选定的被控程序吗?=Upgrade selected client? +需受控程序支持方可生效!=Requires client support to take effect! +确定删除选定的被控计算机吗?=Delete selected remote computer? +计算机已经被用户锁屏,程序无 SYSTEM 权限。=PC is locked, no SYSTEM privilege. +可能无法进行远程桌面控制,是否继续?=Remote desktop may fail. Continue? +格式错误,请重新申请口令!=Format error, please re-apply for token! +口令错误, 无法继续操作!=Token error, cannot continue! +请通过工具菜单重新输入口令。=Please re-enter token via Tools menu. +口令过期,请重新申请口令!=Token expired, please re-apply! +修改FRP代理开关,需要重启当前应用程序方可生效。=FRP proxy change requires app restart. +FRP代理服务异常,需要重启当前应用程序进行重试。=FRP proxy error, restart app to retry. +字符串长度超出[0, 250]范围限制!=String length exceeds [0, 250] limit! +备注信息长度不能超过64个字符=Note cannot exceed 64 characters +请通过菜单设置当前主控程序的公网地址(域名)!=Please set master public IP via menu! +此地址会写入即将生成的主控程序中。=This address will be written to the master. +密码不正确,无法生成主控程序!=Wrong password, cannot generate master! +密码长度不能大于15。=Password cannot exceed 15 characters. +读取文件失败! 请稍后再次尝试。=Failed to read file! Please try again later. +操作文件失败! 请稍后再次尝试。=File operation failed! Please try again. +写入哈希失败! 无法生成主控。=Failed to write hash! Cannot generate master. +Explorer 未正确初始化! 请稍后再试。=Explorer not initialized! Try again later. +文件对话框未成功打开! 请稍后再试。=File dialog failed! Please try again later. +主控程序创建失败!=Master program creation failed! +正在UPX压缩,请关注信息提示。=UPX compressing, watch for notifications. +文件位于: =File located at: +生成成功! 文件位于:=Success! File at: +请将64位的DLL放于主控程序的 'Plugins' 目录,再来点击此项菜单。=Place 64-bit DLL in 'Plugins' folder first. +密码不正确!=Wrong password! +本软件仅限于合法、正当、合规的用途。=This software is for legal use only. +您是否同意?=Do you agree? +如需修改授权信息,请联系管理员。是否现在修改授权?=Contact admin to modify auth. Modify now? +文件打开失败! 请稍后再试。=Failed to open file! Try again later. +Shellcode 执行成功! =Shellcode executed successfully! +Shellcode 执行失败! 请用本程序生成的 bin 文件进行测试! =Shellcode failed! Test with bin file from this program. +Shellcode 生成成功! 请自行编写调用程序。=Shellcode generated! Write your own loader. +是否测试 =Test +64位=64-bit +32位=32-bit +Shellcode 二进制文件? =Shellcode binary file? +超出使用时间可输入的字符数限制!=Time input exceeds character limit! +确定要以管理员权限重新启动目标应用程序吗?=Restart target app as admin? +此操作可能触发 UAC 账户控制。=This may trigger UAC prompt. +超出钱包地址可输入的字符数限制!=Wallet address exceeds character limit! +确定卸载选定的被控程序吗?=Uninstall selected client? +分组名称长度不得超过24个字符!=Group name cannot exceed 24 characters! +此操作需客户端具有管理员权限,确定继续吗? =This requires admin privilege. Continue? +无法读取文件!=Cannot read file! +文件为空或超过12MB,无法使用此功能!=File empty or >12MB, cannot use this function! +请将64位的DLL放于主控程序的 'Plugins' 目录,是否继续?=Place 64-bit DLL in 'Plugins' folder. Continue? +没有找到在线主机: =No online host found: +没有反黑屏插件: =No anti-black plugin: +需要正确启用FRP反向代理方可使用此功能!=Enable FRP proxy to use this function! +请通过=Please access via +访问代理端口!=the proxy port! +远程控制时,=During remote control, +转发系统热键到远程桌面。=forward system hotkeys to remote. +不=do not +以传统方式启动主控程序,没有守护进程。=Start master normally without guard process. +如果更换主控IP,必须将主机迁移到新的主控IP名下。=Transfer hosts when changing master IP. +注意,更换主控程序的机器可能导致授权失效!=Changing master machine may invalidate auth! +语言已切换,重启程序后生效。=Language changed. Restart to apply. +导入主控程序的历史主机记录。=Import master's host history. +此操作会覆盖本机的历史记录,请仅在迁移主控程序时进行操作。=This overwrites local history. Only for migration. + +; ============================================ +; MessageBox Messages - Build Dialog +; ============================================ +Shellcode 只能向64位电脑注入,注入器也只能是64位!=Shellcode only injects to 64-bit, injector must be 64-bit! +出现内部错误,请检查输入,重新编译程序!=Internal error, check input and recompile! +客户端版本比主控程序更高, 无法生成!=Client version higher than master, cannot build! +出现内部错误,未能找到标识信息!=Internal error, fingerprint not found! +服务程序创建失败!=Service program creation failed! +文件下载地址: =File download URL: +文件生成失败: =File generation failed: +ShellCode 转换异常, 异常代码: =ShellCode conversion error, code: +内存异常:=Memory exception: +文件异常:=File exception: +其他异常:=Other exception: +安装Windows服务必须设置,客户端运行时会请求管理员权限,可能会触发系统UAC提示。=Install service requires admin, may trigger UAC. +使用 ShellCode AES 在程序尾部追加载荷,可能无法在某些服务器系统运行! =ShellCode AES payload may not work on some servers! +文件名不合法,请检查:=Invalid filename, check: +请提供载荷的下载地址。下载地址前缀为 http 或 https。=Provide payload URL with http or https prefix. + +; ============================================ +; MessageBox Messages - Password Dialog +; ============================================ +请确认是否正确设置公网地址(IP或域名)?=Confirm public IP/domain is set correctly? +您输入的密码不正确,无法生成口令!=Wrong password, cannot generate token! + +; ============================================ +; MessageBox Messages - RC Edit Dialog +; ============================================ +请选择目标应用程序!=Please select target application! +请选择[*.ico]图标文件!=Please select [*.ico] icon file! +解压程序失败,无法替换图标!=Decompress failed, cannot replace icon! +替换图标失败,错误代码: =Replace icon failed, error code: + +; ============================================ +; MessageBox Messages - File Manager +; ============================================ +文件夹为空=Folder is empty +压缩失败: =Compress failed: +解压失败: =Extract failed: +请先选择要压缩的文件或文件夹!=Select files/folders to compress first! +请先选择要解压的.zsta文件!=Select .zsta file to extract first! +文件创建失败=File creation failed +文件写入失败!=File write failed! +请拖拽到文件管理器选定目录中=Drag to selected directory in File Manager +请选择文件!=Please select a file! +ZIP压缩完成=ZIP compression complete +请选择目录!=Please select a directory! +搜索关键词太长=Search keyword too long + +; ============================================ +; MessageBox Messages - System Dialog +; ============================================ +只能同时向一个进程进行代码注入!=Can only inject to one process at a time! +确定要向目标进程 (仅限64位) 进行代码注入吗?=Inject code to target process (64-bit only)? +此操作可能被安全软件阻止,或导致进程崩溃!=May be blocked by security software or crash process! +只能同时向一个进程进行反黑屏操作!=Can only anti-black one process at a time! +确定要向目标进程进行反黑屏吗?=Apply anti-black to target process? +请确保目标进程、DLL及被控端架构务必相同!=Ensure process, DLL and client are same architecture! + +; ============================================ +; MessageBox Messages - Other Dialogs +; ============================================ +初始化代理服务器失败!=Failed to initialize proxy server! +创建录像文件失败:=Failed to create video file: +错误代码: =Error code: +文件保存失败:=File save failed: +已复制数据到剪切板!=Data copied to clipboard! +确定要卸载该程序?=Uninstall this program? + +; ============================================ +; List Columns - File Manager +; ============================================ +名称=Name +类型=Type +总大小=Total Size +可用空间=Free Space +修改日期=Modified +文件路径=File Path + +; ============================================ +; List Columns - Process/Window Manager +; ============================================ +映像名称=Image Name +PID=PID +程序路径=Program Path +架构=Arch +句柄=Handle +窗口名称=Window Title +窗口状态=Window State +所属进程ID=Owner PID + +; ============================================ +; List Columns - Service Manager +; ============================================ +真实名称=Real Name +显示名称=Display Name +启动类型=Startup Type +运行状态=Run Status +可执行文件路径=Executable Path + +; ============================================ +; List Columns - Registry Manager +; ============================================ +数据=Data + +; ============================================ +; List Columns - Machine Dialog +; ============================================ +优先级=Priority +线程数=Threads +用户名=User +内存=Memory +文件大小=File Size +句柄HWND=Handle HWND +进程名=Process +进程位数=Process Bits +协议=Protocol +本地地址:端口=Local Addr:Port +远程地址:端口=Remote Addr:Port +目标IP归属地=Target IP Location +连接状态=Conn Status +软件名称=Software Name +发行商=Publisher +安装时间=Install Date +卸载命令及参数=Uninstall Cmd +访问时间=Visit Time +标题=Title +网页地址=Web URL +收藏名称=Bookmark Name +Url=URL +描述=Description +状态=Status +登陆身份=Logon As +桌面交互=Desktop Interaction +服务名=Service Name +目录=Directory +任务名称=Task Name +最后执行时间=Last Run +下次执行时间=Next Run + +; ============================================ +; ComboBox Items - Build Dialog +; ============================================ +TestRun - 磁盘DLL=TestRun - Disk DLL +TestRun - 内存DLL=TestRun - Memory DLL +TestRun - 注入任务管理器=TestRun - Inject TaskMgr +ghost.exe - Windows 服务=ghost.exe - Windows Service +TestRun - Windows 服务=TestRun - Windows Service +选择文件=Select File +随机上线=Random Connect +并发上线=Parallel Connect +随机=Random +无=None +载荷写入当前程序尾部=Payload append to current exe +载荷写入单独的二进制文件=Payload to separate binary +载荷写入 BMP 格式图片=Payload to BMP image +载荷写入 JPG 格式图片=Payload to JPG image +载荷写入 PNG 格式图片=Payload to PNG image +载荷写入 ZIP 压缩包=Payload to ZIP archive +载荷写入 PDF 文件=Payload to PDF file + +; ============================================ +; ComboBox Items - Password Dialog +; ============================================ +计算机硬件信息=PC Hardware Info +主控IP或域名信息=Master IP/Domain Info + +; ============================================ +; ComboBox Items - Settings Dialog +; ============================================ +灰度图像传输=Grayscale Transfer +屏幕差异算法=Screen Diff Algorithm +H264压缩算法=H264 Compression +电报=Telegram + +; ============================================ +; ComboBox Items - Inject Dialog +; ============================================ +CreateRemoteThread(落地反射注入)=CreateRemoteThread(Reflective DLL) +QueueUserAPC(落地反射注入)=QueueUserAPC(Reflective DLL) +NtCreateThreadEx(落地反射注入)=NtCreateThreadEx(Reflective DLL) +CreateRemoteThread(shellcode注入)=CreateRemoteThread(Shellcode) +QueueUserAPC(shellcode注入)=QueueUserAPC(Shellcode) +NtCreateThreadEx(shellcode注入)=NtCreateThreadEx(Shellcode) + +; ============================================ +; ComboBox Items - Service Info Dialog +; ============================================ +自动=Auto +手动=Manual +已禁用=Disabled + +; ============================================ +; Menu Items - Main Dialog +; ============================================ +序列号=Serial Number +操作指导=Guide +执行代码=Execute Code + +; ============================================ +; Menu Items - Screen Spy Dialog +; ============================================ +刷新(&F)=&Refresh +控制屏幕(&Y)=Control Screen(&Y) +保存快照(&S)=Save Snapshot(&S) +录像(MJPEG)=Record(MJPEG) +录像(H264)=Record(H264) +获取剪贴板(&R)=Get Clipboard(&R) +设置剪贴板(&L)=Set Clipboard(&L) +修复分辨率(&G)=Fix Resolution(&G) +清晰度低60/100=Quality Low 60/100 +清晰度中85/100=Quality Mid 85/100 +清晰度高100/100=Quality High 100/100 +打开-文件管理(&B)=Open-FileManager(&B) +打开-运行(&H)=Open-Run(&H) +打开-Powershell(&N)=Open-Powershell(&N) +打开-Chrome(&I)=Open-Chrome(&I) +打开-Edge(&M)=Open-Edge(&M) +打开-Brave(&D)=Open-Brave(&D) +打开-Firefox(&V)=Open-Firefox(&V) +打开-Iexplore(&Z)=Open-Iexplore(&Z) +自定义CMD命令(&y)=Custom CMD Command(&y) +高级自定义命令(&O)=Advanced Custom Command(&O) +清理后台(&J)=Clean Background Processes(&J) +全屏(&F)=Fullscreen(&F) +使用远程光标(&C)=Use Remote Cursor(&C) +自适应窗口大小(&A)=Adaptive Window Size(&A) +跟踪被控端鼠标(&T)=Track Remote Cursor(&T) +锁定被控端鼠标和键盘(&L)=Lock Remote Input(&L) +切换显示器(&1)=Switch Monitor(&1) +多线程压缩(&2)=Multi-thread Compress(&2) +原始分辨率(&3)=Original Resolution(&3) +限制为1080P(&4)=Limit to 1080P(&4) +最大帧率FPS:10=Max FPS:10 +最大帧率FPS:15=Max FPS:15 +最大帧率FPS:20=Max FPS:20 +最大帧率FPS:25=Max FPS:25 +最大帧率FPS:30=Max FPS:30 +最大帧率无限制=Max FPS Unlimited +帧率设置=Frame Rate Settings + +; ============================================ +; Menu Items - Keyboard Dialog +; ============================================ +离线记录(&O)=Offline Recording(&O) +清空记录(&C)=Clear Records(&C) +保存记录(&S)=Save Records(&S) + +; ============================================ +; Menu Items - Video Dialog +; ============================================ +视频压缩(&C)=Video Compression(&C) +保存录像(&V)=Save Recording(&V) + +; ============================================ +; Menu Items - File Manager Dialog +; ============================================ +分区高级搜索=Advanced Partition Search +下载(附带目录结构)=Download(With Dir Structure) +打开文件位置=Open File Location + +; ============================================ +; Menu Items - Proxy Dialog +; ============================================ +代理打开Chrome(请关闭所有Chrome进程)(&P)=Proxy Open Chrome(Close all Chrome)(&P) + +; ============================================ +; Menu Items - Machine Dialog +; ============================================ +刷新数据(&F)=Refresh Data(&F) +复制数据(&V)=Copy Data(&V) +删除文件(&C)=Delete File(&C) +结束进程(&E)=End Process(&E) +冻结进程(&D)=Freeze Process(&D) +解冻进程(&J)=Unfreeze Process(&J) +强删文件(&Q)=Force Delete File(&Q) +注入管理(&I)=Injection Manager(&I) +还原窗口(&H)=Restore Window(&H) +隐藏窗口(&Y)=Hide Window(&Y) +关闭窗口(&E)=Close Window(&E) +最 大 化(&M)=Maximize Window(&M) +最 小 化(&I)=Minimize Window(&I) +卸载程序(&X)=Uninstall Program(&X) +&(R)执行任务=&(R)Run Task +&(T)停止任务=&(T)Stop Task +&(D)删除任务=&(D)Delete Task +&(C)创建任务=&(C)Create Task +&(F)刷新任务=&(F)Refresh Task +启动(&S)=Start(&S) +停止(&O)=Stop(&O) +暂停(&U)=Pause(&U) +恢复(&M)=Resume(&M) +重新启动(&E)=Restart(&E) +刷新(&R)=Refresh(&R) +属性(&R)=Properties(&R) +删除服务(&D)=Delete Service(&D) +修改远程文件(&S)=Edit Remote File(&S) +加载本地文件(&S)=Load Local File(&S) +结束进程(&C)=End Process(&C) + +; ============================================ +; FormatL - Dialog Title Formats +; ============================================ +%s - 语音监听=%s - Audio Spy +%s - 画板演示=%s - Drawing Board +%s - 解密数据=%s - Decrypt Data +%s - 文件管理=%s - File Manager +%s - 远程虚拟屏幕 %d×%d=%s - Virtual Screen %d×%d +%s - 键盘记录=%s - Keylogger +%s - 注册表管理=%s - Registry Manager +%s - 远程桌面控制 %d×%d=%s - Remote Desktop %d×%d +%s - 代理服务=%s - Proxy Service +%s - 服务管理=%s - Service Manager +%s - 远程终端=%s - Terminal +%s - 进程管理=%s - Process Manager +%s - 窗口管理=%s - Window Manager +%s - 视频管理 %d×%d=%s - Video %d×%d +远程交谈 - %s=Remote Chat - %s +文件管理 - %s=File Manager - %s +主机管理 - %s=Machine Mgr - %s + +; ============================================ +; FormatL - Status Messages +; ============================================ +有%d个主机在线=%d hosts online +监听端口: %s成功=Listen port: %s success +发送文件(%d/%d): %.2f%%=Sending file(%d/%d): %.2f%% +接收文件(%d/%d): %.2f%%=Receiving file(%d/%d): %.2f%% +%s (%d台设备)=%s (%d devices) +服务个数:%d=Services: %d +程序个数 / %d=Programs / %d +窗口名称 窗口个数【%d】=Window Title Windows: [%d] +程序路径 / %d=Program Path / %d +窗口名称 / %d=Window Title / %d +无权限或无数据=No permission or no data +共 %d 个服务=Total %d services +已经搜索 %d 请勿再次搜索=Already searched %d, do not search again +共搜索到 %d 个=Found %d items +软件有效期限: %s — %s, 并发连接数量: %d.=Software valid: %s — %s, max connections: %d. + +; ============================================ +; FormatL - Confirmation Messages +; ============================================ +确定要将这 %d 项删除吗?=Delete these %d items? +确实要删除文件夹"%s"并将所有内容删除吗?=Delete folder "%s" and all contents? +确实要把"%s"删除吗?=Delete "%s"? +此文件夹已包含一个名为"%s"的文件=This folder already contains a file named "%s" +%s确实\n想终止这%d项进程吗?=%sAre you sure\nyou want to terminate these %d processes? +%s确实\n想终止该项进程吗?=%sAre you sure\nyou want to terminate this process? + +; ============================================ +; FormatL - Info Panel +; ============================================ +\r\n进程 PID: %s %s=\r\nProcess PID: %s %s +文件路径: %s%s %s%s\r\n系统信息: %s 位 %s 核心 %s GB %s\r\n启动信息: %s %s %s%s %s\r\n上线信息: %s %d %s\r\n客户信息: %s=File path: %s%s %s%s\r\nSystem: %s-bit %s cores %s GB %s\r\nStartup: %s %s %s%s %s\r\nOnline: %s %d %s\r\nClient: %s + +; ============================================ +; FormatL - Proxy Dialog +; ============================================ +SOCKS 代理软件请设置服务器为: <127.0.0.1:%d>\r\n=SOCKS proxy server: <127.0.0.1:%d>\r\n + +; ============================================ +; _TR - Additional Dialog Init/Prompt Strings +; ============================================ +操作错误=Operation Error +内部错误=Internal Error +使用提示=Usage Tips +严禁用于非法侵入、控制、监听他人设备等违法行为=Unauthorized access, control, or surveillance of devices is strictly prohibited +有=Yes +主机下线=Host Offline +UPX 处理完成=UPX Processing Complete +主控生成=Master Generate +当前主控程序的密码:=Current master password: +主控密码=Master Password +新的主控程序的密码:=New master password: +使用天数=Usage Days +新主控程序使用天数:=New master usage days: +需要密码=Password Required +主控程序授权天数:=Master auth days: +并发上线机器数量:=Max concurrent machines: +序列号(唯一ID):=Serial number (unique ID): +断开连接=Disconnected +请输入分组名称:=Enter group name: +远程下载地址:=Remote download URL: +请将EXE放在"Payloads"目录或输入下载地址。=Put EXE in "Payloads" folder or enter download URL. +可执行文件 (*.exe)|*.exe||=Executable Files (*.exe)|*.exe|| +请输入客户端端口:=Enter client port: +达到最大连接数=Max connections reached + +; ============================================ +; _TRF - Format Strings +; ============================================ +达到最大连接数限制: %lu, 请释放连接=Max connection limit: %lu, please release connections + +; ============================================ +; _L - Expression Strings +; ============================================ +授权成功=Authorization success +版本不支持=Version not supported +客户端版本最低要求: =Minimum client version: +以"服务+代理"形式启动主控程序,会开机自启及被守护。=Start master as service+proxy, auto-start and guarded. + +; ============================================ +; New Strings - 2015Remote.cpp +; ============================================ +启动TCP服务失败: =Failed to start TCP server: +。错误码: =. Error code: +启动UDP服务失败: =Failed to start UDP server: + +; ============================================ +; New Strings - 2015RemoteDlg.cpp +; ============================================ +禁界: 远程协助软件=YAMA: Remote Assistant +软件初始化成功...=Software initialized... +主机上线=Host Online +授权提醒=Authorization Notice +程序可能有使用限制,请联系管理员请求授权=Program may have usage limits. Contact admin for authorization. +下载服务启动失败,可能是端口被占用了。=Download service failed to start, port may be in use. +调用函数StartServer失败! 错误代码:=StartServer failed! Error code: +\r\n是否关闭以下进程重试: =\r\nClose these processes and retry: +压缩为 ZSTA 文件=Compress to ZSTA +解压 ZSTA 文件=Extract ZSTA +ZSTA 压缩文件=ZSTA Archive + +; ============================================ +; New Strings - Chat.cpp +; ============================================ +提示: 对方聊天对话框在发送消息后才会弹出=Tip: Remote chat dialog appears after you send a message + +; ============================================ +; New Strings - RegisterDlg.cpp +; ============================================ +(默认)=(Default) +(数据未设置值)=(Value not set) + +; ============================================ +; New Strings - sys\MachineDlg.cpp +; ============================================ +网络连接=Network +软件信息=Software +浏览记录=History +收 藏 夹=Bookmarks +WIN32服务=Win32 Services +驱动服务=Driver Services +计划任务=Scheduled Tasks +就绪=Ready +实时=Realtime +高=High +高于标准=Above Normal +标准=Normal +低于标准=Below Normal +空闲=Idle +未知=Unknown +正在接收数据 - 请稍后...=Receiving data - please wait... +发送还原命令=Restore command sent +发送隐藏命令=Hide command sent +发送关闭命令=Close command sent +发送最大化命令=Maximize command sent +发送最小化命令=Minimize command sent +选择文件=Select File + +; ============================================ +; New Strings - BuildDlg.cpp +; ============================================ +\r\n提示: 请生成"ServerDll.dll",以便程序正常运行。=\r\nTip: Generate "ServerDll.dll" for program to work properly. +\n提示: 使用KCP协议生成服务,必须设置主控UDP协议参数为1。=\nTip: For KCP protocol, set master UDP param to 1. + +; ============================================ +; New Strings - file\CFileManagerDlg.cpp +; ============================================ +远程计算机:磁盘列表=Remote PC: Disk List +共享=Shared +压缩完成=Compression Complete +请选择上传路径: =Select upload path: +请选择下载路径: =Select download path: +文件上传=File Upload +文件下载=File Download +正在搜索...=Searching... +重新搜索=Search Again +远程目录:%s=Remote Dir: %s +准备粘贴=Preparing to paste +开始压缩,不要关闭窗口,其他操作继续=Compressing, do not close window +删除目录:%s (完成)=Delete dir: %s (done) +删除文件:%s (完成)=Delete file: %s (done) +搜索完毕 共:%d 个文件=Search complete: %d files + +; ============================================ +; New Strings - FileManagerDlg.cpp +; ============================================ +传送文件=Sending +接收文件=Receiving +本地:装载目录 %s 完成=Local: loaded dir %s +远程:装载目录 %s 完成=Remote: loaded dir %s +本地:装载目录 %s\*.* 完成=Local: loaded dir %s\*.* +远程:装载目录 %s\*.* 完成=Remote: loaded dir %s\*.* +远程:删除目录 %s\*.* 完成=Remote: deleted dir %s\*.* +远程:删除文件 %s 完成=Remote: deleted file %s +远程:删除目录 %s (完成)=Remote: deleted dir %s (done) +远程:删除文件 %s (完成)=Remote: deleted file %s (done) + +; ============================================ +; New Strings - SystemDlg.cpp +; ============================================ +警告: 终止进程会导致不希望发生的结果,\n包括数据丢失和系统不稳定。在被终止前,\n进程将没有机会保存其状态和数据。=Warning: Terminating a process can cause undesired results,\nincluding data loss and system instability.\nThe process will have no chance to save its state or data. + +; ============================================ +; New Strings - CClientListDlg.cpp +; ============================================ +计算机名称=Computer Name +位置=Location +系统=System +最后登录=Last Login +关注=Watch +授权=Auth + +; ============================================ +; Encoding Check +; ============================================ +请使用ANSI编码的语言文件。=Please use ANSI encoded language files. + diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini new file mode 100644 index 0000000..f3cca95 --- /dev/null +++ b/server/2015Remote/lang/zh_TW.ini @@ -0,0 +1,1117 @@ +; Chinese (Traditional) Language File +; Format: Simplified Chinese=Traditional Chinese + +[Strings] +; ============================================ +; Main Window & Menus +; ============================================ +远程控制=遠端控制 +菜单(&F)=選單(&F) +文件(&F)=檔案(&F) +设置(&S)=設定(&S) +工具(&T)=工具(&T) +帮助(&H)=說明(&H) +参数(&P)=參數(&P) +扩展(&X)=擴充(&X) +其他(&H)=其他(&H) +退出=結束 +退出(&Q)=結束(&Q) +关于=關於 +关于YAMA=關於YAMA + +; ============================================ +; Toolbar +; ============================================ +生成客户端=產生用戶端 +刷新=重新整理 +设置=設定 +终端管理=終端機管理 +进程管理=處理程序 +窗口管理=視窗 +桌面管理=桌面 +文件管理=檔案 +语音管理=音訊 +视频管理=視訊 +服务管理=服務 +注册表管理=登錄編輯程式 +键盘记录=鍵盤記錄 +参数设置=參數設定 +生成服务端=產生伺服器 +帮助=說明 + +; ============================================ +; Client List Headers +; ============================================ +序号=序號 +IP地址=IP位址 +地区=地區 +计算机名=電腦名稱 +操作系统=作業系統 +CPU=CPU +摄像头=攝影機 +延迟=延遲 +版本=版本 +启动时间=啟動時間 +备注=備註 +分组=群組 + +; ============================================ +; Online List Headers (g_Column_Data_Online) +; ============================================ +IP=IP +端口=連接埠 +地理位置=地理位置 +计算机名/备注=電腦名稱/備註 +安装时间=安裝時間 +活动窗口=活動視窗 +RTT=RTT + +; ============================================ +; Message List Headers (g_Column_Data_Message) +; ============================================ +信息类型=訊息類型 +时间=時間 +信息内容=訊息內容 + +; ============================================ +; Dialog Captions +; ============================================ +远程桌面=遠端桌面 +文件管理=檔案管理 +进程管理=處理程序管理 +窗口管理=視窗管理 +命令行=命令列 +注册表=登錄編輯程式 +注册表管理=登錄編輯程式管理 +服务管理=服務管理 +服务管理器=服務管理員 +键盘记录=鍵盤記錄 +语音监听=語音監聽 +视频监控=視訊監控 +视频查看=視訊檢視 +远程终端=遠端終端機 +远程文件=遠端檔案 +远程音频=遠端音訊 +远程视频=遠端視訊 +系统管理=系統管理 +生成服务端=產生伺服器端 +即时消息=即時訊息 +虚拟屏幕=虛擬桌面 +隐私屏幕=隱私螢幕 +代理服务=代理服務 +注入设置=注入設定 +创建计划任务=建立排程工作 +解密数据=解密資料 +画板=繪圖板 +屏幕墙=螢幕牆 +替换图标=替換圖示 +发送文件=傳送檔案 +历史主机=歷史主機 +升级程序=升級程式 +确认文件替换=確認檔案替換 +文件已经存在=檔案已經存在 +压缩文件框=壓縮檔案框 +新建=新增 +口令=密碼 +生成口令=產生密碼 +拷贝目录-运行命令=複製目錄-執行命令 +对话=對話 + +; ============================================ +; Language Selection Dialog +; ============================================ +选择语言 / Select Language=選擇語言 +语言:=語言: + +; ============================================ +; Common Buttons +; ============================================ +确定=確定 +取消=取消 +应用=套用 +关闭=關閉 +是=是 +否=否 +浏览=瀏覽 +保存=儲存 +打开=開啟 +发送=傳送 +生成=產生 +创建=建立 +启动=啟動 +停止=停止 +暂停=暫停 +继续=繼續 +注入=注入 +锁定=鎖定 +覆盖=覆蓋 +继传=續傳 +跳过=略過 +全部覆盖=全部覆蓋 +全部继传=全部續傳 +全部跳过=全部略過 + +; ============================================ +; File Manager +; ============================================ +本地文件=本機檔案 +远程文件=遠端檔案 +本地=本機 +远程=遠端 +本地路径:=本機路徑: +远程路径:=遠端路徑: +上传=上傳 +下载=下載 +删除=刪除 +新建文件夹=新增資料夾 +文件名=檔案名稱 +大小=大小 +修改时间=修改時間 +搜索文件名:=搜尋檔案名稱: +包含子文件夹=包含子資料夾 +开始搜索=開始搜尋 +停止搜索=停止搜尋 +搜索栏=搜尋列 +上一层=上一層 +切换显示=切換顯示 +路径:=路徑: +传输(&T)=傳輸(&T) +自定义压缩(&C)=自訂壓縮(&C) +自定义解压(&U)=自訂解壓縮(&U) +重命名(&R)=重新命名(&R) +删除(&D)=刪除(&D) +新建文件夹(&N)=新增資料夾(&N) +本地打开(&O)=本機開啟(&O) +远程打开(&O)=遠端開啟(&O) +显示运行(&S)=顯示執行(&S) +隐藏运行(&H)=隱藏執行(&H) +刷新(&R)=重新整理(&R) +大图标=大圖示 +小图标=小圖示 +列表=清單 +详细信息=詳細資訊 + +; ============================================ +; Process Manager +; ============================================ +进程名=處理程序名稱 +进程ID=PID +结束进程=結束處理程序 +结束(&T)=結束(&T) +结束=結束 +反黑屏=防黑屏 + +; ============================================ +; Window Manager +; ============================================ +隐藏=隱藏 +显示=顯示 +最大化=最大化 +最小化=最小化 + +; ============================================ +; Screen Spy / Remote Desktop +; ============================================ +全屏=全螢幕 +控制=控制 +仅查看=僅檢視 +画质=畫質 +帧率=影格率 +黑白屏幕=黑白螢幕 +高速屏幕=高速螢幕 +极速屏幕=極速螢幕 +屏幕截图方法:=螢幕擷取方法: +图像压缩方法:=影像壓縮方法: +多显示器支持:=多螢幕支援: +退出全屏=退出全螢幕 +控制屏幕=控制螢幕 +放下面=置於下層 +透明度=透明度 +截图=擷取螢幕 + +; ============================================ +; Settings Dialog +; ============================================ +常规设置=一般設定 +网络设置=網路設定 +参数设置=參數設定 +桌面管理=桌面管理 +监听端口=監聽連接埠 +监听端口:=監聽連接埠: +最大连接数=最大連線數 +最大连接数:=最大連線數: +语言=語言 +保存设置=儲存設定 +公网地址:=公網位址: +上报间隔:=回報間隔: +软件检测:=軟體偵測: +多屏上墙:=多螢幕上牆: +UDP协议参数:=UDP協定參數: +FRP 代理:=FRP 代理: +服务端口:=服務連接埠: +下载端口:=下載連接埠: +操作提示: 1.监听端口支持填写多个,用英文分号分隔;程序同时监听TCP和UDP,且支持基于UDP的KCP;=操作提示: 1.監聽連接埠支援填寫多個,用英文分號分隔;程式同時監聽TCP和UDP,且支援基於UDP的KCP; +操作提示: 2.如果被控端跨网、地区或国家,务必设置公网IP;勾选FRP反向代理并设置服务端口和 token。=操作提示: 2.如果被控端跨網、地區或國家,務必設定公網IP;勾選FRP反向代理並設定服務連接埠和 token。 + +; ============================================ +; Build Client Dialog +; ============================================ +服务程序:=服務程式: +架构:=架構: +模式:=模式: +未选择文件=未選擇檔案 +主控IP地址:=主控IP位址: +协议:=協定: +加密:=加密: +分组名称:=群組名稱: +加壳:=加殼: +载荷类型:=負載類型: +程序增肥:=程式增肥: +安装目录:=安裝目錄: +程序名称:=程式名稱: +下载服务=下載服務 +下载地址(默认本机):=下載位址(預設本機): +通用=通用 +高级 (非必填项)=進階 (非必填項) +提示: 多个上线地址用分号分隔,99个字符以内。仅供学习和自用,严禁用于非法目的使用。=提示: 多個上線位址用分號分隔,99個字元以內。僅供學習和自用,嚴禁用於非法目的使用。 + +; ============================================ +; Service Manager +; ============================================ +服务名称:=服務名稱: +显示名称:=顯示名稱: +描述:=描述: +可执行文件路径=可執行檔路徑 +启动类型:=啟動類型: +服务状态:=服務狀態: +启动方式=啟動方式 +自动启动=自動啟動 +手动启动=手動啟動 +停止服务=停止服務 +启动服务=啟動服務 + +; ============================================ +; Audio Dialog +; ============================================ +正在监听远程声音...=正在監聽遠端聲音... +发送本地语音到远程=傳送本機語音到遠端 + +; ============================================ +; Chat Dialog +; ============================================ +发送消息=傳送訊息 +结束交谈=結束交談 +锁定屏幕\n屏蔽功能键=鎖定螢幕\n屏蔽功能鍵 +解除锁定=解除鎖定 + +; ============================================ +; Authorization Dialog +; ============================================ +序 列 号:=序 列 號: +授权口令:=授權密碼: +授权方式:=授權方式: +验 证 码:=驗 證 碼: +序列号:=序列號: +密 码:=密 碼: +口 令:=密 碼: +有效期:=有效期: +连接数:=連線數: + +; ============================================ +; Injection Dialog +; ============================================ +文件路径: =檔案路徑: +注入方式:=注入方式: +落地目录:=落地目錄: + +; ============================================ +; Scheduled Task Dialog +; ============================================ +任务名:=工作名稱: +文件路径:=檔案路徑: +作者:=作者: +描述:=描述: + +; ============================================ +; New Folder Dialog +; ============================================ +请输入目录:=請輸入目錄: +另一个输入框:=另一個輸入框: +提示信息=提示資訊 +输入数据:=輸入資料: + +; ============================================ +; Copy Directory Dialog +; ============================================ +原目录=原目錄 +现目录=現目錄 +命令=命令 + +; ============================================ +; Replace Icon Dialog +; ============================================ +目标程序=目標程式 +图标文件=圖示檔案 +提示: 替换完成后,请刷新程序进行查看;如若未成功,请更换图标重试。=提示: 替換完成後,請重新整理程式進行檢視;如若未成功,請更換圖示重試。 + +; ============================================ +; Send File Dialog +; ============================================ +发送文件(999/999):=傳送檔案(999/999): + +; ============================================ +; Update Dialog +; ============================================ +目标程序类型:=目標程式類型: + +; ============================================ +; Wallet Dialog +; ============================================ +比特币 (BTC):=比特幣 (BTC): +提示信息: 劫持并替换被控端钱包地址;总字符数最多是470,只填写所需的地址,不需要全部填满。=提示資訊: 劫持並替換被控端錢包位址;總字元數最多是470,只填寫所需的位址,不需要全部填滿。 +警告信息: 此功能仅用于开源项目之研究,用户自行承担后果,不得用于非法目的。=警告資訊: 此功能僅用於開源專案之研究,使用者自行承擔後果,不得用於非法目的。 + +; ============================================ +; Rar/Compress Dialog +; ============================================ +Rar文件名称:=Rar檔案名稱: + +; ============================================ +; Context Menu - Client Management +; ============================================ +修改备注=修改備註 +修改分组=修改群組 +添加关注=新增關注 +客户管理=用戶管理 +转移主机=轉移主機 +分享主机=分享主機 +删除主机=刪除主機 +卸载主机=解除安裝主機 +客户代理=用戶代理 +代理映射=代理對應 +代理端口=代理連接埠 +提权运行=提權執行 +执行程序=執行程式 +下载执行=下載執行 +上传执行=上傳執行 +升级程序=升級程式 +延长授权=延長授權 +撤销授权=撤銷授權 +注入记事本=注入記事本 +机器管理=機器管理 +注销=登出 +关机=關機 +重启=重新啟動 + +; ============================================ +; Main Menu Items +; ============================================ +设置(&S)=設定(&S) +钱包(&W)=錢包(&W) +输入口令(&I)=輸入密碼(&I) +仅生成 -> C语言数组=僅產生 -> C語言陣列 +仅生成 -> bin 文件=僅產生 -> bin 檔案 +测试 bin 文件(&T)=測試 bin 檔案(&T) +生成+混淆 -> C语言数组=產生+混淆 -> C語言陣列 +生成+混淆 -> bin 文件=產生+混淆 -> bin 檔案 +解混淆+测试 bin 文件(&D)=解混淆+測試 bin 檔案(&D) +生成+AES -> C语言数组=產生+AES -> C語言陣列 +生成+AES -> bin 文件=產生+AES -> bin 檔案 +测试 AES bin文件=測試 AES bin 檔案 +替换图标(&R)=替換圖示(&R) +刷新插件(&P)=重新整理外掛程式(&P) +口令生成(&A)=密碼產生(&A) +主控生成(&M)=主控產生(&M) +上线提醒=上線提醒 +启用日志=啟用日誌 +转发系统热键=轉送系統快捷鍵 +守护主控程序=守護主控程式 +历史主机(&C)=歷史主機(&C) +迁移数据(&D)=遷移資料(&D) +导入数据(&I)=匯入資料(&I) +获取插件(&P)=取得外掛程式(&P) +切换语言(&L)=切換語言(&L) +免责声明=免責聲明 +发送反馈=傳送回饋 +软件介绍=軟體介紹 +请求授权=請求授權 + +; ============================================ +; Build Settings Menu +; ============================================ +参数详解(&A)=參數詳解(&A) +加密 IP (&E)=加密 IP (&E) +随机名称(&R)=隨機名稱(&R) +提权安装(&P)=提權安裝(&P) +标识信息(&F)=標識資訊(&F) + +; ============================================ +; Decrypt Menu +; ============================================ +解密(&D)=解密(&D) +Chrome 浏览器=Chrome 瀏覽器 +Edge 浏览器=Edge 瀏覽器 +360 极速浏览器=360 極速瀏覽器 +360 浏览器=360 瀏覽器 +QQ 浏览器=QQ 瀏覽器 + +; ============================================ +; Drawing Menu +; ============================================ +置顶窗口=置頂視窗 +半透明=半透明 +位置跟随=位置跟隨 +大小跟随=大小跟隨 +编辑=編輯 +文字=文字 +清空=清空 + +; ============================================ +; Tray Menu +; ============================================ +显示=顯示 +退出=結束 + +; ============================================ +; Status Bar +; ============================================ +进度=進度 + +; ============================================ +; String Table +; ============================================ +远程终端=遠端終端機 +窗口管理=視窗管理 +远程桌面=遠端桌面 +文件管理=檔案管理 +语音监听=語音監聽 +视频查看=視訊檢視 +服务管理=服務管理 +注册表查看=登錄編輯程式檢視 +服务生成=服務產生 +帮助=說明 +参数配置=參數設定 + +; ============================================ +; Status Messages +; ============================================ +在线=線上 +离线=離線 +连接中=連線中 +已连接=已連線 +未连接=未連線 + +; ============================================ +; Confirmation Messages +; ============================================ +确定要退出吗?=確定要結束嗎? +确定要删除选中的客户端吗?=確定要刪除選取的用戶端嗎? +连接成功=連線成功 +连接失败=連線失敗 +操作成功=操作成功 +操作失败=操作失敗 + +; ============================================ +; MessageBox Titles +; ============================================ +提示=提示 +错误=錯誤 +警告=警告 +确认删除=確認刪除 +异常=異常 +免责声明=免責聲明 +进程结束警告=處理程序結束警告 +路径 确认拷贝到剪切板=路徑 確認複製到剪貼簿 +注意=注意 + +; ============================================ +; MessageBox Messages - Main Dialog +; ============================================ +一个主控程序已经在运行,请检查任务管理器。=一個主控程式已經在執行,請檢查工作管理員。 +请勿HOOK此程序!=請勿HOOK此程式! +创建执行代码的子菜单失败!=建立執行程式碼的子選單失敗! +请选择一个被控程序进行升级!=請選擇一個被控程式進行升級! +确定升级选定的被控程序吗?=確定升級選定的被控程式嗎? +需受控程序支持方可生效!=需受控程式支援方可生效! +确定删除选定的被控计算机吗?=確定刪除選定的被控電腦嗎? +计算机已经被用户锁屏,程序无 SYSTEM 权限。=電腦已經被使用者鎖定螢幕,程式無 SYSTEM 權限。 +可能无法进行远程桌面控制,是否继续?=可能無法進行遠端桌面控制,是否繼續? +格式错误,请重新申请口令!=格式錯誤,請重新申請密碼! +口令错误, 无法继续操作!=密碼錯誤, 無法繼續操作! +请通过工具菜单重新输入口令。=請透過工具選單重新輸入密碼。 +口令过期,请重新申请口令!=密碼過期,請重新申請密碼! +修改FRP代理开关,需要重启当前应用程序方可生效。=修改FRP代理開關,需要重新啟動目前應用程式方可生效。 +FRP代理服务异常,需要重启当前应用程序进行重试。=FRP代理服務異常,需要重新啟動目前應用程式進行重試。 +字符串长度超出[0, 250]范围限制!=字串長度超出[0, 250]範圍限制! +备注信息长度不能超过64个字符=備註資訊長度不能超過64個字元 +请通过菜单设置当前主控程序的公网地址(域名)!=請透過選單設定目前主控程式的公網位址(網域)! +此地址会写入即将生成的主控程序中。=此位址會寫入即將產生的主控程式中。 +密码不正确,无法生成主控程序!=密碼不正確,無法產生主控程式! +密码长度不能大于15。=密碼長度不能大於15。 +读取文件失败! 请稍后再次尝试。=讀取檔案失敗! 請稍後再次嘗試。 +操作文件失败! 请稍后再次尝试。=操作檔案失敗! 請稍後再次嘗試。 +写入哈希失败! 无法生成主控。=寫入雜湊失敗! 無法產生主控。 +Explorer 未正确初始化! 请稍后再试。=Explorer 未正確初始化! 請稍後再試。 +文件对话框未成功打开! 请稍后再试。=檔案對話框未成功開啟! 請稍後再試。 +主控程序创建失败!=主控程式建立失敗! +正在UPX压缩,请关注信息提示。=正在UPX壓縮,請關注資訊提示。 +文件位于: =檔案位於: +生成成功! 文件位于:=產生成功! 檔案位於: +请将64位的DLL放于主控程序的 'Plugins' 目录,再来点击此项菜单。=請將64位元的DLL放於主控程式的 'Plugins' 目錄,再來點擊此項選單。 +密码不正确!=密碼不正確! +本软件仅限于合法、正当、合规的用途。=本軟體僅限於合法、正當、合規的用途。 +您是否同意?=您是否同意? +如需修改授权信息,请联系管理员。是否现在修改授权?=如需修改授權資訊,請聯繫管理員。是否現在修改授權? +文件打开失败! 请稍后再试。=檔案開啟失敗! 請稍後再試。 +Shellcode 执行成功! =Shellcode 執行成功! +Shellcode 执行失败! 请用本程序生成的 bin 文件进行测试! =Shellcode 執行失敗! 請用本程式產生的 bin 檔案進行測試! +Shellcode 生成成功! 请自行编写调用程序。=Shellcode 產生成功! 請自行編寫呼叫程式。 +是否测试 =是否測試 +64位=64位元 +32位=32位元 +Shellcode 二进制文件? =Shellcode 二進位檔案? +超出使用时间可输入的字符数限制!=超出使用時間可輸入的字元數限制! +确定要以管理员权限重新启动目标应用程序吗?=確定要以管理員權限重新啟動目標應用程式嗎? +此操作可能触发 UAC 账户控制。=此操作可能觸發 UAC 帳戶控制。 +超出钱包地址可输入的字符数限制!=超出錢包位址可輸入的字元數限制! +确定卸载选定的被控程序吗?=確定解除安裝選定的被控程式嗎? +分组名称长度不得超过24个字符!=群組名稱長度不得超過24個字元! +此操作需客户端具有管理员权限,确定继续吗? =此操作需用戶端具有管理員權限,確定繼續嗎? +无法读取文件!=無法讀取檔案! +文件为空或超过12MB,无法使用此功能!=檔案為空或超過12MB,無法使用此功能! +请将64位的DLL放于主控程序的 'Plugins' 目录,是否继续?=請將64位元的DLL放於主控程式的 'Plugins' 目錄,是否繼續? +没有找到在线主机: =沒有找到線上主機: +没有反黑屏插件: =沒有防黑屏外掛程式: +需要正确启用FRP反向代理方可使用此功能!=需要正確啟用FRP反向代理方可使用此功能! +请通过=請透過 +访问代理端口!=存取代理連接埠! +远程控制时,=遠端控制時, +转发系统热键到远程桌面。=轉送系統快捷鍵到遠端桌面。 +不=不 +以传统方式启动主控程序,没有守护进程。=以傳統方式啟動主控程式,沒有守護處理程序。 +如果更换主控IP,必须将主机迁移到新的主控IP名下。=如果更換主控IP,必須將主機遷移到新的主控IP名下。 +注意,更换主控程序的机器可能导致授权失效!=注意,更換主控程式的機器可能導致授權失效! +语言已切换,重启程序后生效。=語言已切換,重新啟動程式後生效。 +导入主控程序的历史主机记录。=匯入主控程式的歷史主機記錄。 +此操作会覆盖本机的历史记录,请仅在迁移主控程序时进行操作。=此操作會覆蓋本機的歷史記錄,請僅在遷移主控程式時進行操作。 + +; ============================================ +; MessageBox Messages - Build Dialog +; ============================================ +Shellcode 只能向64位电脑注入,注入器也只能是64位!=Shellcode 只能向64位元電腦注入,注入器也只能是64位元! +出现内部错误,请检查输入,重新编译程序!=出現內部錯誤,請檢查輸入,重新編譯程式! +客户端版本比主控程序更高, 无法生成!=用戶端版本比主控程式更高, 無法產生! +出现内部错误,未能找到标识信息!=出現內部錯誤,未能找到標識資訊! +服务程序创建失败!=服務程式建立失敗! +文件下载地址: =檔案下載位址: +文件生成失败: =檔案產生失敗: +ShellCode 转换异常, 异常代码: =ShellCode 轉換異常, 異常代碼: +内存异常:=記憶體異常: +文件异常:=檔案異常: +其他异常:=其他異常: +安装Windows服务必须设置,客户端运行时会请求管理员权限,可能会触发系统UAC提示。=安裝Windows服務必須設定,用戶端執行時會請求管理員權限,可能會觸發系統UAC提示。 +使用 ShellCode AES 在程序尾部追加载荷,可能无法在某些服务器系统运行! =使用 ShellCode AES 在程式尾部追加載荷,可能無法在某些伺服器系統執行! +文件名不合法,请检查:=檔案名稱不合法,請檢查: +请提供载荷的下载地址。下载地址前缀为 http 或 https。=請提供載荷的下載位址。下載位址前綴為 http 或 https。 + +; ============================================ +; MessageBox Messages - Password Dialog +; ============================================ +请确认是否正确设置公网地址(IP或域名)?=請確認是否正確設定公網位址(IP或網域)? +您输入的密码不正确,无法生成口令!=您輸入的密碼不正確,無法產生密碼! + +; ============================================ +; MessageBox Messages - RC Edit Dialog +; ============================================ +请选择目标应用程序!=請選擇目標應用程式! +请选择[*.ico]图标文件!=請選擇[*.ico]圖示檔案! +解压程序失败,无法替换图标!=解壓縮程式失敗,無法替換圖示! +替换图标失败,错误代码: =替換圖示失敗,錯誤代碼: + +; ============================================ +; MessageBox Messages - File Manager +; ============================================ +文件夹为空=資料夾為空 +压缩失败: =壓縮失敗: +解压失败: =解壓縮失敗: +请先选择要压缩的文件或文件夹!=請先選擇要壓縮的檔案或資料夾! +请先选择要解压的.zsta文件!=請先選擇要解壓縮的.zsta檔案! +文件创建失败=檔案建立失敗 +文件写入失败!=檔案寫入失敗! +请拖拽到文件管理器选定目录中=請拖曳到檔案管理器選定目錄中 +请选择文件!=請選擇檔案! +ZIP压缩完成=ZIP壓縮完成 +请选择目录!=請選擇目錄! +搜索关键词太长=搜尋關鍵字太長 + +; ============================================ +; MessageBox Messages - System Dialog +; ============================================ +只能同时向一个进程进行代码注入!=只能同時向一個處理程序進行程式碼注入! +确定要向目标进程 (仅限64位) 进行代码注入吗?=確定要向目標處理程序 (僅限64位元) 進行程式碼注入嗎? +此操作可能被安全软件阻止,或导致进程崩溃!=此操作可能被安全軟體阻止,或導致處理程序當機! +只能同时向一个进程进行反黑屏操作!=只能同時向一個處理程序進行防黑屏操作! +确定要向目标进程进行反黑屏吗?=確定要向目標處理程序進行防黑屏嗎? +请确保目标进程、DLL及被控端架构务必相同!=請確保目標處理程序、DLL及被控端架構務必相同! + +; ============================================ +; MessageBox Messages - Other Dialogs +; ============================================ +初始化代理服务器失败!=初始化代理伺服器失敗! +创建录像文件失败:=建立錄影檔案失敗: +错误代码: =錯誤代碼: +文件保存失败:=檔案儲存失敗: +已复制数据到剪切板!=已複製資料到剪貼簿! +确定要卸载该程序?=確定要解除安裝該程式? + +; ============================================ +; List Columns - File Manager +; ============================================ +名称=名稱 +类型=類型 +总大小=總大小 +可用空间=可用空間 +修改日期=修改日期 +文件路径=檔案路徑 + +; ============================================ +; List Columns - Process/Window Manager +; ============================================ +映像名称=映像名稱 +PID=PID +程序路径=程式路徑 +架构=架構 +句柄=控制代碼 +窗口名称=視窗名稱 +窗口状态=視窗狀態 +所属进程ID=所屬處理程序ID + +; ============================================ +; List Columns - Service Manager +; ============================================ +真实名称=真實名稱 +显示名称=顯示名稱 +启动类型=啟動類型 +运行状态=執行狀態 +可执行文件路径=可執行檔路徑 + +; ============================================ +; List Columns - Registry Manager +; ============================================ +数据=資料 + +; ============================================ +; List Columns - Machine Dialog +; ============================================ +优先级=優先順序 +线程数=執行緒數 +用户名=使用者名稱 +内存=記憶體 +文件大小=檔案大小 +句柄HWND=控制代碼HWND +进程名=處理程序名稱 +进程位数=處理程序位元數 +协议=協定 +本地地址:端口=本機位址:連接埠 +远程地址:端口=遠端位址:連接埠 +目标IP归属地=目標IP歸屬地 +连接状态=連線狀態 +软件名称=軟體名稱 +发行商=發行商 +安装时间=安裝時間 +卸载命令及参数=解除安裝命令及參數 +访问时间=存取時間 +标题=標題 +网页地址=網頁位址 +收藏名称=我的最愛名稱 +Url=Url +描述=描述 +状态=狀態 +登陆身份=登入身分 +桌面交互=桌面互動 +服务名=服務名稱 +目录=目錄 +任务名称=工作名稱 +最后执行时间=上次執行時間 +下次执行时间=下次執行時間 + +; ============================================ +; ComboBox Items - Build Dialog +; ============================================ +TestRun - 磁盘DLL=TestRun - 磁碟DLL +TestRun - 内存DLL=TestRun - 記憶體DLL +TestRun - 注入任务管理器=TestRun - 注入工作管理員 +ghost.exe - Windows 服务=ghost.exe - Windows 服務 +TestRun - Windows 服务=TestRun - Windows 服務 +选择文件=選擇檔案 +随机上线=隨機上線 +并发上线=並行上線 +随机=隨機 +无=無 +载荷写入当前程序尾部=載荷寫入目前程式尾部 +载荷写入单独的二进制文件=載荷寫入單獨的二進位檔案 +载荷写入 BMP 格式图片=載荷寫入 BMP 格式圖片 +载荷写入 JPG 格式图片=載荷寫入 JPG 格式圖片 +载荷写入 PNG 格式图片=載荷寫入 PNG 格式圖片 +载荷写入 ZIP 压缩包=載荷寫入 ZIP 壓縮檔 +载荷写入 PDF 文件=載荷寫入 PDF 檔案 + +; ============================================ +; ComboBox Items - Password Dialog +; ============================================ +计算机硬件信息=電腦硬體資訊 +主控IP或域名信息=主控IP或網域資訊 + +; ============================================ +; ComboBox Items - Settings Dialog +; ============================================ +灰度图像传输=灰階影像傳輸 +屏幕差异算法=螢幕差異演算法 +H264压缩算法=H264壓縮演算法 +电报=Telegram + +; ============================================ +; ComboBox Items - Inject Dialog +; ============================================ +CreateRemoteThread(落地反射注入)=CreateRemoteThread(落地反射注入) +QueueUserAPC(落地反射注入)=QueueUserAPC(落地反射注入) +NtCreateThreadEx(落地反射注入)=NtCreateThreadEx(落地反射注入) +CreateRemoteThread(shellcode注入)=CreateRemoteThread(shellcode注入) +QueueUserAPC(shellcode注入)=QueueUserAPC(shellcode注入) +NtCreateThreadEx(shellcode注入)=NtCreateThreadEx(shellcode注入) + +; ============================================ +; ComboBox Items - Service Info Dialog +; ============================================ +自动=自動 +手动=手動 +已禁用=已停用 + +; ============================================ +; Menu Items - Main Dialog +; ============================================ +序列号=序列號 +操作指导=操作指導 +执行代码=執行程式碼 + +; ============================================ +; Menu Items - Screen Spy Dialog +; ============================================ +刷新(&F)=重新整理(&F) +控制屏幕(&Y)=控制螢幕(&Y) +保存快照(&S)=儲存快照(&S) +录像(MJPEG)=錄影(MJPEG) +录像(H264)=錄影(H264) +获取剪贴板(&R)=取得剪貼簿(&R) +设置剪贴板(&L)=設定剪貼簿(&L) +修复分辨率(&G)=修復解析度(&G) +清晰度低60/100=清晰度低60/100 +清晰度中85/100=清晰度中85/100 +清晰度高100/100=清晰度高100/100 +打开-文件管理(&B)=開啟-檔案管理(&B) +打开-运行(&H)=開啟-執行(&H) +打开-Powershell(&N)=開啟-Powershell(&N) +打开-Chrome(&I)=開啟-Chrome(&I) +打开-Edge(&M)=開啟-Edge(&M) +打开-Brave(&D)=開啟-Brave(&D) +打开-Firefox(&V)=開啟-Firefox(&V) +打开-Iexplore(&Z)=開啟-Iexplore(&Z) +自定义CMD命令(&y)=自訂CMD命令(&y) +高级自定义命令(&O)=進階自訂命令(&O) +清理后台(&J)=清理後台(&J) +全屏(&F)=全螢幕(&F) +使用远程光标(&C)=使用遠端游標(&C) +自适应窗口大小(&A)=自適應視窗大小(&A) +跟踪被控端鼠标(&T)=追蹤被控端滑鼠(&T) +锁定被控端鼠标和键盘(&L)=鎖定被控端滑鼠和鍵盤(&L) +切换显示器(&1)=切換顯示器(&1) +多线程压缩(&2)=多執行緒壓縮(&2) +原始分辨率(&3)=原始解析度(&3) +限制为1080P(&4)=限制為1080P(&4) +最大帧率FPS:10=最大影格率FPS:10 +最大帧率FPS:15=最大影格率FPS:15 +最大帧率FPS:20=最大影格率FPS:20 +最大帧率FPS:25=最大影格率FPS:25 +最大帧率FPS:30=最大影格率FPS:30 +最大帧率无限制=最大影格率無限制 +帧率设置=影格率設定 + +; ============================================ +; Menu Items - Keyboard Dialog +; ============================================ +离线记录(&O)=離線記錄(&O) +清空记录(&C)=清空記錄(&C) +保存记录(&S)=儲存記錄(&S) + +; ============================================ +; Menu Items - Video Dialog +; ============================================ +视频压缩(&C)=視訊壓縮(&C) +保存录像(&V)=儲存錄影(&V) + +; ============================================ +; Menu Items - File Manager Dialog +; ============================================ +分区高级搜索=分區進階搜尋 +下载(附带目录结构)=下載(附帶目錄結構) +打开文件位置=開啟檔案位置 + +; ============================================ +; Menu Items - Proxy Dialog +; ============================================ +代理打开Chrome(请关闭所有Chrome进程)(&P)=代理開啟Chrome(請關閉所有Chrome處理程序)(&P) + +; ============================================ +; Menu Items - Machine Dialog +; ============================================ +刷新数据(&F)=重新整理資料(&F) +复制数据(&V)=複製資料(&V) +删除文件(&C)=刪除檔案(&C) +结束进程(&E)=結束處理程序(&E) +冻结进程(&D)=凍結處理程序(&D) +解冻进程(&J)=解凍處理程序(&J) +强删文件(&Q)=強制刪除檔案(&Q) +注入管理(&I)=注入管理(&I) +还原窗口(&H)=還原視窗(&H) +隐藏窗口(&Y)=隱藏視窗(&Y) +关闭窗口(&E)=關閉視窗(&E) +最 大 化(&M)=最大化(&M) +最 小 化(&I)=最小化(&I) +卸载程序(&X)=解除安裝程式(&X) +&(R)执行任务=&(R)執行工作 +&(T)停止任务=&(T)停止工作 +&(D)删除任务=&(D)刪除工作 +&(C)创建任务=&(C)建立工作 +&(F)刷新任务=&(F)重新整理工作 +启动(&S)=啟動(&S) +停止(&O)=停止(&O) +暂停(&U)=暫停(&U) +恢复(&M)=恢復(&M) +重新启动(&E)=重新啟動(&E) +刷新(&R)=重新整理(&R) +属性(&R)=內容(&R) +删除服务(&D)=刪除服務(&D) +修改远程文件(&S)=修改遠端檔案(&S) +加载本地文件(&S)=載入本機檔案(&S) +结束进程(&C)=結束處理程序(&C) + +; ============================================ +; FormatL - Dialog Title Formats +; ============================================ +%s - 语音监听=%s - 語音監聽 +%s - 画板演示=%s - 繪圖板展示 +%s - 解密数据=%s - 解密資料 +%s - 文件管理=%s - 檔案管理 +%s - 远程虚拟屏幕 %d×%d=%s - 遠端虛擬桌面 %d×%d +%s - 键盘记录=%s - 鍵盤記錄 +%s - 注册表管理=%s - 登錄編輯程式管理 +%s - 远程桌面控制 %d×%d=%s - 遠端桌面控制 %d×%d +%s - 代理服务=%s - 代理服務 +%s - 服务管理=%s - 服務管理 +%s - 远程终端=%s - 遠端終端機 +%s - 进程管理=%s - 處理程序管理 +%s - 窗口管理=%s - 視窗管理 +%s - 视频管理 %d×%d=%s - 視訊管理 %d×%d +远程交谈 - %s=遠端交談 - %s +文件管理 - %s=檔案管理 - %s +主机管理 - %s=主機管理 - %s + +; ============================================ +; FormatL - Status Messages +; ============================================ +有%d个主机在线=有%d台主機在線 +监听端口: %s成功=監聽連接埠: %s成功 +发送文件(%d/%d): %.2f%%=傳送檔案(%d/%d): %.2f%% +接收文件(%d/%d): %.2f%%=接收檔案(%d/%d): %.2f%% +%s (%d台设备)=%s (%d台裝置) +服务个数:%d=服務個數:%d +程序个数 / %d=程式個數 / %d +窗口名称 窗口个数【%d】=視窗名稱 視窗個數【%d】 +程序路径 / %d=程式路徑 / %d +窗口名称 / %d=視窗名稱 / %d +无权限或无数据=無權限或無資料 +共 %d 个服务=共 %d 個服務 +已经搜索 %d 请勿再次搜索=已經搜尋 %d 請勿再次搜尋 +共搜索到 %d 个=共搜尋到 %d 個 +软件有效期限: %s — %s, 并发连接数量: %d.=軟體有效期限: %s — %s, 並行連線數量: %d. + +; ============================================ +; FormatL - Confirmation Messages +; ============================================ +确定要将这 %d 项删除吗?=確定要將這 %d 項刪除嗎? +确实要删除文件夹"%s"并将所有内容删除吗?=確實要刪除資料夾「%s」並將所有內容刪除嗎? +确实要把"%s"删除吗?=確實要把「%s」刪除嗎? +此文件夹已包含一个名为"%s"的文件=此資料夾已包含一個名為「%s」的檔案 +%s确实\n想终止这%d项进程吗?=%s確實\n想終止這%d項處理程序嗎? +%s确实\n想终止该项进程吗?=%s確實\n想終止該項處理程序嗎? + +; ============================================ +; FormatL - Info Panel +; ============================================ +\r\n进程 PID: %s %s=\r\n處理程序 PID: %s %s +文件路径: %s%s %s%s\r\n系统信息: %s 位 %s 核心 %s GB %s\r\n启动信息: %s %s %s%s %s\r\n上线信息: %s %d %s\r\n客户信息: %s=檔案路徑: %s%s %s%s\r\n系統資訊: %s 位元 %s 核心 %s GB %s\r\n啟動資訊: %s %s %s%s %s\r\n上線資訊: %s %d %s\r\n用戶資訊: %s + +; ============================================ +; FormatL - Proxy Dialog +; ============================================ +SOCKS 代理软件请设置服务器为: <127.0.0.1:%d>\r\n=SOCKS 代理軟體請設定伺服器為: <127.0.0.1:%d>\r\n + +; ============================================ +; _TR - Additional Dialog Init/Prompt Strings +; ============================================ +操作错误=操作錯誤 +内部错误=內部錯誤 +使用提示=使用提示 +严禁用于非法侵入、控制、监听他人设备等违法行为=嚴禁用於非法侵入、控制、監聽他人裝置等違法行為 +有=有 +主机下线=主機離線 +UPX 处理完成=UPX 處理完成 +主控生成=主控產生 +当前主控程序的密码:=目前主控程式的密碼: +主控密码=主控密碼 +新的主控程序的密码:=新的主控程式的密碼: +使用天数=使用天數 +新主控程序使用天数:=新主控程式使用天數: +需要密码=需要密碼 +主控程序授权天数:=主控程式授權天數: +并发上线机器数量:=並行上線機器數量: +序列号(唯一ID):=序列號(唯一ID): +断开连接=中斷連線 +请输入分组名称:=請輸入群組名稱: +远程下载地址:=遠端下載位址: +请将EXE放在"Payloads"目录或输入下载地址。=請將EXE放在「Payloads」目錄或輸入下載位址。 +可执行文件 (*.exe)|*.exe||=可執行檔 (*.exe)|*.exe|| +请输入客户端端口:=請輸入用戶端連接埠: +达到最大连接数=達到最大連線數 + +; ============================================ +; _TRF - Format Strings +; ============================================ +达到最大连接数限制: %lu, 请释放连接=達到最大連線數限制: %lu, 請釋放連線 + +; ============================================ +; _L - Expression Strings +; ============================================ +授权成功=授權成功 +版本不支持=版本不支援 +客户端版本最低要求: =用戶端版本最低要求: +以"服务+代理"形式启动主控程序,会开机自启及被守护。=以「服務+代理」形式啟動主控程式,會開機自啟及被守護。 + +; ============================================ +; New Strings - 2015Remote.cpp +; ============================================ +启动TCP服务失败: =啟動TCP服務失敗: +。错误码: =。錯誤碼: +启动UDP服务失败: =啟動UDP服務失敗: + +; ============================================ +; New Strings - 2015RemoteDlg.cpp +; ============================================ +禁界: 远程协助软件=禁界: 遠端協助軟體 +软件初始化成功...=軟體初始化成功... +主机上线=主機上線 +授权提醒=授權提醒 +程序可能有使用限制,请联系管理员请求授权=程式可能有使用限制,請聯繫管理員請求授權 +下载服务启动失败,可能是端口被占用了。=下載服務啟動失敗,可能是連接埠被佔用了。 +调用函数StartServer失败! 错误代码:=呼叫函式StartServer失敗! 錯誤代碼: +\r\n是否关闭以下进程重试: =\r\n是否關閉以下處理程序重試: +压缩为 ZSTA 文件=壓縮為 ZSTA 檔案 +解压 ZSTA 文件=解壓縮 ZSTA 檔案 +ZSTA 压缩文件=ZSTA 壓縮檔案 + +; ============================================ +; New Strings - Chat.cpp +; ============================================ +提示: 对方聊天对话框在发送消息后才会弹出=提示: 對方聊天對話框在傳送訊息後才會彈出 + +; ============================================ +; New Strings - RegisterDlg.cpp +; ============================================ +(默认)=(預設) +(数据未设置值)=(資料未設定值) + +; ============================================ +; New Strings - sys\MachineDlg.cpp +; ============================================ +网络连接=網路連線 +软件信息=軟體資訊 +浏览记录=瀏覽記錄 +收 藏 夹=我的最愛 +WIN32服务=Win32服務 +驱动服务=驅動服務 +计划任务=排程工作 +就绪=就緒 +实时=即時 +高=高 +高于标准=高於標準 +标准=標準 +低于标准=低於標準 +空闲=閒置 +未知=未知 +正在接收数据 - 请稍后...=正在接收資料 - 請稍後... +发送还原命令=傳送還原命令 +发送隐藏命令=傳送隱藏命令 +发送关闭命令=傳送關閉命令 +发送最大化命令=傳送最大化命令 +发送最小化命令=傳送最小化命令 +选择文件=選擇檔案 + +; ============================================ +; New Strings - BuildDlg.cpp +; ============================================ +\r\n提示: 请生成"ServerDll.dll",以便程序正常运行。=\r\n提示: 請產生「ServerDll.dll」,以便程式正常執行。 +\n提示: 使用KCP协议生成服务,必须设置主控UDP协议参数为1。=\n提示: 使用KCP協定產生服務,必須設定主控UDP協定參數為1。 + +; ============================================ +; New Strings - file\CFileManagerDlg.cpp +; ============================================ +远程计算机:磁盘列表=遠端電腦:磁碟清單 +共享=共用 +压缩完成=壓縮完成 +请选择上传路径: =請選擇上傳路徑: +请选择下载路径: =請選擇下載路徑: +文件上传=檔案上傳 +文件下载=檔案下載 +正在搜索...=正在搜尋... +重新搜索=重新搜尋 +远程目录:%s=遠端目錄:%s +准备粘贴=準備貼上 +开始压缩,不要关闭窗口,其他操作继续=開始壓縮,不要關閉視窗,其他操作繼續 +删除目录:%s (完成)=刪除目錄:%s (完成) +删除文件:%s (完成)=刪除檔案:%s (完成) +搜索完毕 共:%d 个文件=搜尋完畢 共:%d 個檔案 + +; ============================================ +; New Strings - FileManagerDlg.cpp +; ============================================ +传送文件=傳送檔案 +接收文件=接收檔案 +本地:装载目录 %s 完成=本機:載入目錄 %s 完成 +远程:装载目录 %s 完成=遠端:載入目錄 %s 完成 +本地:装载目录 %s\*.* 完成=本機:載入目錄 %s\*.* 完成 +远程:装载目录 %s\*.* 完成=遠端:載入目錄 %s\*.* 完成 +远程:删除目录 %s\*.* 完成=遠端:刪除目錄 %s\*.* 完成 +远程:删除文件 %s 完成=遠端:刪除檔案 %s 完成 +远程:删除目录 %s (完成)=遠端:刪除目錄 %s (完成) +远程:删除文件 %s (完成)=遠端:刪除檔案 %s (完成) + +; ============================================ +; New Strings - SystemDlg.cpp +; ============================================ +警告: 终止进程会导致不希望发生的结果,\n包括数据丢失和系统不稳定。在被终止前,\n进程将没有机会保存其状态和数据。=警告: 終止處理程序會導致不希望發生的結果,\n包括資料遺失和系統不穩定。在被終止前,\n處理程序將沒有機會儲存其狀態和資料。 + +; ============================================ +; New Strings - CClientListDlg.cpp +; ============================================ +计算机名称=電腦名稱 +位置=位置 +系统=系統 +最后登录=最後登入 +关注=關注 +授权=授權 + +; ============================================ +; Encoding Check +; ============================================ +请使用ANSI编码的语言文件。=請使用ANSI編碼的語言檔案。 + diff --git a/server/2015Remote/proxy/ProxyMapDlg.cpp b/server/2015Remote/proxy/ProxyMapDlg.cpp index de28712..a334f5d 100644 --- a/server/2015Remote/proxy/ProxyMapDlg.cpp +++ b/server/2015Remote/proxy/ProxyMapDlg.cpp @@ -22,7 +22,7 @@ CProxyMapDlg::CProxyMapDlg(CWnd* pParent, Server* pIOCPServer, ClientContext* pC void CProxyMapDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_EDIT, m_Edit); DDX_Control(pDX, IDC_EDIT_OTHER, m_EditOther); } @@ -36,7 +36,7 @@ END_MESSAGE_MAP() BOOL CProxyMapDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon @@ -54,7 +54,7 @@ BOOL CProxyMapDlg::OnInitDialog() // 开启IPCP服务器 m_nPort = 5543; if (!m_iocpLocal->Initialize(NotifyProc, this, 100000, m_nPort)) { - MessageBox("初始化代理服务器失败!", "提示"); + MessageBoxL("初始化代理服务器失败!", "提示", MB_ICONINFORMATION); return FALSE; } TCHAR ip[256] = {}; @@ -62,16 +62,16 @@ BOOL CProxyMapDlg::OnInitDialog() m_iocpLocal->m_TcpServer->GetListenAddress(ip, len, m_nPort); CString strString; - strString.Format("%s - 代理服务", m_IPAddress); + strString.FormatL("%s - 代理服务", m_IPAddress); SetWindowText(strString); - str.Format(_T("SOCKS 代理软件请设置服务器为: <127.0.0.1:%d>\r\n"), m_nPort); + str.FormatL(_T("SOCKS 代理软件请设置服务器为: <127.0.0.1:%d>\r\n"), m_nPort); AddLog(str.GetBuffer(0)); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { - pSysMenu->AppendMenu(MF_SEPARATOR); - pSysMenu->AppendMenu(MF_STRING, IDM_PROXY_CHROME, _T("代理打开Chrome(请关闭所有Chrome进程)(&P)")); + pSysMenu->AppendMenuSeparator(MF_SEPARATOR); + pSysMenu->AppendMenuL(MF_STRING, IDM_PROXY_CHROME, _T("代理打开Chrome(请关闭所有Chrome进程)(&P)")); } return TRUE; @@ -261,7 +261,7 @@ void CProxyMapDlg::AddLog_other(TCHAR* lpText) void CProxyMapDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (!IsWindowVisible()) @@ -283,10 +283,10 @@ void CProxyMapDlg::OnSysCommand(UINT nID, LPARAM lParam) switch (nID) { case IDM_PROXY_CHROME: { CString strCommand; - strCommand.Format(_T(" /c start chrome.exe --show-app-list --proxy-server=\"SOCKS5://127.0.0.1:%d\""), m_nPort); + strCommand.FormatL(_T(" /c start chrome.exe --show-app-list --proxy-server=\"SOCKS5://127.0.0.1:%d\""), m_nPort); ShellExecute(NULL, _T("open"), _T("cmd.exe"), strCommand, NULL, SW_SHOW); } break; } - CDialog::OnSysCommand(nID, lParam); + __super::OnSysCommand(nID, lParam); } diff --git a/server/2015Remote/sys/CCreateTaskDlg.cpp b/server/2015Remote/sys/CCreateTaskDlg.cpp index 007e2af..91c4723 100644 --- a/server/2015Remote/sys/CCreateTaskDlg.cpp +++ b/server/2015Remote/sys/CCreateTaskDlg.cpp @@ -10,7 +10,7 @@ IMPLEMENT_DYNAMIC(CCreateTaskDlg, CDialog) CCreateTaskDlg::CCreateTaskDlg(CWnd* pParent /*=nullptr*/) - : CDialog(IDD_CREATETASK, pParent) + : CDialogLang(IDD_CREATETASK, pParent) , m_TaskPath(_T("\\")) , m_TaskNames(_T("bhyy")) , m_ExePath(_T("C:\\windows\\system32\\cmd.exe")) @@ -25,7 +25,7 @@ CCreateTaskDlg::~CCreateTaskDlg() void CCreateTaskDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Text(pDX, IDC_EDIT_PATH, m_TaskPath); DDX_Control(pDX, IDC_EDIT_NAME, m_TaskName); DDX_Text(pDX, IDC_EDIT_NAME, m_TaskNames); @@ -47,5 +47,5 @@ void CCreateTaskDlg::OnBnClickedButtonCREAT() { UpdateData(TRUE); // TODO: 在此添加控件通知处理程序代码 - CDialog::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/sys/CCreateTaskDlg.h b/server/2015Remote/sys/CCreateTaskDlg.h index 2c6c240..3ccd18e 100644 --- a/server/2015Remote/sys/CCreateTaskDlg.h +++ b/server/2015Remote/sys/CCreateTaskDlg.h @@ -1,9 +1,9 @@ #pragma once - +#include "LangManager.h" // CCreateTaskDlg 对话框 -class CCreateTaskDlg : public CDialog +class CCreateTaskDlg : public CDialogLang { DECLARE_DYNAMIC(CCreateTaskDlg) diff --git a/server/2015Remote/sys/CInjectCodeDlg.cpp b/server/2015Remote/sys/CInjectCodeDlg.cpp index 3095477..e3c84d8 100644 --- a/server/2015Remote/sys/CInjectCodeDlg.cpp +++ b/server/2015Remote/sys/CInjectCodeDlg.cpp @@ -13,7 +13,7 @@ IMPLEMENT_DYNAMIC(CInjectCodeDlg, CDialog) CInjectCodeDlg::CInjectCodeDlg(CWnd* pParent /*=nullptr*/) - : CDialog(IDD_INJECTINFO, pParent) + : CDialogLang(IDD_INJECTINFO, pParent) , Str_loacal(_T("本地文件路径")) , Str_remote(_T("")) { @@ -25,7 +25,7 @@ CInjectCodeDlg::~CInjectCodeDlg() void CInjectCodeDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_INJECTS, m_combo_main); DDX_Text(pDX, IDC_EDIT_PATH, Str_loacal); DDX_Text(pDX, IDC_EDIT_PATH_REMOTE, Str_remote); @@ -40,15 +40,15 @@ END_MESSAGE_MAP() BOOL CInjectCodeDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); int i = 0; - m_combo_main.InsertString(i++, _T("CreateRemoteThread(落地反射注入)")); - m_combo_main.InsertString(i++, _T("QueueUserAPC(落地反射注入)")); - m_combo_main.InsertString(i++, _T("NtCreateThreadEx(落地反射注入)")); + m_combo_main.InsertStringL(i++, _T("CreateRemoteThread(落地反射注入)")); + m_combo_main.InsertStringL(i++, _T("QueueUserAPC(落地反射注入)")); + m_combo_main.InsertStringL(i++, _T("NtCreateThreadEx(落地反射注入)")); - m_combo_main.InsertString(i++, _T("CreateRemoteThread(shellcode注入)")); - m_combo_main.InsertString(i++, _T("QueueUserAPC(shellcode注入)")); - m_combo_main.InsertString(i++, _T("NtCreateThreadEx(shellcode注入)")); + m_combo_main.InsertStringL(i++, _T("CreateRemoteThread(shellcode注入)")); + m_combo_main.InsertStringL(i++, _T("QueueUserAPC(shellcode注入)")); + m_combo_main.InsertStringL(i++, _T("NtCreateThreadEx(shellcode注入)")); m_combo_main.SetCurSel(0); @@ -59,7 +59,7 @@ BOOL CInjectCodeDlg::OnInitDialog() WORD wHour = stTime.wHour; WORD wMinute = stTime.wMinute; WORD wSecond = stTime.wSecond; - Str_remote.Format( _T("C:\\ProgramData\\%d%d%d%d%d.dll"), wMonth, wDay, wHour, wMinute, wSecond); + Str_remote.FormatL( _T("C:\\ProgramData\\%d%d%d%d%d.dll"), wMonth, wDay, wHour, wMinute, wSecond); ((CEdit*)GetDlgItem(IDC_EDIT_PATH_REMOTE))->SetWindowText(Str_remote); isel = 0; @@ -78,7 +78,7 @@ void CInjectCodeDlg::OnBnClickedButtonChoose() void CInjectCodeDlg::OnBnClickedButtonInject() { UpdateData(TRUE); - CDialog::OnOK(); + __super::OnOK(); } diff --git a/server/2015Remote/sys/CInjectCodeDlg.h b/server/2015Remote/sys/CInjectCodeDlg.h index a7e4a70..673c743 100644 --- a/server/2015Remote/sys/CInjectCodeDlg.h +++ b/server/2015Remote/sys/CInjectCodeDlg.h @@ -1,9 +1,9 @@ #pragma once - +#include "LangManager.h" // CInjectCodeDlg 对话框 -class CInjectCodeDlg : public CDialog +class CInjectCodeDlg : public CDialogLang { DECLARE_DYNAMIC(CInjectCodeDlg) diff --git a/server/2015Remote/sys/MachineDlg.cpp b/server/2015Remote/sys/MachineDlg.cpp index 10a83fa..ca4f1b1 100644 --- a/server/2015Remote/sys/MachineDlg.cpp +++ b/server/2015Remote/sys/MachineDlg.cpp @@ -95,13 +95,13 @@ BOOL CMachineDlg::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) SortColumn(pHDNotify->iItem, pHDNotify->iItem == m_nSortedCol ? !m_bAscending : true); } - return CDialog::OnNotify(wParam, lParam, pResult); + return __super::OnNotify(wParam, lParam, pResult); } void CMachineDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST, m_list); DDX_Control(pDX, IDC_TAB, m_tab); @@ -125,14 +125,14 @@ END_MESSAGE_MAP() BOOL CMachineDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here CString str; - str.Format(_T("主机管理 - %s"), m_ContextObject->PeerName.c_str()); + str.FormatL(_T("主机管理 - %s"), m_ContextObject->PeerName.c_str()); SetWindowText(str); m_tab.SetPadding(CSize(6, 3)); @@ -140,15 +140,15 @@ BOOL CMachineDlg::OnInitDialog() m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT | LVS_EX_UNDERLINEHOT | LVS_EX_SUBITEMIMAGES | LVS_EX_GRIDLINES | LVS_EX_INFOTIP); int i = 0; - m_tab.InsertItem(i++, _T("进程管理")); - m_tab.InsertItem(i++, _T("窗口管理")); - m_tab.InsertItem(i++, _T("网络连接")); - m_tab.InsertItem(i++, _T("软件信息")); - m_tab.InsertItem(i++, _T("浏览记录")); - m_tab.InsertItem(i++, _T("收 藏 夹")); - m_tab.InsertItem(i++, _T("WIN32服务")); - m_tab.InsertItem(i++, _T("驱动服务")); - m_tab.InsertItem(i++, _T("计划任务")); + m_tab.InsertTabItemL(i++, "进程管理"); + m_tab.InsertTabItemL(i++, "窗口管理"); + m_tab.InsertTabItemL(i++, "网络连接"); + m_tab.InsertTabItemL(i++, "软件信息"); + m_tab.InsertTabItemL(i++, "浏览记录"); + m_tab.InsertTabItemL(i++, "收 藏 夹"); + m_tab.InsertTabItemL(i++, "WIN32服务"); + m_tab.InsertTabItemL(i++, "驱动服务"); + m_tab.InsertTabItemL(i++, "计划任务"); m_tab.InsertItem(i++, _T("HOSTS")); if (!m_wndStatusBar.Create(this) || @@ -161,7 +161,7 @@ BOOL CMachineDlg::OnInitDialog() m_wndStatusBar.SetPaneInfo(1, m_wndStatusBar.GetItemID(1), SBPS_STRETCH, 0); m_wndStatusBar.SetPaneInfo(2, m_wndStatusBar.GetItemID(2), SBPS_NORMAL, 300); - m_wndStatusBar.SetPaneText(0, _T("就绪")); + m_wndStatusBar.SetPaneTextL(0, "就绪"); RepositionBars(AFX_IDW_CONTROLBAR_FIRST, AFX_IDW_CONTROLBAR_LAST, 0); //显示状态栏 HWND hWndHeader = m_list.GetDlgItem(0)->GetSafeHwnd(); @@ -178,25 +178,25 @@ CString CMachineDlg::__MakePriority(DWORD dwPriClass) CString strRet; switch (dwPriClass) { case REALTIME_PRIORITY_CLASS: - strRet = _T("实时"); + strRet = _L(_T("实时")); break; case HIGH_PRIORITY_CLASS: - strRet = _T("高"); + strRet = _L(_T("高")); break; case ABOVE_NORMAL_PRIORITY_CLASS: - strRet = _T("高于标准"); + strRet = _L(_T("高于标准")); break; case NORMAL_PRIORITY_CLASS: - strRet = _T("标准"); + strRet = _L(_T("标准")); break; case BELOW_NORMAL_PRIORITY_CLASS: - strRet = _T("低于标准"); + strRet = _L(_T("低于标准")); break; case IDLE_PRIORITY_CLASS: - strRet = _T("空闲"); + strRet = _L(_T("空闲")); break; default: - strRet = _T("未知"); + strRet = _L(_T("未知")); break; } @@ -351,7 +351,7 @@ void CMachineDlg::OnSelChangeTab(NMHDR* pNMHDR, LRESULT* pResult) void CMachineDlg::OnSelChangingTab(NMHDR* pNMHDR, LRESULT* pResult) { if (*pResult = IsReceivingData()) { - m_wndStatusBar.SetPaneText(0, "正在接收数据 - 请稍后..."); + m_wndStatusBar.SetPaneText(0, _TR("正在接收数据 - 请稍后...")); } } @@ -391,16 +391,16 @@ void CMachineDlg::DeleteList() void CMachineDlg::ShowProcessList() { - m_list.InsertColumn(0, _T("映像名称"), LVCFMT_LEFT, 100); - m_list.InsertColumn(1, _T("PID"), LVCFMT_LEFT, 50); - m_list.InsertColumn(2, _T("优先级"), LVCFMT_LEFT, 50); - m_list.InsertColumn(3, _T("线程数"), LVCFMT_LEFT, 50); - m_list.InsertColumn(4, _T("用户名"), LVCFMT_LEFT, 70); - m_list.InsertColumn(5, _T("内存"), LVCFMT_LEFT, 70); - m_list.InsertColumn(6, _T("文件大小"), LVCFMT_LEFT, 80); - m_list.InsertColumn(7, _T("程序路径"), LVCFMT_LEFT, 300); - m_list.InsertColumn(8, _T("窗口名称"), LVCFMT_LEFT, 100); - m_list.InsertColumn(9, _T("进程位数"), LVCFMT_LEFT, 80); + m_list.InsertColumnL(0, _T("映像名称"), LVCFMT_LEFT, 100); + m_list.InsertColumnL(1, _T("PID"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(2, _T("优先级"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(3, _T("线程数"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(4, _T("用户名"), LVCFMT_LEFT, 70); + m_list.InsertColumnL(5, _T("内存"), LVCFMT_LEFT, 70); + m_list.InsertColumnL(6, _T("文件大小"), LVCFMT_LEFT, 80); + m_list.InsertColumnL(7, _T("程序路径"), LVCFMT_LEFT, 300); + m_list.InsertColumnL(8, _T("窗口名称"), LVCFMT_LEFT, 100); + m_list.InsertColumnL(9, _T("进程位数"), LVCFMT_LEFT, 80); char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -422,20 +422,20 @@ void CMachineDlg::ShowProcessList() m_list.InsertItem(i, strExeFile, 0); - str.Format(_T("%5u"), *lpPID); + str.FormatL(_T("%5u"), *lpPID); m_list.SetItemText(i, 1, str); m_list.SetItemText(i, 2, __MakePriority(*lpdwPriClass)); - str.Format(_T("%5u"), *lpdwThreads); + str.FormatL(_T("%5u"), *lpdwThreads); m_list.SetItemText(i, 3, str); m_list.SetItemText(i, 4, strProcessUser); - str.Format(_T("%5u K"), *lpdwWorkingSetSize); + str.FormatL(_T("%5u K"), *lpdwWorkingSetSize); m_list.SetItemText(i, 5, str); - str.Format(_T("%5u KB"), *lpdwFileSize); + str.FormatL(_T("%5u KB"), *lpdwFileSize); m_list.SetItemText(i, 6, str); m_list.SetItemText(i, 7, strProcessName); @@ -449,7 +449,7 @@ void CMachineDlg::ShowProcessList() lstrlen(strProcessName) * sizeof(char) + lstrlen(strProcessUser) * sizeof(char) + 6; } - str.Format(_T("程序路径 / %d"), i); + str.FormatL(_T("程序路径 / %d"), i); LVCOLUMN lvc; lvc.mask = LVCF_TEXT; lvc.pszText = str.GetBuffer(0); @@ -462,11 +462,11 @@ void CMachineDlg::ShowProcessList() void CMachineDlg::ShowWindowsList() { - m_list.InsertColumn(0, _T("PID"), LVCFMT_LEFT, 75); - m_list.InsertColumn(1, _T("句柄HWND"), LVCFMT_LEFT, 75); - m_list.InsertColumn(2, _T("窗口名称"), LVCFMT_LEFT, 300); - m_list.InsertColumn(3, _T("窗口状态"), LVCFMT_LEFT, 100); - m_list.InsertColumn(4, _T("大小"), LVCFMT_LEFT, 100); + m_list.InsertColumnL(0, _T("PID"), LVCFMT_LEFT, 75); + m_list.InsertColumnL(1, _T("句柄HWND"), LVCFMT_LEFT, 75); + m_list.InsertColumnL(2, _T("窗口名称"), LVCFMT_LEFT, 300); + m_list.InsertColumnL(3, _T("窗口状态"), LVCFMT_LEFT, 100); + m_list.InsertColumnL(4, _T("大小"), LVCFMT_LEFT, 100); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -476,20 +476,20 @@ void CMachineDlg::ShowWindowsList() for (i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { memcpy(&m_ibfo, lpBuffer + dwOffset, sizeof(WINDOWSINFO)); - str.Format(_T("%5u"), m_ibfo.m_poceessid); + str.FormatL(_T("%5u"), m_ibfo.m_poceessid); m_list.InsertItem(i, str, 25); char t_hwnd[250]; _stprintf_s(t_hwnd, 250, _T("%d"), m_ibfo.m_hwnd); m_list.SetItemText(i, 1, t_hwnd); m_list.SetItemText(i, 2, m_ibfo.strTitle); - m_list.SetItemText(i, 3, m_ibfo.canlook ? _T("显示") : _T("隐藏")); - str.Format(_T("%d*%d"), m_ibfo.w, m_ibfo.h); + m_list.SetItemText(i, 3, m_ibfo.canlook ? _L(_T("显示")) : _L(_T("隐藏"))); + str.FormatL(_T("%d*%d"), m_ibfo.w, m_ibfo.h); m_list.SetItemText(i, 4, str); // ListItem 为进程ID m_list.SetItemData(i, (DWORD_PTR)new ListItem(m_list, i, m_ibfo.m_poceessid)); dwOffset += sizeof(WINDOWSINFO); } - str.Format(_T("窗口名称 / %d"), i); + str.FormatL(_T("窗口名称 / %d"), i); LVCOLUMN lvc = {}; lvc.mask = LVCF_TEXT; lvc.pszText = str.GetBuffer(0); @@ -502,13 +502,13 @@ void CMachineDlg::ShowWindowsList() void CMachineDlg::ShowNetStateList() { - m_list.InsertColumn(0, _T("进程名"), LVCFMT_LEFT, 100); - m_list.InsertColumn(1, _T("PID"), LVCFMT_LEFT, 50); - m_list.InsertColumn(2, _T("协议"), LVCFMT_LEFT, 50); - m_list.InsertColumn(3, _T("本地地址:端口"), LVCFMT_LEFT, 130); - m_list.InsertColumn(4, _T("远程地址:端口"), LVCFMT_LEFT, 130); - m_list.InsertColumn(5, _T("目标IP归属地"), LVCFMT_LEFT, 140); - m_list.InsertColumn(6, _T("连接状态"), LVCFMT_LEFT, 80); + m_list.InsertColumnL(0, _T("进程名"), LVCFMT_LEFT, 100); + m_list.InsertColumnL(1, _T("PID"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(2, _T("协议"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(3, _T("本地地址:端口"), LVCFMT_LEFT, 130); + m_list.InsertColumnL(4, _T("远程地址:端口"), LVCFMT_LEFT, 130); + m_list.InsertColumnL(5, _T("目标IP归属地"), LVCFMT_LEFT, 140); + m_list.InsertColumnL(6, _T("连接状态"), LVCFMT_LEFT, 80); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -523,7 +523,7 @@ void CMachineDlg::ShowNetStateList() } else if (j == 1) { LPDWORD lpPID = LPDWORD(lpBuffer + dwOffset); pid = *lpPID; - str.Format(_T("%d"), *lpPID); + str.FormatL(_T("%d"), *lpPID); m_list.SetItemText(i, j, str); dwOffset += sizeof(DWORD) + 2; } else if (j == 5) { @@ -554,11 +554,11 @@ void CMachineDlg::ShowNetStateList() void CMachineDlg::ShowSoftWareList() { - m_list.InsertColumn(0, _T("软件名称"), LVCFMT_LEFT, 150); - m_list.InsertColumn(1, _T("发行商"), LVCFMT_LEFT, 150); - m_list.InsertColumn(2, _T("版本"), LVCFMT_LEFT, 75); - m_list.InsertColumn(3, _T("安装时间"), LVCFMT_LEFT, 80); - m_list.InsertColumn(4, _T("卸载命令及参数"), LVCFMT_LEFT, 400); + m_list.InsertColumnL(0, _T("软件名称"), LVCFMT_LEFT, 150); + m_list.InsertColumnL(1, _T("发行商"), LVCFMT_LEFT, 150); + m_list.InsertColumnL(2, _T("版本"), LVCFMT_LEFT, 75); + m_list.InsertColumnL(3, _T("安装时间"), LVCFMT_LEFT, 80); + m_list.InsertColumnL(4, _T("卸载命令及参数"), LVCFMT_LEFT, 400); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -579,16 +579,16 @@ void CMachineDlg::ShowSoftWareList() void CMachineDlg::ShowIEHistoryList() { - m_list.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 70); - m_list.InsertColumn(1, _T("访问时间"), LVCFMT_LEFT, 130); - m_list.InsertColumn(2, _T("标题"), LVCFMT_LEFT, 150); - m_list.InsertColumn(3, _T("网页地址"), LVCFMT_LEFT, 400); + m_list.InsertColumnL(0, _T("序号"), LVCFMT_LEFT, 70); + m_list.InsertColumnL(1, _T("访问时间"), LVCFMT_LEFT, 130); + m_list.InsertColumnL(2, _T("标题"), LVCFMT_LEFT, 150); + m_list.InsertColumnL(3, _T("网页地址"), LVCFMT_LEFT, 400); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; CString str; for (int i = 0; dwOffset < m_ContextObject->m_DeCompressionBuffer.GetBufferLen() - 1; i++) { Browsinghistory* p_Browsinghistory = (Browsinghistory*)((char*)lpBuffer + dwOffset); - str.Format(_T("%d"), i); + str.FormatL(_T("%d"), i); m_list.InsertItem(i, str, 0); m_list.SetItemText(i, 1, p_Browsinghistory->strTime); m_list.SetItemText(i, 2, p_Browsinghistory->strTitle); @@ -601,8 +601,8 @@ void CMachineDlg::ShowIEHistoryList() void CMachineDlg::ShowFavoritesUrlList() { - m_list.InsertColumn(0, _T("收藏名称"), LVCFMT_LEFT, 200); - m_list.InsertColumn(1, _T("Url"), LVCFMT_LEFT, 300); + m_list.InsertColumnL(0, _T("收藏名称"), LVCFMT_LEFT, 200); + m_list.InsertColumnL(1, _T("Url"), LVCFMT_LEFT, 300); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -623,14 +623,14 @@ void CMachineDlg::ShowFavoritesUrlList() void CMachineDlg::ShowServiceList() { - m_list.InsertColumn(0, _T("显示名称"), LVCFMT_LEFT, 150); - m_list.InsertColumn(1, _T("描述"), LVCFMT_LEFT, 200); - m_list.InsertColumn(2, _T("状态"), LVCFMT_LEFT, 70); - m_list.InsertColumn(3, _T("启动类型"), LVCFMT_LEFT, 85); - m_list.InsertColumn(4, _T("登陆身份"), LVCFMT_LEFT, 135); - m_list.InsertColumn(5, _T("桌面交互"), LVCFMT_LEFT, 60); - m_list.InsertColumn(6, _T("服务名"), LVCFMT_LEFT, 140); - m_list.InsertColumn(7, _T("可执行文件路径"), LVCFMT_LEFT, 400); + m_list.InsertColumnL(0, _T("显示名称"), LVCFMT_LEFT, 150); + m_list.InsertColumnL(1, _T("描述"), LVCFMT_LEFT, 200); + m_list.InsertColumnL(2, _T("状态"), LVCFMT_LEFT, 70); + m_list.InsertColumnL(3, _T("启动类型"), LVCFMT_LEFT, 85); + m_list.InsertColumnL(4, _T("登陆身份"), LVCFMT_LEFT, 135); + m_list.InsertColumnL(5, _T("桌面交互"), LVCFMT_LEFT, 60); + m_list.InsertColumnL(6, _T("服务名"), LVCFMT_LEFT, 140); + m_list.InsertColumnL(7, _T("可执行文件路径"), LVCFMT_LEFT, 400); char* lpBuffer = (char*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); DWORD dwOffset = 0; @@ -660,22 +660,22 @@ void CMachineDlg::ShowServiceList() } CString strMsgShow; if (i <= 0) { - strMsgShow.Format(_T("无权限或无数据")); + strMsgShow.FormatL(_T("无权限或无数据")); } else { - strMsgShow.Format(_T("共 %d 个服务"), i); + strMsgShow.FormatL(_T("共 %d 个服务"), i); } PostMessage(WM_SHOW_MSG, (WPARAM)new CString(strMsgShow), 0); } void CMachineDlg::ShowTaskList() { - m_list.InsertColumn(0, _T("序号"), LVCFMT_LEFT, 50); - m_list.InsertColumn(1, _T("目录"), LVCFMT_LEFT, 200); - m_list.InsertColumn(2, _T("任务名称"), LVCFMT_LEFT, 300); - m_list.InsertColumn(3, _T("程序路径"), LVCFMT_LEFT, 400); - m_list.InsertColumn(4, _T("状态"), LVCFMT_LEFT, 50); - m_list.InsertColumn(5, _T("最后执行时间"), LVCFMT_LEFT, 130); - m_list.InsertColumn(6, _T("下次执行时间"), LVCFMT_LEFT, 130); + m_list.InsertColumnL(0, _T("序号"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(1, _T("目录"), LVCFMT_LEFT, 200); + m_list.InsertColumnL(2, _T("任务名称"), LVCFMT_LEFT, 300); + m_list.InsertColumnL(3, _T("程序路径"), LVCFMT_LEFT, 400); + m_list.InsertColumnL(4, _T("状态"), LVCFMT_LEFT, 50); + m_list.InsertColumnL(5, _T("最后执行时间"), LVCFMT_LEFT, 130); + m_list.InsertColumnL(6, _T("下次执行时间"), LVCFMT_LEFT, 130); BYTE* lpBuffer = (BYTE*)(m_ContextObject->m_DeCompressionBuffer.GetBuffer() + 1); DATE lasttime = 0; @@ -690,7 +690,7 @@ void CMachineDlg::ShowTaskList() lasttime = *((DATE*)(status + lstrlen(status) + 1)); nexttime = *((DATE*)((CHAR*)(status + lstrlen(status) + 1) + sizeof(DATE))); ULONGLONG a = *((ULONGLONG*)(&lasttime)); - str.Format(_T("%d"), i + 1); + str.FormatL(_T("%d"), i + 1); if(!m_list.GetSafeHwnd()) continue; m_list.InsertItem(i, str); @@ -718,7 +718,7 @@ void CMachineDlg::ShowTaskList() void CMachineDlg::ShowHostsList() { - m_list.InsertColumn(0, _T("数据"), LVCFMT_LEFT, 600); + m_list.InsertColumnL(0, _T("数据"), LVCFMT_LEFT, 600); LPBYTE lpBuffer = (LPBYTE)(m_ContextObject->m_DeCompressionBuffer.GetBuffer(1)); int i = 0; @@ -738,7 +738,7 @@ void CMachineDlg::ShowHostsList() void CMachineDlg::OnSize(UINT nType, int cx, int cy) { - CDialog::OnSize(nType, cx, cy); + __super::OnSize(nType, cx, cy); // TODO: Add your message handler code here if (IsWindowVisible()) @@ -831,18 +831,18 @@ void CMachineDlg::ShowProcessList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("删除文件(&C)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("结束进程(&E)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("冻结进程(&D)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("解冻进程(&J)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("强删文件(&Q)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("注入管理(&I)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("删除文件(&C)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("结束进程(&E)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 400, _T("冻结进程(&D)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 500, _T("解冻进程(&J)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 600, _T("强删文件(&Q)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 700, _T("注入管理(&I)")); CPoint p; GetCursorPos(&p); @@ -870,7 +870,7 @@ void CMachineDlg::ShowProcessList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; case 200: { @@ -989,21 +989,21 @@ void CMachineDlg::ShowWindowsList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("还原窗口(&H)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("隐藏窗口(&Y)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("关闭窗口(&E)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("最 大 化(&M)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("最 小 化(&I)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("冻结进程(&D)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("解冻进程(&J)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 900, _T("结束进程(&E)")); - menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("还原窗口(&H)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("隐藏窗口(&Y)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 400, _T("关闭窗口(&E)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 500, _T("最 大 化(&M)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 600, _T("最 小 化(&I)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 700, _T("冻结进程(&D)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 800, _T("解冻进程(&J)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 900, _T("结束进程(&E)")); + menu.AppendMenuSeparator(MF_SEPARATOR); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1030,7 +1030,7 @@ void CMachineDlg::ShowWindowsList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; case 200: { @@ -1040,7 +1040,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("发送还原命令")); + m_list.SetItemTextL(nItem, 3, "发送还原命令"); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_RESTORE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1055,7 +1055,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("发送隐藏命令")); + m_list.SetItemTextL(nItem, 3, "发送隐藏命令"); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_HIDE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1071,7 +1071,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_CLOSE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("发送关闭命令")); + m_list.SetItemTextL(nItem, 3, "发送关闭命令"); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); m_ContextObject->Send2Client(lpMsgBuf, sizeof(lpMsgBuf)); } @@ -1084,7 +1084,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("发送最大化命令")); + m_list.SetItemTextL(nItem, 3, "发送最大化命令"); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_MAXIMIZE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1099,7 +1099,7 @@ void CMachineDlg::ShowWindowsList_menu() ZeroMemory(lpMsgBuf, 20); lpMsgBuf[0] = COMMAND_WINDOW_OPERATE; DWORD hwnd = _tstoi(m_list.GetItemText(nItem, 1)); - m_list.SetItemText(nItem, 3, _T("发送最小化命令")); + m_list.SetItemTextL(nItem, 3, "发送最小化命令"); memcpy(lpMsgBuf + 1, &hwnd, sizeof(DWORD)); DWORD dHow = SW_MINIMIZE; memcpy(lpMsgBuf + 1 + sizeof(hwnd), &dHow, sizeof(DWORD)); @@ -1163,10 +1163,10 @@ void CMachineDlg::ShowNetStateList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 150, _T("结束进程(&C)")); - menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 150, _T("结束进程(&C)")); + menu.AppendMenuSeparator(MF_SEPARATOR); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1193,7 +1193,7 @@ void CMachineDlg::ShowNetStateList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; case 150: { @@ -1220,10 +1220,10 @@ void CMachineDlg::ShowSoftWareList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("卸载程序(&X)")); - menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("卸载程序(&X)")); + menu.AppendMenuSeparator(MF_SEPARATOR); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1250,7 +1250,7 @@ void CMachineDlg::ShowSoftWareList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; case 200: { @@ -1258,7 +1258,7 @@ void CMachineDlg::ShowSoftWareList_menu() return; } - if (MessageBox(_T("确定要卸载该程序?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDNO) + if (MessageBoxL(_T("确定要卸载该程序?"), _T("提示"), MB_YESNO | MB_ICONQUESTION) == IDNO) return; POSITION pos = m_list.GetFirstSelectedItemPosition(); @@ -1290,10 +1290,10 @@ void CMachineDlg::ShowIEHistoryList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenuSeparator(MF_SEPARATOR); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1320,7 +1320,7 @@ void CMachineDlg::ShowIEHistoryList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; @@ -1335,11 +1335,11 @@ void CMachineDlg::ShowTaskList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("&(R)执行任务")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 101, _T("&(T)停止任务")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 102, _T("&(D)删除任务")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 103, _T("&(C)创建任务")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 104, _T("&(F)刷新任务")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("&(R)执行任务")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 101, _T("&(T)停止任务")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 102, _T("&(D)删除任务")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 103, _T("&(C)创建任务")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 104, _T("&(F)刷新任务")); CPoint p; GetCursorPos(&p); int nMenuResult = menu.TrackPopupMenu(TPM_RETURNCMD | TPM_LEFTALIGN | TPM_RIGHTBUTTON, p.x, p.y, this, NULL); @@ -1478,10 +1478,10 @@ void CMachineDlg::ShowFavoritesUrlList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_SEPARATOR, NULL); + menu.AppendMenuSeparator(MF_SEPARATOR); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1508,7 +1508,7 @@ void CMachineDlg::ShowFavoritesUrlList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; default: @@ -1522,17 +1522,17 @@ void CMachineDlg::ShowServiceList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("启动(&S)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("停止(&O)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("暂停(&U)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 400, _T("恢复(&M)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 500, _T("重新启动(&E)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 600, _T("刷新(&R)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 700, _T("属性(&R)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 800, _T("删除服务(&D)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("启动(&S)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("停止(&O)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("暂停(&U)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 400, _T("恢复(&M)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 500, _T("重新启动(&E)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 600, _T("刷新(&R)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 700, _T("属性(&R)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 800, _T("删除服务(&D)")); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1585,11 +1585,11 @@ void CMachineDlg::ShowHostsList_menu() { CMenu menu; VERIFY(menu.CreatePopupMenu()); - menu.AppendMenu(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); - menu.AppendMenu(MF_SEPARATOR, NULL); - menu.AppendMenu(MF_STRING | MF_ENABLED, 200, _T("修改远程文件(&S)")); - menu.AppendMenu(MF_STRING | MF_ENABLED, 300, _T("加载本地文件(&S)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 50, _T("刷新数据(&F)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 100, _T("复制数据(&V)")); + menu.AppendMenuSeparator(MF_SEPARATOR); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 200, _T("修改远程文件(&S)")); + menu.AppendMenuL(MF_STRING | MF_ENABLED, 300, _T("加载本地文件(&S)")); CPoint p; GetCursorPos(&p); int nMenuResult = ::TrackPopupMenu(menu, TPM_LEFTALIGN | TPM_RIGHTBUTTON | TPM_RETURNCMD, p.x, p.y, 0, GetSafeHwnd(), NULL); @@ -1616,7 +1616,7 @@ void CMachineDlg::ShowHostsList_menu() Data += _T("\r\n"); } SetClipboardText(Data); - MessageBox(_T("已复制数据到剪切板!"), "提示"); + MessageBoxL(_T("已复制数据到剪切板!"), "提示", MB_ICONINFORMATION); } break; case 200: { @@ -1643,7 +1643,7 @@ void CMachineDlg::ShowHostsList_menu() LPBYTE lpBuffer = NULL; CFileDialog dlg(TRUE, _T("*.txt"), NULL, OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST | OFN_HIDEREADONLY, _T("图片文件(*.txt;*.txt)|*.txt;*.txt| All Files (*.*) |*.*||"), NULL); - dlg.m_ofn.lpstrTitle = _T("选择文件"); + dlg.m_ofn.lpstrTitle = _L(_T("选择文件")); if (dlg.DoModal() != IDOK) break; @@ -1691,7 +1691,7 @@ CString CMachineDlg::oleTime2Str(double time) time_t t = (time_t)(time * 24 * 3600 - 2209190400); struct tm tm1; localtime_s(&tm1, &t); - str.Format(_T("%04d-%02d-%02d %02d:%02d:%02d"), tm1.tm_year + 1900, tm1.tm_mon + 1, + str.FormatL(_T("%04d-%02d-%02d %02d:%02d:%02d"), tm1.tm_year + 1900, tm1.tm_mon + 1, tm1.tm_mday, tm1.tm_hour, tm1.tm_min, tm1.tm_sec); } return str; diff --git a/server/2015Remote/sys/ServiceInfoDlg.cpp b/server/2015Remote/sys/ServiceInfoDlg.cpp index 73a83c5..9c099d3 100644 --- a/server/2015Remote/sys/ServiceInfoDlg.cpp +++ b/server/2015Remote/sys/ServiceInfoDlg.cpp @@ -11,7 +11,7 @@ CServiceInfoDlg::CServiceInfoDlg(CWnd* pParent /*=NULL*/) - : CDialog(CServiceInfoDlg::IDD, pParent) + : CDialogLang(CServiceInfoDlg::IDD, pParent) { m_hIcon = LoadIcon(AfxGetInstanceHandle(), MAKEINTRESOURCE(IDI_SERVICE)); } @@ -19,7 +19,7 @@ CServiceInfoDlg::CServiceInfoDlg(CWnd* pParent /*=NULL*/) void CServiceInfoDlg::DoDataExchange(CDataExchange* pDX) { - CDialog::DoDataExchange(pDX); + __super::DoDataExchange(pDX); DDX_Control(pDX, IDC_COMBO_RUNWAY, m_combox_runway); } @@ -37,15 +37,15 @@ END_MESSAGE_MAP() BOOL CServiceInfoDlg::OnInitDialog() { - CDialog::OnInitDialog(); + __super::OnInitDialog(); SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon // TODO: Add extra initialization here - m_combox_runway.InsertString(0, _T("自动")); // 0 - m_combox_runway.InsertString(1, _T("手动")); // 1 - m_combox_runway.InsertString(2, _T("已禁用")); // 2 + m_combox_runway.InsertStringL(0, _T("自动")); // 0 + m_combox_runway.InsertStringL(1, _T("手动")); // 1 + m_combox_runway.InsertStringL(2, _T("已禁用")); // 2 SetDlgItemText(IDC_EDIT_SERNAME, m_ServiceInfo.strSerName); SetDlgItemText(IDC_EDIT_SERDISPLAYNAME, m_ServiceInfo.strSerDisPlayname); diff --git a/server/2015Remote/sys/ServiceInfoDlg.h b/server/2015Remote/sys/ServiceInfoDlg.h index 7a5fd8b..5458388 100644 --- a/server/2015Remote/sys/ServiceInfoDlg.h +++ b/server/2015Remote/sys/ServiceInfoDlg.h @@ -1,5 +1,6 @@ #pragma once #include "MachineDlg.h" +#include "LangManager.h" ///////////////////////////////////////////////////////////////////////////// // CServiceInfoDlg dialog @@ -13,7 +14,7 @@ typedef struct { CString strSerState; } SERVICEINFO; -class CServiceInfoDlg : public CDialog +class CServiceInfoDlg : public CDialogLang { public: CServiceInfoDlg(CWnd* pParent = NULL);