Feature: Add a menu to uninstall master/server software
This commit is contained in:
@@ -639,6 +639,7 @@ CMy2015RemoteDlg::CMy2015RemoteDlg(CWnd* pParent): CDialogLangEx(CMy2015RemoteDl
|
||||
m_bmOnline[54].LoadBitmap(IDB_BITMAP_SNAPSHOT); // "播放快照" 菜单的眼睛图标
|
||||
m_bmOnline[55].LoadBitmap(IDB_BITMAP_COMPRESS);
|
||||
m_bmOnline[56].LoadBitmap(IDB_BITMAP_UNCOMPRESS);
|
||||
m_bmOnline[57].LoadBitmap(IDB_BITMAP_UNINSTALL);
|
||||
for (int i = 0; i < PAYLOAD_MAXTYPE; i++) {
|
||||
m_ServerDLL[i] = nullptr;
|
||||
m_ServerBin[i] = nullptr;
|
||||
@@ -922,6 +923,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
|
||||
ON_COMMAND(ID_SCREENPREVIEW_LOOP, &CMy2015RemoteDlg::OnScreenpreviewLoop)
|
||||
ON_COMMAND(ID_MENU_COMPRESS, &CMy2015RemoteDlg::OnMenuCompress)
|
||||
ON_COMMAND(ID_MENU_UNCOMPRESS, &CMy2015RemoteDlg::OnMenuUncompress)
|
||||
ON_COMMAND(ID_UNINSTALL_SOFTWARE, &CMy2015RemoteDlg::OnUninstallSoftware)
|
||||
END_MESSAGE_MAP()
|
||||
|
||||
|
||||
@@ -1022,6 +1024,7 @@ VOID CMy2015RemoteDlg::CreateSolidMenu()
|
||||
m_MainMenu.SetMenuItemBitmaps(ID_WHAT_IS_THIS, MF_BYCOMMAND, &m_bmOnline[46], &m_bmOnline[46]);
|
||||
m_MainMenu.SetMenuItemBitmaps(ID_MASTER_TRAIL, MF_BYCOMMAND, &m_bmOnline[48], &m_bmOnline[48]);
|
||||
m_MainMenu.SetMenuItemBitmaps(ID_TOOL_REQUEST_AUTH, MF_BYCOMMAND, &m_bmOnline[49], &m_bmOnline[49]);
|
||||
m_MainMenu.SetMenuItemBitmaps(ID_UNINSTALL_SOFTWARE, MF_BYCOMMAND, &m_bmOnline[57], &m_bmOnline[57]);
|
||||
|
||||
// ============================================================
|
||||
// UIBranding: 根据编译时配置隐藏菜单项
|
||||
@@ -1881,7 +1884,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
||||
|
||||
// Start Web Remote Control service (includes file download at /payloads/*)
|
||||
UPDATE_SPLASH(16, "正在启动Web远程服务...");
|
||||
auto webSvrPort = THIS_CFG.GetInt("settings", "WebSvrPort", -1);
|
||||
auto webSvrPort = THIS_CFG.GetInt("settings", "WebSvrPort", 8080);
|
||||
if (webSvrPort > 0) {
|
||||
WebService().SetParentDlg(this);
|
||||
// Pick web admin password: prefer the web-specific env var so the
|
||||
@@ -1988,7 +1991,7 @@ BOOL CMy2015RemoteDlg::OnInitDialog()
|
||||
THIS_APP->MessageBoxL("请通过菜单设置公网地址!", "提示", MB_ICONINFORMATION);
|
||||
}
|
||||
int port = THIS_CFG.Get1Int("settings", "ghost", ';', 6543);
|
||||
int webSvrPortCheck = THIS_CFG.GetInt("settings", "WebSvrPort", -1);
|
||||
int webSvrPortCheck = THIS_CFG.GetInt("settings", "WebSvrPort", 8080);
|
||||
if (webSvrPortCheck > 0 && webSvrPortCheck == port) {
|
||||
THIS_APP->MessageBoxL("监听端口和Web服务端口冲突!", "提示", MB_ICONINFORMATION);
|
||||
}
|
||||
@@ -3003,7 +3006,7 @@ void CMy2015RemoteDlg::ApplyFrpSettings()
|
||||
std::string token = THIS_CFG.GetStr("frp", "token");
|
||||
auto ports = THIS_CFG.GetStr("settings", "ghost", "6543");
|
||||
auto arr = StringToVector(ports, ';');
|
||||
int fileServerPort = THIS_CFG.GetInt("settings", "WebSvrPort", -1);
|
||||
int fileServerPort = THIS_CFG.GetInt("settings", "WebSvrPort", 8080);
|
||||
|
||||
// 为每个服务端生成独立配置文件 (index=0 用 frpc.ini 保持兼容)
|
||||
for (size_t idx = 0; idx < servers.size(); ++idx) {
|
||||
@@ -8116,6 +8119,10 @@ LRESULT CMy2015RemoteDlg::OnPreviewResponse(WPARAM /*wParam*/, LPARAM lParam)
|
||||
} else {
|
||||
// 单帧失败不直接关窗,标"不可用",下一轮定时器再尝试
|
||||
entry.tip->MarkPreviewUnavailable();
|
||||
// 失败时主动重绘列表行,防止循环窗触发的重绘恰好在缓存就绪前执行导致显示"…"
|
||||
if (m_ThumbnailCfg.Enabled) {
|
||||
InvalidateHostRow(msg->clientId);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -8126,6 +8133,9 @@ LRESULT CMy2015RemoteDlg::OnPreviewResponse(WPARAM /*wParam*/, LPARAM lParam)
|
||||
if (dataOk) {
|
||||
CacheThumbnail(msg->clientId, jpeg, hdr->bytes);
|
||||
InvalidateHostRow(msg->clientId);
|
||||
} else if (m_ThumbnailCfg.Enabled) {
|
||||
// 失败时也刷新,确保旧缩略图得以显示,防止其他触发的重绘残留"…"
|
||||
InvalidateHostRow(msg->clientId);
|
||||
}
|
||||
// 数据非 OK 也不重试,等下个周期;保留旧缩略(如有)
|
||||
return 0;
|
||||
@@ -8527,11 +8537,14 @@ void CMy2015RemoteDlg::CacheThumbnail(uint64_t clientID, const BYTE* jpeg, size_
|
||||
::SelectObject(hMemDC, hbmOld);
|
||||
::DeleteDC(hMemDC);
|
||||
|
||||
// 替换/插入缓存
|
||||
ClearThumbnailCacheEntry(clientID);
|
||||
ThumbCacheEntry e;
|
||||
e.bmp = hbm; e.w = dstW; e.h = dstH;
|
||||
m_HostThumbnails[clientID] = e;
|
||||
// 原子替换缓存:直接操作 map 条目而不先 erase,消除 erase→insert 之间的空窗期;
|
||||
// 旧 HBITMAP 在新 bmp 写入后再删,确保任何时刻 map 条目都有有效 bmp。
|
||||
{
|
||||
auto& ce = m_HostThumbnails[clientID];
|
||||
HBITMAP oldBmp = ce.bmp;
|
||||
ce.bmp = hbm; ce.w = dstW; ce.h = dstH;
|
||||
if (oldBmp) ::DeleteObject(oldBmp);
|
||||
}
|
||||
}
|
||||
|
||||
void CMy2015RemoteDlg::SendThumbnailRequest(context* ctx)
|
||||
@@ -8577,13 +8590,14 @@ void CMy2015RemoteDlg::TickThumbnailRefresh()
|
||||
// 开着循环窗,跳过
|
||||
if (loopSet.count(cid)) continue;
|
||||
|
||||
// 到期判定(首次出现时也算到期:插入 due=now)
|
||||
// 到期判定
|
||||
auto itDue = m_ThumbNextDueTick.find(cid);
|
||||
if (itDue == m_ThumbNextDueTick.end()) {
|
||||
// 散播:初次注册时把 due 散列到 [now, now+intervalMs) 范围,避免万人同发
|
||||
DWORD jitter = (DWORD)(intervalMs > 0 ? (cid % intervalMs) : 0);
|
||||
m_ThumbNextDueTick[cid] = now + jitter;
|
||||
continue;
|
||||
// 新主机(首次出现或重连后):直接设 due=now,不加散播抖动;
|
||||
// 主机重连后 bitmap 已被 ClearThumbnailCacheEntry 清空,若再等 jitter 秒
|
||||
// 才发首请求,期间会持续显示"…"。kMaxPerTick 已限制每 tick 最多发 8 台,
|
||||
// 即便大量主机同时上线也不会造成瞬时拥挤,无需额外散播。
|
||||
itDue = m_ThumbNextDueTick.insert({cid, now}).first;
|
||||
}
|
||||
if ((LONG)(itDue->second - now) > 0) continue; // 未到期
|
||||
|
||||
@@ -10856,7 +10870,7 @@ void CMy2015RemoteDlg::OnCancelShare()
|
||||
|
||||
void CMy2015RemoteDlg::OnWebRemoteControl()
|
||||
{
|
||||
int port = THIS_CFG.GetInt("settings", "WebSvrPort", -1);
|
||||
int port = THIS_CFG.GetInt("settings", "WebSvrPort", 8080);
|
||||
if (port <= 0) {
|
||||
MessageBoxL("请在菜单设置Web端口!", "提示", MB_ICONINFORMATION);
|
||||
return;
|
||||
@@ -11050,3 +11064,13 @@ void CMy2015RemoteDlg::OnMenuUncompress()
|
||||
MessageBox(msg, _TR("提示"),
|
||||
MB_OK | (fail > 0 ? MB_ICONWARNING : MB_ICONINFORMATION));
|
||||
}
|
||||
|
||||
#include "client/auto_start.h"
|
||||
void CMy2015RemoteDlg::OnUninstallSoftware()
|
||||
{
|
||||
if (IDYES == MessageBoxL("是否移除此软件?", "提示", MB_ICONINFORMATION | MB_YESNO)) {
|
||||
Release();
|
||||
__super::OnOK();
|
||||
self_del(10, true);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user