Fix: Ensure MFC and Web remote desktop sessions are fully independent

This commit is contained in:
yuanyuanxiang
2026-05-02 13:56:08 +02:00
parent 171fa750e5
commit 9ae5529458
8 changed files with 163 additions and 45 deletions

View File

@@ -3872,6 +3872,9 @@ BOOL CMy2015RemoteDlg::ShouldRemoteControl()
void screenParamModifier(context* ctx, void* user)
{
// Mark as MFC-triggered so dialog will be visible
WebService().SetMfcTriggered(ctx->GetClientID());
auto version = ctx->GetClientData(ONLINELIST_VERSION);
if (!IsDateGreaterOrEqual(version, "Feb 8 2026")) {
char* param = (char*)user;
@@ -6350,8 +6353,17 @@ LRESULT CMy2015RemoteDlg::OnOpenScreenSpyDialog(WPARAM wParam, LPARAM lParam)
BYTE bToken = COMMAND_BYE;
return ContextObject->Send2Client(&bToken, 1) ? 0 : 0x20260223;
}
if (clientID && WebService().IsRunning() && WebService().IsWebTriggered(clientID) && WebService().GetHideWebSessions()) {
return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_HIDE>(wParam, lParam);
// Check trigger source: MFC-triggered dialogs are always visible
// Note: Don't clear MfcTriggered here - let OnInitDialog check it to determine session type
if (clientID && WebService().IsRunning()) {
if (WebService().IsMfcTriggered(clientID)) {
// MFC-triggered: show dialog (flag will be cleared in OnInitDialog)
return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_SHOWMAXIMIZED>(wParam, lParam);
}
if (WebService().IsWebTriggered(clientID) && WebService().GetHideWebSessions()) {
// Web-triggered: hide dialog (Web users share this hidden dialog)
return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_HIDE>(wParam, lParam);
}
}
return OpenDialog<CScreenSpyDlg, IDD_DIALOG_SCREEN_SPY, SW_SHOWMAXIMIZED>(wParam, lParam);
}
@@ -7120,10 +7132,16 @@ void CMy2015RemoteDlg::OnDynamicSubMenu(UINT nID)
}
LeaveCriticalSection(&m_cs);
}
// Mark as MFC-triggered when MFC opens remote desktop
void setMfcTriggeredCallback(context* ctx, void* user)
{
WebService().SetMfcTriggered(ctx->GetClientID());
}
void CMy2015RemoteDlg::OnOnlineVirtualDesktop()
{
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 2, ALGORITHM_DIFF, THIS_CFG.GetInt("settings", "MultiScreen", TRUE) };
SendSelectedCommand(bToken, sizeof(bToken));
SendSelectedCommand(bToken, sizeof(bToken), setMfcTriggeredCallback, nullptr);
}
@@ -7132,7 +7150,7 @@ void CMy2015RemoteDlg::OnOnlineGrayDesktop()
if (!ShouldRemoteControl())
return;
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 0, ALGORITHM_GRAY, THIS_CFG.GetInt("settings", "MultiScreen", TRUE) };
SendSelectedCommand(bToken, sizeof(bToken));
SendSelectedCommand(bToken, sizeof(bToken), setMfcTriggeredCallback, nullptr);
}
@@ -7141,7 +7159,7 @@ void CMy2015RemoteDlg::OnOnlineRemoteDesktop()
if (!ShouldRemoteControl())
return;
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 1, ALGORITHM_DIFF, THIS_CFG.GetInt("settings", "MultiScreen", TRUE) };
SendSelectedCommand(bToken, sizeof(bToken));
SendSelectedCommand(bToken, sizeof(bToken), setMfcTriggeredCallback, nullptr);
}
@@ -7150,7 +7168,7 @@ void CMy2015RemoteDlg::OnOnlineH264Desktop()
if (!ShouldRemoteControl())
return;
BYTE bToken[32] = { COMMAND_SCREEN_SPY, 0, ALGORITHM_H264, THIS_CFG.GetInt("settings", "MultiScreen", TRUE) };
SendSelectedCommand(bToken, sizeof(bToken));
SendSelectedCommand(bToken, sizeof(bToken), setMfcTriggeredCallback, nullptr);
}
@@ -8212,6 +8230,28 @@ void CMy2015RemoteDlg::CloseRemoteDesktopByClientID(uint64_t clientID)
}
}
void CMy2015RemoteDlg::CloseWebRemoteDesktopByClientID(uint64_t clientID)
{
CScreenSpyDlg* targetDlg = nullptr;
HWND hWnd = NULL;
EnterCriticalSection(&m_cs);
for (auto& pair : m_RemoteWnds) {
CScreenSpyDlg* dlg = dynamic_cast<CScreenSpyDlg*>(pair.second);
// Only close Web session dialogs, leave MFC dialogs open
if (dlg && dlg->GetClientID() == clientID && dlg->IsWebSession()) {
targetDlg = dlg;
hWnd = dlg->GetSafeHwnd();
break;
}
}
LeaveCriticalSection(&m_cs);
if (targetDlg && hWnd && ::IsWindow(hWnd)) {
::SendMessage(hWnd, WM_CLOSE, 0, 0);
}
}
void CMy2015RemoteDlg::UpdateActiveRemoteSession(CDialogBase *sess)
{
EnterCriticalSection(&m_cs);