Fix: Ensure MFC and Web remote desktop sessions are fully independent
This commit is contained in:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user