diff --git a/client/ScreenManager.cpp b/client/ScreenManager.cpp index a2857b9..7734c26 100644 --- a/client/ScreenManager.cpp +++ b/client/ScreenManager.cpp @@ -341,7 +341,7 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) ULONG ulNextSendLength = 0; const char* szBuffer = This->GetNextScreen(ulNextSendLength); if (szBuffer) { - s0 = max(s0, 50); // 最快每秒20帧 + s0 = max(s0, 1000./This->m_nMaxFPS); // 最快每秒20帧 s0 = min(s0, 1000); int span = s0-(clock() - last); Sleep(span > 0 ? span : 1); @@ -361,7 +361,7 @@ DWORD WINAPI CScreenManager::WorkThreadProc(LPVOID lParam) s0 = (s0 >= sleep/4) ? s0/alpha : s0; c2 = 0; #if _DEBUG - if (1000./s0<20.0) + if (1000./s0m_nMaxFPS) Mprintf("[-]SendScreen Span= %dms, s0= %f, fps= %f\n", span, s0, 1000./s0); #endif } @@ -478,6 +478,11 @@ VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength) m_ClientObject->SetMultiThreadCompress(threadNum); break; } + case CMD_FPS: { + m_nMaxFPS = min(255, unsigned(szBuffer[1])); + m_nMaxFPS = max(m_nMaxFPS, 1); + break; + } case COMMAND_NEXT: { m_DlgID = ulLength >= 9 ? *((uint64_t*)(szBuffer + 1)) : 0; NotifyDialogIsOpen(); diff --git a/client/ScreenManager.h b/client/ScreenManager.h index a6af80c..932b952 100644 --- a/client/ScreenManager.h +++ b/client/ScreenManager.h @@ -64,6 +64,7 @@ public: virtual BOOL OnReconnect(); uint64_t m_DlgID = 0; BOOL m_SendFirst = FALSE; + int m_nMaxFPS = 20; // BOOL m_virtual; POINT m_point; diff --git a/common/commands.h b/common/commands.h index 3ad165d..9c2f584 100644 --- a/common/commands.h +++ b/common/commands.h @@ -197,6 +197,7 @@ enum { COMMAND_SEND_FILE = 68, // ļ COMMAND_SWITCH_SCREEN = 69, CMD_MULTITHREAD_COMPRESS = 70, + CMD_FPS = 71, // ˷ıʶ TOKEN_AUTH = 100, // Ҫ֤ diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index b7dc3bc..85e8ce9 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -29,6 +29,12 @@ enum { IDM_SAVEAVI_H264, IDM_SWITCHSCREEN, IDM_MULTITHREAD_COMPRESS, + IDM_FPS_10, + IDM_FPS_15, + IDM_FPS_20, + IDM_FPS_25, + IDM_FPS_30, + IDM_FPS_UNLIMITED, }; IMPLEMENT_DYNAMIC(CScreenSpyDlg, CDialog) @@ -246,6 +252,12 @@ BOOL CScreenSpyDlg::OnInitDialog() SysMenu->AppendMenu(MF_STRING, IDM_SET_CLIPBOARD, "设置剪贴板(&L)"); SysMenu->AppendMenu(MF_STRING, IDM_SWITCHSCREEN, "切换显示器(&1)"); SysMenu->AppendMenu(MF_STRING, IDM_MULTITHREAD_COMPRESS, "多线程压缩(&2)"); + SysMenu->AppendMenu(MF_STRING, IDM_FPS_10, "最大帧率FPS:10"); + SysMenu->AppendMenu(MF_STRING, IDM_FPS_15, "最大帧率FPS:15"); + SysMenu->AppendMenu(MF_STRING, IDM_FPS_20, "最大帧率FPS:20"); + SysMenu->AppendMenu(MF_STRING, IDM_FPS_25, "最大帧率FPS:25"); + SysMenu->AppendMenu(MF_STRING, IDM_FPS_30, "最大帧率FPS:30"); + SysMenu->AppendMenu(MF_STRING, IDM_FPS_UNLIMITED, "最大帧率无限制"); SysMenu->AppendMenu(MF_SEPARATOR); BOOL all = THIS_CFG.GetInt("settings", "MultiScreen"); @@ -657,6 +669,14 @@ void CScreenSpyDlg::OnSysCommand(UINT nID, LPARAM lParam) break; } + case IDM_FPS_10: case IDM_FPS_15: case IDM_FPS_20: + case IDM_FPS_25: case IDM_FPS_30: case IDM_FPS_UNLIMITED: { + int fps = 10 + (nID - IDM_FPS_10) * 5; + BYTE bToken[2] = { CMD_FPS, nID == IDM_FPS_UNLIMITED ? 255 : fps }; + m_ContextObject->Send2Client(bToken, sizeof(bToken)); + break; + } + case IDM_TRACE_CURSOR: { // 跟踪被控端鼠标 m_bIsTraceCursor = !m_bIsTraceCursor; //这里在改变数据 SysMenu->CheckMenuItem(IDM_TRACE_CURSOR, m_bIsTraceCursor ? MF_CHECKED : MF_UNCHECKED);//在菜单打钩不打钩