From 033ff077ef4d4405be97c6d652f42270c829ce90 Mon Sep 17 00:00:00 2001 From: yuanyuanxiang <962914132@qq.com> Date: Wed, 9 Sep 2026 17:13:17 +0200 Subject: [PATCH] Feature: Add configurable remote-desktop quality levels menu MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add an "高级 (Advanced)" menu after "å…¶ä»– (Other)" whose "远程桌é�¢è´¨é‡�等级 (Remote Desktop Quality Levels)" item opens a dialog to edit the six preset QualityProfile levels (max FPS, max width, codec algorithm, bitrate). The dialog edits a working copy in a full grid with per-field validation and a restore-defaults button; on OK it persists the values to the [quality] INI section. The server stays authoritative: LoadQualityProfilesFromCfg loads the saved levels at startup (falling back to GetQualityProfile defaults), and ScreenSpyDlg now sends CMD_QUALITY_PROFILES from GetQualityProfileCfg so new remote-desktop sessions transmit with the configured parameters. Added en_US/de_DE/zh_TW translations for the menu and dialog strings. Co-Authored-By: deepseek-v4-pro --- server/2015Remote/2015Remote.rc | Bin 162108 -> 167748 bytes server/2015Remote/2015RemoteDlg.cpp | 63 +++++++++++ server/2015Remote/2015RemoteDlg.h | 10 ++ server/2015Remote/QualityLevelsDlg.h | 156 +++++++++++++++++++++++++++ server/2015Remote/ScreenSpyDlg.cpp | 8 +- server/2015Remote/lang/de_DE.ini | 17 +++ server/2015Remote/lang/en_US.ini | 19 +++- server/2015Remote/lang/zh_TW.ini | 17 +++ server/2015Remote/resource.h | 7 ++ 9 files changed, 294 insertions(+), 3 deletions(-) create mode 100644 server/2015Remote/QualityLevelsDlg.h diff --git a/server/2015Remote/2015Remote.rc b/server/2015Remote/2015Remote.rc index 9b2da0f6ea535d169b39cd8091f7983eb0b78f33..dd14c0467d3d03cf36f5dfb443020fa04eda5c07 100644 GIT binary patch delta 1699 zcmaKsYe-XJ7{{MCrg)oEWSMAfu8Rr--P}2Af#LEFb2=}@$h=ivNHblLCh4*d1|cek zdLc*&qT7ck2>Mb`5K#nOJ_LRc3jE@yqM)zY^Sp1z<8;M1XWKdd^M8Kt|9#H$>}T?; zg_Lb;zoSoBaOL`Umc;F^S$gu)jk^V!+Uq9x}gM|U_GbKDfdZ%63n3atRt?QSPw0)9|^6}3D{810fv$#N6FXVy} z;bCE;RO%FT!x@OkVwp}TMH)k_3Tb9548U0!fi7I)rQS$`0q+J?z~>h+s}>!xXVcRj z@Zv>@?Z$sjP`JN<6=)wH?9qZlb}NY#EJcf#>?q@lWvqdJbug0_t<2jgH9pk1g^Iq( z3i)vbKf=Bi{d=vA2^pMOREbgUAg*=aj+i6|Jy|TcSvAuh_d-?ku_Y6p-E@UVgKT zg<`uyMPh?m8pWliWOQnj32Jiyb3Tu}muJ5nGkATX$F}fNJd)QZipKK(?Pm%{=S5lE zoT=yaoTXJPu~@o_wG3h(w*^?lT8{~z#$yoQ!U4*;Hz?mjvm7EW(XUT{$qe*!(V> z*mQ4pI+D9qi9@&=KgG}lHE>9jR8Y5VE~%xw?aPtSWZGIS#z!FX>gr5rQf!_@hEOUh zd!R&PN|u)Ha+Gy4J eVVi2vlUct}&O({ALRnY8>@Q}vr=2To`Pv_-E?w*Z delta 29 lcmX>yk895-&PJxKOpJbyryp3vC^lVynTczA*-yrEQvtSq3*Z0% diff --git a/server/2015Remote/2015RemoteDlg.cpp b/server/2015Remote/2015RemoteDlg.cpp index 176fe4b..aa97c4e 100644 --- a/server/2015Remote/2015RemoteDlg.cpp +++ b/server/2015Remote/2015RemoteDlg.cpp @@ -43,6 +43,7 @@ #include #include "common/skCrypter.h" #include "common/commands.h" +#include "QualityLevelsDlg.h" #include "McpServer.h" #include "McpSettingsDlg.h" #include "common/md5.h" @@ -1013,6 +1014,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx) ON_COMMAND(ID_TOOL_IMPORT_LICENSE, &CMy2015RemoteDlg::OnToolImportLicense) ON_COMMAND(ID_TOOL_V2_PRIVATEKEY, &CMy2015RemoteDlg::OnToolV2PrivateKey) ON_COMMAND(ID_MENU_NOTIFY_SETTINGS, &CMy2015RemoteDlg::OnMenuNotifySettings) + ON_COMMAND(ID_TOOL_QUALITY_LEVELS, &CMy2015RemoteDlg::OnQualityLevels) ON_COMMAND(ID_EXECUTE_TESTRUN, &CMy2015RemoteDlg::OnExecuteTestrun) ON_COMMAND(ID_EXECUTE_GHOST, &CMy2015RemoteDlg::OnExecuteGhost) ON_COMMAND(ID_MASTER_TRAIL, &CMy2015RemoteDlg::OnMasterTrail) @@ -2406,6 +2408,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog() // 这里读完 INI å�Žå†� Apply 一次纠正过æ�¥ã€‚ LoadThumbnailSettingsFromCfg(); ApplyThumbnailSettings(); + LoadQualityProfilesFromCfg(); m_runNormal = THIS_CFG.GetInt("settings", "RunNormal", 0); CMenu* SubMenu = m_MainMenu.GetSubMenu(2); @@ -9142,6 +9145,66 @@ void CMy2015RemoteDlg::SaveThumbnailSettingsToCfg() const THIS_CFG.SetInt("thumbnail", "JpegQuality", m_ThumbnailCfg.JpegQuality); } +// ===== 远程桌é�¢è´¨é‡�等级é…�置([quality] 节) ===== +// 6 æ¡£ QualityProfile 的读写与下å�‘å…¥å�£ã€‚缺çœ�值回è�½åˆ° common/commands.h çš„ +// GetQualityProfile(),与客户端默认表一致;用户改过的档ä½�å�•独è�½ç›˜åˆ° INI。 + +void CMy2015RemoteDlg::LoadQualityProfilesFromCfg() +{ + // 先整体回è�½åˆ°å†…置默认,å†�é€�字段覆盖,é�¿å…� INI 缺项时读到 0 + for (int i = 0; i < QUALITY_COUNT; i++) { + m_QualityProfiles[i] = GetQualityProfile(i); + } + + for (int i = 0; i < QUALITY_COUNT; i++) { + std::string sec = "profile" + std::to_string(i); + QualityProfile& p = m_QualityProfiles[i]; + + p.maxFPS = THIS_CFG.GetInt("quality", sec + "_maxFPS", p.maxFPS); + p.maxWidth = THIS_CFG.GetInt("quality", sec + "_maxWidth", p.maxWidth); + p.algorithm = THIS_CFG.GetInt("quality", sec + "_algorithm", p.algorithm); + p.bitRate = THIS_CFG.GetInt("quality", sec + "_bitRate", p.bitRate); + + // Clamp 到安全范围(防 INI 被手工编错) + if (p.maxFPS < 1) p.maxFPS = 1; + if (p.maxFPS > 60) p.maxFPS = 60; + if (p.maxWidth < 0) p.maxWidth = 0; + if (p.maxWidth > 8192) p.maxWidth = 8192; + if (p.algorithm < ALGORITHM_GRAY || p.algorithm > ALGORITHM_RGB565) + p.algorithm = ALGORITHM_H264; + if (p.bitRate < 0) p.bitRate = 0; + if (p.bitRate > 50000) p.bitRate = 50000; + } +} + +void CMy2015RemoteDlg::SaveQualityProfilesToCfg() const +{ + for (int i = 0; i < QUALITY_COUNT; i++) { + std::string sec = "profile" + std::to_string(i); + const QualityProfile& p = m_QualityProfiles[i]; + THIS_CFG.SetInt("quality", sec + "_maxFPS", p.maxFPS); + THIS_CFG.SetInt("quality", sec + "_maxWidth", p.maxWidth); + THIS_CFG.SetInt("quality", sec + "_algorithm", p.algorithm); + THIS_CFG.SetInt("quality", sec + "_bitRate", p.bitRate); + } +} + +const QualityProfile& CMy2015RemoteDlg::GetQualityProfileCfg(int level) const +{ + if (level < 0 || level >= QUALITY_COUNT) + return GetQualityProfile(level); // 越界:与 common 默认表å�Œæº�兜底 + return m_QualityProfiles[level]; +} + +void CMy2015RemoteDlg::OnQualityLevels() +{ + CQualityLevelsDlg dlg(m_QualityProfiles, this); + if (dlg.DoModal() == IDOK) { + SaveQualityProfilesToCfg(); + MessageBoxL("è´¨é‡�等级已ä¿�存,下次打开远程桌é�¢æ—¶ç”Ÿæ•ˆã€‚", "æ��示", MB_ICONINFORMATION); + } +} + void CMy2015RemoteDlg::ApplyThumbnailSettings() { // 任何已缓存的 HBITMAP 都是按"æ—§ ThumbWidth"渲染的,尺寸ä¸�å†�å�¯ä¿¡ —— 一律清空。 diff --git a/server/2015Remote/2015RemoteDlg.h b/server/2015Remote/2015RemoteDlg.h index c091fb5..08fe15d 100644 --- a/server/2015Remote/2015RemoteDlg.h +++ b/server/2015Remote/2015RemoteDlg.h @@ -6,6 +6,7 @@ #include "TrueColorToolBar.h" #include "IOCPServer.h" #include +#include "common/commands.h" #include #include #include @@ -328,6 +329,15 @@ public: void LoadThumbnailSettingsFromCfg(); // 从 THIS_CFG 读到 m_ThumbnailCfg void SaveThumbnailSettingsToCfg() const; // m_ThumbnailCfg è�½ç›˜åˆ° THIS_CFG void TickThumbnailRefresh(); // TIMER_THUMBNAIL_REFRESH 主循环 + + // ===== 远程桌é�¢è´¨é‡�等级é…�置(6 æ¡£ QualityProfile) ===== + // 主控端 UI å��好,æŒ�久化走 THIS_CFG [quality] 节。æœ�务端æ�ƒå¨�,ç»� CMD_QUALITY_PROFILES + // 下å�‘给客户端。仅 UI 线程访问;修改å�Žéœ€é‡�开远程桌é�¢ä¼šè¯�æ‰�对新连接生效。 + QualityProfile m_QualityProfiles[QUALITY_COUNT]; + void LoadQualityProfilesFromCfg(); // 从 THIS_CFG 读到 m_QualityProfiles(缺çœ�回è�½ GetQualityProfile) + void SaveQualityProfilesToCfg() const; // m_QualityProfiles è�½ç›˜åˆ° THIS_CFG + const QualityProfile& GetQualityProfileCfg(int level) const; // ä¾› ScreenSpyDlg 下å�‘用 + void OnQualityLevels(); // 高级→远程桌é�¢è´¨é‡�等级 void SendThumbnailRequest(class context* ctx);// å�‘一次缩略图请求 void CacheThumbnail(uint64_t clientID, const BYTE* jpeg, size_t bytes); void ClearThumbnailCacheEntry(uint64_t clientID); diff --git a/server/2015Remote/QualityLevelsDlg.h b/server/2015Remote/QualityLevelsDlg.h new file mode 100644 index 0000000..0b13d71 --- /dev/null +++ b/server/2015Remote/QualityLevelsDlg.h @@ -0,0 +1,156 @@ +// QualityLevelsDlg.h +// 远程桌é�¢è´¨é‡�等级é…�置对è¯�框:编辑 6 æ¡£ QualityProfile(帧率/宽度/算法/ç �率)。 +// 纯主控端 UI å��好,æŒ�久化由 CMy2015RemoteDlg::SaveQualityProfilesToCfg() 负责。 +// 仅在 2015RemoteDlg.cpp 中 include 一次(头文件内è�”实现,勿多处包å�«ï¼‰ã€‚ +#pragma once + +#include "LangManager.h" + +class CQualityLevelsDlg : public CDialog +{ +public: + enum { IDD = IDD_QUALITY_LEVELS }; + + // profiles: 指å�‘ 6 元素 QualityProfile 数组,确认å�Žå†™å›ž + CQualityLevelsDlg(QualityProfile* profiles, CWnd* pParent = NULL) + : CDialog(CQualityLevelsDlg::IDD, pParent), m_profiles(profiles) + { + } + +protected: + QualityProfile* m_profiles; + QualityProfile m_working[QUALITY_COUNT]; + + static const char* AlgorithmName(int algo) + { + switch (algo) { + case ALGORITHM_GRAY: return "GRAY"; + case ALGORITHM_DIFF: return "DIFF"; + case ALGORITHM_H264: return "H264"; + case ALGORITHM_RGB565: return "RGB565"; + default: return "?"; + } + } + + static const char* LevelName(int i) + { + static const char* names[QUALITY_COUNT] = { + "Ultra", "High", "Good", "Medium", "Low", "Minimal" + }; + return (i >= 0 && i < QUALITY_COUNT) ? names[i] : "?"; + } + + void FillAlgoCombo(int i) + { + CComboBox* cb = (CComboBox*)GetDlgItem(IDC_QLEVEL_ALGO + i); + if (!cb) return; + for (int a = 0; a < 4; a++) { + cb->AddString(CString(AlgorithmName(a))); + } + cb->SetCurSel(m_working[i].algorithm); + } + + void LoadToControls() + { + CString s; + for (int i = 0; i < QUALITY_COUNT; i++) { + s.Format(_T("%d"), m_working[i].maxFPS); + SetDlgItemText(IDC_QLEVEL_FPS + i, s); + s.Format(_T("%d"), m_working[i].maxWidth); + SetDlgItemText(IDC_QLEVEL_WIDTH + i, s); + s.Format(_T("%d"), m_working[i].bitRate); + SetDlgItemText(IDC_QLEVEL_BITRATE + i, s); + FillAlgoCombo(i); + } + } + + bool ReadInt(int id, int& out) + { + CString s; + GetDlgItemText(id, s); + s.Trim(); + if (s.IsEmpty()) return false; + + int v = 0; + for (int k = 0; k < s.GetLength(); k++) { + TCHAR ch = s[k]; + if (ch < _T('0') || ch > _T('9')) return false; + v = v * 10 + (ch - _T('0')); + } + out = v; + return true; + } + + bool ReadFromControls(CString& err) + { + for (int i = 0; i < QUALITY_COUNT; i++) { + int fps, w, br; + if (!ReadInt(IDC_QLEVEL_FPS + i, fps)) + { err.Format(_T("等级 %s 的帧率ä¸�是有效数字"), LevelName(i)); return false; } + if (!ReadInt(IDC_QLEVEL_WIDTH + i, w)) + { err.Format(_T("等级 %s 的最大宽度ä¸�是有效数字"), LevelName(i)); return false; } + if (!ReadInt(IDC_QLEVEL_BITRATE + i, br)) + { err.Format(_T("等级 %s çš„ç �率ä¸�是有效数字"), LevelName(i)); return false; } + + if (fps < 1 || fps > 60) + { err.Format(_T("等级 %s 的帧率需在 1~60 之间"), LevelName(i)); return false; } + if (w < 0 || w > 8192) + { err.Format(_T("等级 %s 的最大宽度需在 0~8192 之间(0=原始分辨率)"), LevelName(i)); return false; } + if (br < 0 || br > 50000) + { err.Format(_T("等级 %s çš„ç �率需在 0~50000 之间"), LevelName(i)); return false; } + + CComboBox* cb = (CComboBox*)GetDlgItem(IDC_QLEVEL_ALGO + i); + int algo = cb ? cb->GetCurSel() : -1; + if (algo < 0 || algo > 3) + { err.Format(_T("等级 %s 的编ç �算法未选择"), LevelName(i)); return false; } + + m_working[i].maxFPS = fps; + m_working[i].maxWidth = w; + m_working[i].bitRate = br; + m_working[i].algorithm = algo; + } + return true; + } + + void ResetToDefaults() + { + for (int i = 0; i < QUALITY_COUNT; i++) { + m_working[i] = GetQualityProfile(i); + } + LoadToControls(); + } + + virtual BOOL OnInitDialog() override + { + CDialog::OnInitDialog(); + + for (int i = 0; i < QUALITY_COUNT; i++) { + m_working[i] = m_profiles[i]; + } + LoadToControls(); + TranslateDialog(this); + return TRUE; + } + + virtual void OnOK() override + { + CString err; + if (!ReadFromControls(err)) { + MessageBox(err, _TR("æ��示"), MB_ICONWARNING); + return; + } + for (int i = 0; i < QUALITY_COUNT; i++) { + m_profiles[i] = m_working[i]; + } + CDialog::OnOK(); + } + + virtual BOOL OnCommand(WPARAM wParam, LPARAM lParam) override + { + if (LOWORD(wParam) == IDC_QLEVEL_RESET && HIWORD(wParam) == BN_CLICKED) { + ResetToDefaults(); + return TRUE; + } + return CDialog::OnCommand(wParam, lParam); + } +}; diff --git a/server/2015Remote/ScreenSpyDlg.cpp b/server/2015Remote/ScreenSpyDlg.cpp index 2f44803..3084e45 100644 --- a/server/2015Remote/ScreenSpyDlg.cpp +++ b/server/2015Remote/ScreenSpyDlg.cpp @@ -889,13 +889,17 @@ BOOL CScreenSpyDlg::OnInitDialog() // å�¯åŠ¨ä¼ è¾“é€ŸçŽ‡æ›´æ–°å®šæ—¶å™¨ (1ç§’) SetTimer(4, 1000, NULL); - // 下å�‘è´¨é‡�é…�置表(让客户端å�¯ä»¥æŒ�久化ä¿�存) + // 下å�‘è´¨é‡�é…�置表(让客户端å�¯ä»¥æŒ�久化ä¿�存)。 + // 优先使用主控端在「高级 → 远程桌é�¢è´¨é‡�等级ã€�里自定义的档ä½�;无主控端时回è�½å†…置默认表。 { BYTE profileCmd[1 + sizeof(QualityProfile) * QUALITY_COUNT]; profileCmd[0] = CMD_QUALITY_PROFILES; for (int i = 0; i < QUALITY_COUNT; i++) { + const QualityProfile& prof = (m_pParent != nullptr) + ? m_pParent->GetQualityProfileCfg(i) + : GetQualityProfile(i); memcpy(profileCmd + 1 + i * sizeof(QualityProfile), - &GetQualityProfile(i), sizeof(QualityProfile)); + &prof, sizeof(QualityProfile)); } m_ContextObject->Send2Client(profileCmd, sizeof(profileCmd)); } diff --git a/server/2015Remote/lang/de_DE.ini b/server/2015Remote/lang/de_DE.ini index 5151b1d..071c8f1 100644 --- a/server/2015Remote/lang/de_DE.ini +++ b/server/2015Remote/lang/de_DE.ini @@ -2025,3 +2025,20 @@ Token=Token ´ò¿ªÎļþʧ°Ü...=Datei konnte nicht geoeffnet werden... ´ËÈÎÎñÓÃÓÚÔÚÐèҪʱÆô¶¯ Windows ¸üзþÎñÒÔÖ´Ðмƻ®µÄ²Ù×÷(ÈçɨÃè)=Diese Aufgabe startet bei Bedarf den Windows-Update-Dienst zum Ausfuehren geplanter Vorgaenge (z.B. Scannen) ±¾µØÎļþ·¾¶=Lokaler Dateipfad +¸ß¼¶(&A)=&Erweitert +Ô¶³Ì×ÀÃæÖÊÁ¿µÈ¼¶(&Q)=Remote Desktop &Qualitaetsstufen +Ô¶³Ì×ÀÃæÖÊÁ¿µÈ¼¶=Remote Desktop Qualitaetsstufen +µÈ¼¶=Stufe +Ö¡ÂÊ(FPS)=FPS +×î´ó¿í¶È=Max. Breite +±àÂëËã·¨=Codec +ÂëÂÊ(kbps)=Bitrate (kbps) +Ultra ¼«¼Ñ=Ultra +High ÓÅÐã=Hoch +Good Á¼ºÃ=Gut +Medium Ò»°ã=Mittel +Low ½Ï²î=Niedrig +Minimal ×îµÍ=Minimal +×î´ó¿í¶È 0 ±íʾԭʼ·Ö±æÂÊ£»DIFF/RGB565 ÊʺϾÖÓòÍø£¬H264 ÊʺϿçÍø=Max. Breite 0 = Originalaufloesung; DIFF/RGB565 fuer LAN, H264 fuer WAN +»Ö¸´Ä¬ÈÏ=Standard +ÖÊÁ¿µÈ¼¶Òѱ£´æ£¬Ï´δò¿ªÔ¶³Ì×ÀÃæÊ±ÉúЧ¡£=Qualitaetsstufen gespeichert. Wirksam beim naechsten Oeffnen des Remote Desktops. diff --git a/server/2015Remote/lang/en_US.ini b/server/2015Remote/lang/en_US.ini index 3000cde..2b16b1e 100644 --- a/server/2015Remote/lang/en_US.ini +++ b/server/2015Remote/lang/en_US.ini @@ -1353,7 +1353,7 @@ FUCK!!! ±à¼­±¸×¢=Edit remarks ×Ô¼º:=Self: ÊÓÆµÎļþ(*.avi)|*.avi|=Video(*.avi)|*.avi| -½â³ýËø¶¨ÊäÈë=½â³ýËø¶¨ÊäÈë +½â³ýËø¶¨ÊäÈë=Unlock Remote Input ¼ÆËã»úÒѾ­±»Óû§ËøÆÁ£¬³ÌÐòÎÞ SYSTEM ȨÏÞ¡£\r\n¿ÉÄÜÎÞ·¨½øÐÐÔ¶³Ì×ÀÃæ¿ØÖÆ£¬ÊÇ·ñ¼ÌÐø?=Computer locked, no SYSTEM.\r\nRemote may fail, continue? ÇëÏÈÉú³É¿ÚÁî!=Generate password first! Ç뽫EXE·ÅÔÚ\=Put EXE in \ @@ -2025,3 +2025,20 @@ Token=Token ´ò¿ªÎļþʧ°Ü...=Failed to open file... ´ËÈÎÎñÓÃÓÚÔÚÐèҪʱÆô¶¯ Windows ¸üзþÎñÒÔÖ´Ðмƻ®µÄ²Ù×÷(ÈçɨÃè)=This task starts the Windows Update service when needed to run scheduled operations (e.g. scanning) ±¾µØÎļþ·¾¶=Local file path +¸ß¼¶(&A)=&Advanced +Ô¶³Ì×ÀÃæÖÊÁ¿µÈ¼¶(&Q)=Remote Desktop &Quality Levels +Ô¶³Ì×ÀÃæÖÊÁ¿µÈ¼¶=Remote Desktop Quality Levels +µÈ¼¶=Level +Ö¡ÂÊ(FPS)=FPS +×î´ó¿í¶È=Max Width +±àÂëËã·¨=Codec +ÂëÂÊ(kbps)=Bitrate (kbps) +Ultra ¼«¼Ñ=Ultra +High ÓÅÐã=High +Good Á¼ºÃ=Good +Medium Ò»°ã=Medium +Low ½Ï²î=Low +Minimal ×îµÍ=Minimal +×î´ó¿í¶È 0 ±íʾԭʼ·Ö±æÂÊ£»DIFF/RGB565 ÊʺϾÖÓòÍø£¬H264 ÊʺϿçÍø=Max Width 0 = native resolution; DIFF/RGB565 for LAN, H264 for WAN +»Ö¸´Ä¬ÈÏ=Restore Defaults +ÖÊÁ¿µÈ¼¶Òѱ£´æ£¬Ï´δò¿ªÔ¶³Ì×ÀÃæÊ±ÉúЧ¡£=Quality levels saved. They take effect the next time you open Remote Desktop. diff --git a/server/2015Remote/lang/zh_TW.ini b/server/2015Remote/lang/zh_TW.ini index 30ef272..4d07aea 100644 --- a/server/2015Remote/lang/zh_TW.ini +++ b/server/2015Remote/lang/zh_TW.ini @@ -2016,3 +2016,20 @@ Token=Token ´ò¿ªÎļþʧ°Ü...=é_†¢™n°¸Ê§”¡... ´ËÈÎÎñÓÃÓÚÔÚÐèҪʱÆô¶¯ Windows ¸üзþÎñÒÔÖ´Ðмƻ®µÄ²Ù×÷(ÈçɨÃè)=´Ë¹¤×÷ÓÃì¶ÔÚÐèÒª•r†¢„Ó Windows ¸üзþ„ÕÒÔˆÌÐÐÅų̵IJÙ×÷(Èç’ßÃè) ±¾µØÎļþ·¾¶=±¾™C™n°¸Â·�½ +¸ß¼¶(&A)=ßMëA(&A) +Ô¶³Ì×ÀÃæÖÊÁ¿µÈ¼¶(&Q)=ßh¶Ë×ÀÃæÆ·Ù|µÈ¼‰(&Q) +Ô¶³Ì×ÀÃæÖÊÁ¿µÈ¼¶=ßh¶Ë×ÀÃæÆ·Ù|µÈ¼‰ +µÈ¼¶=µÈ¼‰ +Ö¡ÂÊ(FPS)=ެÂÊ(FPS) +×î´ó¿í¶È=×î´óŒ’¶È +±àÂëËã·¨=¾Ž´aËã·¨ +ÂëÂÊ(kbps)=´aÂÊ(kbps) +Ultra ¼«¼Ñ=Ultra ˜O¼Ñ +High ÓÅÐã=High ƒžÐã +Good Á¼ºÃ=Good Á¼ºÃ +Medium Ò»°ã=Medium Ò»°ã +Low ½Ï²î=Low Ý^²î +Minimal ×îµÍ=Minimal ×îµÍ +×î´ó¿í¶È 0 ±íʾԭʼ·Ö±æÂÊ£»DIFF/RGB565 ÊʺϾÖÓòÍø£¬H264 ÊʺϿçÍø=×î´óŒ’¶È 0 = ԭʼ½âÎö¶È£»DIFF/RGB565 ßmºÏ…^Óò¾W·£¬H264 ßmºÏ¿ç¾W +»Ö¸´Ä¬ÈÏ=»Ö�ÍîAÔO +ÖÊÁ¿µÈ¼¶Òѱ£´æ£¬Ï´δò¿ªÔ¶³Ì×ÀÃæÊ±ÉúЧ¡£=Æ·Ù|µÈ¼‰Òу¦´æ£¬Ï´Îé_†¢ßh¶Ë×ÀÃæ•rÉúЧ¡£ diff --git a/server/2015Remote/resource.h b/server/2015Remote/resource.h index 6360ab1..0e7e21f 100644 --- a/server/2015Remote/resource.h +++ b/server/2015Remote/resource.h @@ -353,6 +353,7 @@ #define IDI_SYSTEM 2035 #define IDC_DOT 2036 #define IDD_AUDIO 2038 +#define IDD_QUALITY_LEVELS 3000 #define IDI_AUDIO 2039 #define IDC_LIST_REMOTE 2040 #define IDC_LIST_LOCAL 2041 @@ -1036,6 +1037,12 @@ #define ID_ONLINE_FORBIDDEN 33076 #define ID_ONLINE_HISTORY_ACTIVITY 33082 #define ID_EXIT_FULLSCREEN 40001 +#define ID_TOOL_QUALITY_LEVELS 33083 +#define IDC_QLEVEL_FPS 2547 +#define IDC_QLEVEL_WIDTH 2553 +#define IDC_QLEVEL_ALGO 2559 +#define IDC_QLEVEL_BITRATE 2565 +#define IDC_QLEVEL_RESET 2571 // Next default values for new objects //