360 lines
14 KiB
C++
360 lines
14 KiB
C++
// SettingDlg.cpp : 实现文件
|
||
//
|
||
|
||
#include "stdafx.h"
|
||
#include "2015Remote.h"
|
||
#include "SettingDlg.h"
|
||
#include "afxdialogex.h"
|
||
#include "client/CursorInfo.h"
|
||
#include "common/location.h"
|
||
|
||
// CSettingDlg 对话框
|
||
|
||
IMPLEMENT_DYNAMIC(CSettingDlg, CDialog)
|
||
|
||
CSettingDlg::CSettingDlg(CMy2015RemoteDlg* pParent)
|
||
: CDialogLang(CSettingDlg::IDD, pParent)
|
||
, m_nListenPort("6543")
|
||
, m_nMax_Connect(0)
|
||
, m_sScreenCapture(_T("GDI"))
|
||
, m_sScreenCompress(_T("RGBA->RGB565"))
|
||
, m_nReportInterval(5)
|
||
, m_sSoftwareDetect(_T("摄像头"))
|
||
, m_sPublicIP(_T(""))
|
||
, m_sUdpOption(_T("UDP"))
|
||
, m_nFrpPort(7000)
|
||
, m_sFrpToken(_T(""))
|
||
, m_nFileServerPort(-1)
|
||
{
|
||
g_2015RemoteDlg = pParent;
|
||
}
|
||
|
||
CSettingDlg::~CSettingDlg()
|
||
{
|
||
}
|
||
|
||
void CSettingDlg::DoDataExchange(CDataExchange* 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);
|
||
DDX_Control(pDX, IDC_BUTTON_SETTINGAPPLY, m_ApplyButton);
|
||
DDX_Control(pDX, IDC_COMBO_SCREEN_CAPTURE, m_ComboScreenCapture);
|
||
DDX_CBString(pDX, IDC_COMBO_SCREEN_CAPTURE, m_sScreenCapture);
|
||
DDV_MaxChars(pDX, m_sScreenCapture, 32);
|
||
DDX_Control(pDX, IDC_COMBO_SCREEN_COMPRESS, m_ComboScreenCompress);
|
||
DDX_CBString(pDX, IDC_COMBO_SCREEN_COMPRESS, m_sScreenCompress);
|
||
DDX_Control(pDX, IDC_EDIT_REPORTINTERVAL, m_EditReportInterval);
|
||
DDX_Text(pDX, IDC_EDIT_REPORTINTERVAL, m_nReportInterval);
|
||
DDV_MinMaxInt(pDX, m_nReportInterval, 0, 3600);
|
||
DDX_Control(pDX, IDC_COMBO_SOFTWAREDETECT, m_ComboSoftwareDetect);
|
||
DDX_CBString(pDX, IDC_COMBO_SOFTWAREDETECT, m_sSoftwareDetect);
|
||
DDV_MaxChars(pDX, m_sSoftwareDetect, 256);
|
||
DDX_Control(pDX, IDC_EDIT_PUBLIC_IP, m_EditPublicIP);
|
||
DDX_Text(pDX, IDC_EDIT_PUBLIC_IP, m_sPublicIP);
|
||
DDV_MaxChars(pDX, m_sPublicIP, 100);
|
||
DDX_Control(pDX, IDC_EDIT_UDP_OPTION, m_EditUdpOption);
|
||
DDX_Text(pDX, IDC_EDIT_UDP_OPTION, m_sUdpOption);
|
||
DDV_MaxChars(pDX, m_sUdpOption, 24);
|
||
DDX_Control(pDX, IDC_EDIT_FRP_PORT, m_EditFrpPort);
|
||
DDX_Text(pDX, IDC_EDIT_FRP_PORT, m_nFrpPort);
|
||
DDV_MinMaxInt(pDX, m_nFrpPort, 1, 65535);
|
||
DDX_Control(pDX, IDC_EDIT_FRP_TOKEN, m_EditFrpToken);
|
||
DDX_Text(pDX, IDC_EDIT_FRP_TOKEN, m_sFrpToken);
|
||
DDV_MaxChars(pDX, m_sFrpToken, 24);
|
||
DDX_Control(pDX, IDC_COMBO_VIDEO_WALL, m_ComboVideoWall);
|
||
DDX_Control(pDX, IDC_EDIT_FILESERVER_PORT, m_EditFileServerPort);
|
||
DDX_Text(pDX, IDC_EDIT_FILESERVER_PORT, m_nFileServerPort);
|
||
DDV_MinMaxInt(pDX, m_nFileServerPort, -1, 65535);
|
||
}
|
||
|
||
BEGIN_MESSAGE_MAP(CSettingDlg, CDialog)
|
||
ON_BN_CLICKED(IDC_BUTTON_SETTINGAPPLY, &CSettingDlg::OnBnClickedButtonSettingapply)
|
||
ON_EN_CHANGE(IDC_EDIT_PORT, &CSettingDlg::OnEnChangeEditPort)
|
||
ON_EN_CHANGE(IDC_EDIT_MAX, &CSettingDlg::OnEnChangeEditMax)
|
||
ON_BN_CLICKED(IDC_RADIO_ALL_SCREEN, &CSettingDlg::OnBnClickedRadioAllScreen)
|
||
ON_BN_CLICKED(IDC_RADIO_MAIN_SCREEN, &CSettingDlg::OnBnClickedRadioMainScreen)
|
||
ON_BN_CLICKED(IDC_RADIO_FRP_OFF, &CSettingDlg::OnBnClickedRadioFrpOff)
|
||
ON_BN_CLICKED(IDC_RADIO_FRP_ON, &CSettingDlg::OnBnClickedRadioFrpOn)
|
||
ON_EN_KILLFOCUS(IDC_EDIT_PUBLIC_IP, &CSettingDlg::OnEnKillfocusEditPublicIp)
|
||
END_MESSAGE_MAP()
|
||
|
||
|
||
// CSettingDlg 消息处理程序
|
||
|
||
|
||
BOOL CSettingDlg::OnInitDialog()
|
||
{
|
||
__super::OnInitDialog();
|
||
// 多语言翻译 - Static控件
|
||
SetDlgItemText(IDC_STATIC_SET_LISTEN_PORT, _TR("监听端口:"));
|
||
SetDlgItemText(IDC_STATIC_SET_MAX_CONN, _TR("最大连接数:"));
|
||
SetDlgItemText(IDC_STATIC_SET_TIP1, _TR("操作提示: 1.监听端口支持填写多个,用英文分号分隔;程序同时监听TCP和UDP,且支持基于UDP的KCP;"));
|
||
SetDlgItemText(IDC_STATIC_SET_TIP2, _TR("操作提示: 2.如果被控端跨网、地区或国家,务必设置公网IP;勾选FRP反向代理并设置服务端口和 token;"));
|
||
SetDlgItemText(IDC_STATIC_SET_TIP3, _TR("操作提示: 3.如果以下载的方式提供上线载荷 (如图片),必须设置Web端口,受管机器上线时会下载载荷。"));
|
||
SetDlgItemText(IDC_STATIC_SET_SCREEN_CAP, _TR("屏幕截图方法:"));
|
||
SetDlgItemText(IDC_STATIC_SET_IMG_COMP, _TR("图像压缩方法:"));
|
||
SetDlgItemText(IDC_STATIC_SET_REPORT_INT, _TR("上报间隔:"));
|
||
SetDlgItemText(IDC_STATIC_SET_SW_DETECT, _TR("软件检测:"));
|
||
SetDlgItemText(IDC_STATIC_SET_MULTI_MON, _TR("多显示器支持:"));
|
||
SetDlgItemText(IDC_STATIC_SET_UDP_PARAM, _TR("UDP协议参数:"));
|
||
SetDlgItemText(IDC_STATIC_SET_FRP_PROXY, _TR("FRP 代理:"));
|
||
SetDlgItemText(IDC_STATIC_SET_FRP_PORT, _TR("服务端口:"));
|
||
SetDlgItemText(IDC_STATIC_SET_TOKEN, _TR("token:"));
|
||
SetDlgItemText(IDC_STATIC_SET_VIDEO_WALL, _TR("多屏上墙:"));
|
||
SetDlgItemText(IDC_STATIC_SET_DL_PORT, _TR("Web端口:"));
|
||
SetDlgItemText(IDC_GROUP_SET_GENERAL, _TR("常规设置"));
|
||
SetDlgItemText(IDC_GROUP_SET_DESKTOP, _TR("桌面管理"));
|
||
SetDlgItemText(IDC_GROUP_SET_PARAMS, _TR("参数设置"));
|
||
|
||
// 设置对话框标题和控件文本(解决英语系统乱码问题)
|
||
SetWindowText(_TR("设置"));
|
||
SetDlgItemText(IDOK, _TR("确定"));
|
||
SetDlgItemText(IDCANCEL, _TR("取消"));
|
||
SetDlgItemText(IDC_BUTTON_SETTINGAPPLY, _TR("应用"));
|
||
SetDlgItemText(IDC_RADIO_FRP_OFF, _TR("否"));
|
||
SetDlgItemText(IDC_RADIO_FRP_ON, _TR("是"));
|
||
SetDlgItemText(IDC_RADIO_ALL_SCREEN, _TR("否"));
|
||
SetDlgItemText(IDC_RADIO_MAIN_SCREEN, _TR("是"));
|
||
|
||
// 检测本机 IP 并设置标签和提示
|
||
std::string localPublicIP, localPrivateIP;
|
||
g_2015RemoteDlg->m_IPConverter->GetLocalIPs(localPublicIP, localPrivateIP);
|
||
std::string frpAutoServer = THIS_CFG.GetStr("frp_auto", "server", "");
|
||
BOOL frpEnabled = THIS_CFG.GetInt("frp", "UseFrp");
|
||
std::string savedMaster = THIS_CFG.GetStr("settings", "master", "");
|
||
|
||
if (!localPublicIP.empty()) {
|
||
// 场景 1: 本机有公网 IP
|
||
SetDlgItemText(IDC_STATIC_SET_PUBLIC_IP, _TR("公网地址:"));
|
||
m_sPublicIP = savedMaster.empty() ? localPublicIP.c_str() : savedMaster.c_str();
|
||
SetDlgItemText(IDC_STATIC_SET_IP_HINT, _T(""));
|
||
} else if (!frpAutoServer.empty()) {
|
||
// 场景 2: 上级配置了 FRP
|
||
SetDlgItemText(IDC_STATIC_SET_PUBLIC_IP, _TR("公网地址:"));
|
||
m_sPublicIP = frpAutoServer.c_str();
|
||
SetDlgItemText(IDC_STATIC_SET_IP_HINT, _T(""));
|
||
} else if (frpEnabled) {
|
||
// 场景 3: 启用了本地 FRP(FRP服务器应有公网IP)
|
||
SetDlgItemText(IDC_STATIC_SET_PUBLIC_IP, _TR("公网地址:"));
|
||
m_sPublicIP = savedMaster.c_str();
|
||
SetDlgItemText(IDC_STATIC_SET_IP_HINT, _TR("该地址必须为FRP代理服务器IP"));
|
||
} else {
|
||
// 场景 4: 无公网,无 FRP(仅限局域网)
|
||
SetDlgItemText(IDC_STATIC_SET_PUBLIC_IP, _TR("内网地址:"));
|
||
m_sPublicIP = savedMaster.empty() ? localPrivateIP.c_str() : savedMaster.c_str();
|
||
SetDlgItemText(IDC_STATIC_SET_IP_HINT, _TR("跨网使用请配置 FRP 反向代理"));
|
||
}
|
||
m_sOriginalMaster = m_sPublicIP; // 缓存原始值,用于检测修改
|
||
std::string nPort = THIS_CFG.GetStr("settings", "ghost", "6543");
|
||
std::map<std::string, std::string> udpMap = { {"UDP", "UDP"}, {"KCP", "KCP"} };
|
||
std::string method = THIS_CFG.GetStr("settings", "UDPOption", "UDP").c_str();
|
||
m_sUdpOption = udpMap.find(method) == udpMap.end() ? "UDP" : udpMap[method].c_str();
|
||
|
||
int DXGI = THIS_CFG.GetInt("settings", "DXGI");
|
||
|
||
CString algo = THIS_CFG.GetStr("settings", "ScreenCompress", "").c_str();
|
||
|
||
m_nListenPort = nPort.c_str();
|
||
|
||
int n = algo.IsEmpty() ? ALGORITHM_DIFF : atoi(algo.GetString());
|
||
switch (n) {
|
||
case ALGORITHM_GRAY:
|
||
m_sScreenCompress = _L(_T("灰度图像传输"));
|
||
break;
|
||
case ALGORITHM_DIFF:
|
||
m_sScreenCompress = _L(_T("屏幕差异算法"));
|
||
break;
|
||
case ALGORITHM_H264:
|
||
m_sScreenCompress = _L(_T("H264压缩算法"));
|
||
break;
|
||
case ALGORITHM_RGB565:
|
||
m_sScreenCompress = _L(_T("RGBA->RGB565"));
|
||
break;
|
||
default:
|
||
break;
|
||
}
|
||
m_ComboScreenCompress.InsertStringL(ALGORITHM_GRAY, "灰度图像传输");
|
||
m_ComboScreenCompress.InsertStringL(ALGORITHM_DIFF, "屏幕差异算法");
|
||
m_ComboScreenCompress.InsertStringL(ALGORITHM_H264, "H264压缩算法");
|
||
m_ComboScreenCompress.InsertStringL(ALGORITHM_RGB565, "RGBA->RGB565");
|
||
|
||
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.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 = _L(_T("摄像头"));
|
||
break;
|
||
case SOFTWARE_TELEGRAM:
|
||
m_sSoftwareDetect = _L(_T("电报"));
|
||
break;
|
||
default:
|
||
m_sSoftwareDetect = _L(_T("摄像头"));
|
||
break;
|
||
}
|
||
BOOL all = THIS_CFG.GetInt("settings", "MultiScreen", TRUE);
|
||
((CButton*)GetDlgItem(IDC_RADIO_ALL_SCREEN))->SetCheck(!all);
|
||
((CButton*)GetDlgItem(IDC_RADIO_MAIN_SCREEN))->SetCheck(all);
|
||
|
||
BOOL frp = THIS_CFG.GetInt("frp", "UseFrp");
|
||
((CButton*)GetDlgItem(IDC_RADIO_FRP_OFF))->SetCheck(!frp);
|
||
((CButton*)GetDlgItem(IDC_RADIO_FRP_ON))->SetCheck(frp);
|
||
GetDlgItem(IDC_EDIT_FRP_PORT)->EnableWindow(frp);
|
||
GetDlgItem(IDC_EDIT_FRP_TOKEN)->EnableWindow(frp);
|
||
#ifndef _WIN64
|
||
GetDlgItem(IDC_RADIO_FRP_OFF)->EnableWindow(FALSE);
|
||
GetDlgItem(IDC_RADIO_FRP_ON)->EnableWindow(FALSE);
|
||
GetDlgItem(IDC_EDIT_FRP_PORT)->EnableWindow(FALSE);
|
||
GetDlgItem(IDC_EDIT_FRP_TOKEN)->EnableWindow(FALSE);
|
||
#endif
|
||
m_nFrpPort = THIS_CFG.GetInt("frp", "server_port", 7000);
|
||
m_sFrpToken = THIS_CFG.GetStr("frp", "token").c_str();
|
||
m_nFileServerPort = THIS_CFG.GetInt("settings", "WebSvrPort", -1);
|
||
|
||
int size = THIS_CFG.GetInt("settings", "VideoWallSize");
|
||
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);
|
||
|
||
UpdateData(FALSE);
|
||
|
||
return TRUE;
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnBnClickedButtonSettingapply()
|
||
{
|
||
UpdateData(TRUE);
|
||
THIS_CFG.SetStr("settings", "master", m_sPublicIP.GetBuffer());
|
||
THIS_CFG.SetStr("settings", "ghost", m_nListenPort.GetString());
|
||
THIS_CFG.SetStr("settings", "UDPOption", m_sUdpOption.GetString());
|
||
|
||
int n = m_ComboScreenCapture.GetCurSel();
|
||
THIS_CFG.SetInt("settings", "DXGI", n);
|
||
|
||
n = m_ComboScreenCompress.GetCurSel();
|
||
THIS_CFG.SetInt("settings", "ScreenCompress", n);
|
||
|
||
THIS_CFG.SetInt("settings", "ReportInterval", m_nReportInterval);
|
||
n = m_ComboSoftwareDetect.GetCurSel();
|
||
THIS_CFG.SetInt("settings", "SoftwareDetect", n);
|
||
|
||
BOOL all = ((CButton*)GetDlgItem(IDC_RADIO_MAIN_SCREEN))->GetCheck();
|
||
THIS_CFG.SetInt("settings", "MultiScreen", all);
|
||
|
||
BOOL frp = ((CButton*)GetDlgItem(IDC_RADIO_FRP_ON))->GetCheck();
|
||
THIS_CFG.SetInt("frp", "UseFrp", frp);
|
||
THIS_CFG.SetInt("frp", "server_port", m_nFrpPort);
|
||
THIS_CFG.SetStr("frp", "token", m_sFrpToken.GetString());
|
||
THIS_CFG.SetInt("settings", "WebSvrPort", m_nFileServerPort);
|
||
if (m_nFileServerPort > 0 && THIS_CFG.GetStr("settings", "Authorization").empty()) {
|
||
MessageBoxL("Web端口设置无效!\n必须具有有效的授权才能使用Web远程监控!", "提示", MB_ICONWARNING);
|
||
}
|
||
|
||
THIS_CFG.SetInt("settings", "VideoWallSize", m_ComboVideoWall.GetCurSel()+1);
|
||
|
||
m_ApplyButton.EnableWindow(FALSE);
|
||
m_ApplyButton.ShowWindow(SW_HIDE);
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnEnChangeEditPort()
|
||
{
|
||
// TODO: 如果该控件是 RICHEDIT 控件,它将不
|
||
// 发送此通知,除非重写 __super::OnInitDialog()
|
||
// 函数并调用 CRichEditCtrl().SetEventMask(),
|
||
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
|
||
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
|
||
// 给Button添加变量
|
||
m_ApplyButton.ShowWindow(SW_NORMAL);
|
||
m_ApplyButton.EnableWindow(TRUE);
|
||
}
|
||
|
||
void CSettingDlg::OnEnChangeEditMax()
|
||
{
|
||
// TODO: 如果该控件是 RICHEDIT 控件,它将不
|
||
// 发送此通知,除非重写 __super::OnInitDialog()
|
||
// 函数并调用 CRichEditCtrl().SetEventMask(),
|
||
// 同时将 ENM_CHANGE 标志“或”运算到掩码中。
|
||
|
||
// TODO: 在此添加控件通知处理程序代码
|
||
HWND hApplyButton = ::GetDlgItem(m_hWnd,IDC_BUTTON_SETTINGAPPLY);
|
||
|
||
::ShowWindow(hApplyButton,SW_NORMAL);
|
||
::EnableWindow(hApplyButton,TRUE);
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnOK()
|
||
{
|
||
OnBnClickedButtonSettingapply();
|
||
|
||
__super::OnOK();
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnBnClickedRadioAllScreen()
|
||
{
|
||
BOOL b = ((CButton*)GetDlgItem(IDC_RADIO_ALL_SCREEN))->GetCheck();
|
||
((CButton*)GetDlgItem(IDC_RADIO_MAIN_SCREEN))->SetCheck(!b);
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnBnClickedRadioMainScreen()
|
||
{
|
||
BOOL b = ((CButton*)GetDlgItem(IDC_RADIO_MAIN_SCREEN))->GetCheck();
|
||
((CButton*)GetDlgItem(IDC_RADIO_ALL_SCREEN))->SetCheck(!b);
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnBnClickedRadioFrpOff()
|
||
{
|
||
BOOL b = ((CButton*)GetDlgItem(IDC_RADIO_FRP_OFF))->GetCheck();
|
||
((CButton*)GetDlgItem(IDC_RADIO_FRP_ON))->SetCheck(!b);
|
||
GetDlgItem(IDC_EDIT_FRP_PORT)->EnableWindow(!b);
|
||
GetDlgItem(IDC_EDIT_FRP_TOKEN)->EnableWindow(!b);
|
||
}
|
||
|
||
|
||
void CSettingDlg::OnBnClickedRadioFrpOn()
|
||
{
|
||
BOOL b = ((CButton*)GetDlgItem(IDC_RADIO_FRP_ON))->GetCheck();
|
||
((CButton*)GetDlgItem(IDC_RADIO_FRP_OFF))->SetCheck(!b);
|
||
GetDlgItem(IDC_EDIT_FRP_PORT)->EnableWindow(b);
|
||
GetDlgItem(IDC_EDIT_FRP_TOKEN)->EnableWindow(b);
|
||
}
|
||
|
||
void CSettingDlg::OnEnKillfocusEditPublicIp()
|
||
{
|
||
auto bindType = THIS_CFG.GetInt("settings", "BindType", 0);
|
||
if (bindType == 1 && !THIS_CFG.GetStr("settings", "Password").empty()) {
|
||
GetDlgItemText(IDC_EDIT_PUBLIC_IP, m_sPublicIP);
|
||
if (m_sPublicIP != m_sOriginalMaster) {
|
||
if (IDYES == MessageBox(_TR("修改绑定的公网地址将导致授权失效! 是否继续?"),
|
||
_TR("提示"), MB_ICONWARNING | MB_YESNO)) {
|
||
// 用户确认修改,更新缓存值避免重复警告
|
||
m_sOriginalMaster = m_sPublicIP;
|
||
} else {
|
||
// 用户取消,恢复原值
|
||
m_sPublicIP = m_sOriginalMaster;
|
||
SetDlgItemText(IDC_EDIT_PUBLIC_IP, m_sPublicIP);
|
||
}
|
||
}
|
||
}
|
||
}
|