Feature: Add FPS control menu for remote desktop

This commit is contained in:
yuanyuanxiang
2025-12-28 21:25:45 +01:00
parent f3ff5fdb03
commit 4ae97abcc6
4 changed files with 29 additions and 2 deletions

View File

@@ -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./s0<This->m_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();

View File

@@ -64,6 +64,7 @@ public:
virtual BOOL OnReconnect();
uint64_t m_DlgID = 0;
BOOL m_SendFirst = FALSE;
int m_nMaxFPS = 20;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL m_virtual;
POINT m_point;

View File

@@ -197,6 +197,7 @@ enum {
COMMAND_SEND_FILE = 68, // <20><><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
COMMAND_SWITCH_SCREEN = 69,
CMD_MULTITHREAD_COMPRESS = 70,
CMD_FPS = 71,
// <20><><EFBFBD><EFBFBD><EFBFBD>˷<EFBFBD><CBB7><EFBFBD><EFBFBD>ı<EFBFBD>ʶ
TOKEN_AUTH = 100, // Ҫ<><D2AA><EFBFBD><EFBFBD>֤

View File

@@ -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);//在菜单打钩不打钩