Fix: Ensure MFC and Web remote desktop sessions are fully independent
This commit is contained in:
@@ -157,8 +157,9 @@ CScreenSpyDlg::CScreenSpyDlg(CMy2015RemoteDlg* Parent, Server* IOCPServer, CONTE
|
||||
if (pClientID) {
|
||||
m_ClientID = *((uint64_t*)pClientID);
|
||||
|
||||
// Notify web clients of resolution (important for clients that only send TOKEN_BITMAPINFO once)
|
||||
if (WebService().IsRunning()) {
|
||||
// Notify web clients of resolution (only for Web sessions, not MFC sessions)
|
||||
// At this point, IsMfcTriggered is still set if MFC triggered this dialog
|
||||
if (WebService().IsRunning() && !WebService().IsMfcTriggered(m_ClientID)) {
|
||||
int width = m_BitmapInfor_Full->bmiHeader.biWidth;
|
||||
int height = abs(m_BitmapInfor_Full->bmiHeader.biHeight);
|
||||
WebService().NotifyResolutionChange(m_ClientID, width, height);
|
||||
@@ -761,23 +762,43 @@ BOOL CScreenSpyDlg::OnInitDialog()
|
||||
if (pMain)
|
||||
::PostMessage(pMain->GetSafeHwnd(), WM_SESSION_ACTIVATED, (WPARAM)this, 0);
|
||||
|
||||
// 注册屏幕上下文到 WebService(用于 Web 端鼠标/键盘控制)
|
||||
WebService().RegisterScreenContext(m_ClientID, m_ContextObject);
|
||||
// Determine session type: MFC or Web
|
||||
// Must check MfcTriggered FIRST - if MFC triggered this dialog, it's NOT a web session
|
||||
// even if WebTriggered is also true (happens when Web is already open for same device)
|
||||
bool isMfcSession = WebService().IsMfcTriggered(m_ClientID);
|
||||
bool isWebSession = false;
|
||||
if (isMfcSession) {
|
||||
// MFC session: clear the flag, don't register with WebService
|
||||
WebService().ClearMfcTriggered(m_ClientID);
|
||||
// m_bIsWebSession remains false (default)
|
||||
} else {
|
||||
// Check if this is a Web session
|
||||
isWebSession = WebService().IsWebTriggered(m_ClientID) && WebService().GetHideWebSessions();
|
||||
|
||||
// Hide window if this session was triggered by web client
|
||||
if (WebService().IsWebTriggered(m_ClientID) && WebService().GetHideWebSessions()) {
|
||||
m_bHide = true;
|
||||
ShowWindow(SW_HIDE);
|
||||
// Only register screen context for Web sessions
|
||||
// MFC dialogs handle input directly via m_ContextObject, don't need WebService registry
|
||||
// This prevents MFC close from deleting Web's context (they share same device_id key)
|
||||
if (isWebSession) {
|
||||
WebService().RegisterScreenContext(m_ClientID, m_ContextObject);
|
||||
m_bHide = true;
|
||||
m_bIsWebSession = true;
|
||||
ShowWindow(SW_HIDE);
|
||||
}
|
||||
}
|
||||
|
||||
Mprintf("[ScreenSpy] Dialog created for device %llu, isMfcSession=%d, isWebSession=%d\n",
|
||||
m_ClientID, isMfcSession ? 1 : 0, isWebSession ? 1 : 0);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
VOID CScreenSpyDlg::OnClose()
|
||||
{
|
||||
// 注销屏幕上下文(Web 端控制)
|
||||
WebService().UnregisterScreenContext(m_ClientID);
|
||||
// Only unregister if this is a Web session (we only registered for Web sessions)
|
||||
if (m_bIsWebSession) {
|
||||
WebService().UnregisterScreenContext(m_ClientID);
|
||||
}
|
||||
|
||||
m_bIsClosed = true;
|
||||
m_bIsCtrl = FALSE;
|
||||
@@ -964,18 +985,11 @@ VOID CScreenSpyDlg::OnReceiveComplete()
|
||||
PrepareDrawing(m_BitmapInfor_Full);
|
||||
// 分辨率切换完成,允许解码
|
||||
m_bResolutionChanging = false;
|
||||
// Notify web clients of resolution change
|
||||
if (WebService().IsRunning()) {
|
||||
// Notify web clients of resolution change (only for Web session dialogs)
|
||||
if (m_bIsWebSession && WebService().IsRunning()) {
|
||||
int width = m_BitmapInfor_Full->bmiHeader.biWidth;
|
||||
int height = abs(m_BitmapInfor_Full->bmiHeader.biHeight);
|
||||
WebService().NotifyResolutionChange(m_ClientID, width, height);
|
||||
|
||||
// Hide window if this session was triggered by web client (and hiding is enabled)
|
||||
if (WebService().IsWebTriggered(m_ClientID) && WebService().GetHideWebSessions()) {
|
||||
m_bHide = true;
|
||||
ShowWindow(SW_HIDE);
|
||||
Mprintf("[ScreenSpyDlg] Web-triggered session, hiding window for device %llu\n", m_ClientID);
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@@ -1266,8 +1280,8 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(bool keyFrame)
|
||||
m_bCursorIndex = m_ContextObject->InDeCompressedBuffer.GetBuffer(2+sizeof(POINT))[0];
|
||||
if (bOldCursorIndex != m_bCursorIndex) {
|
||||
bChange = TRUE;
|
||||
// 通知 Web 客户端光标变化
|
||||
if (WebService().IsRunning()) {
|
||||
// 通知 Web 客户端光标变化 (只有 Web 会话的对话框才广播)
|
||||
if (m_bIsWebSession && WebService().IsRunning()) {
|
||||
WebService().BroadcastCursor(m_ClientID, m_bCursorIndex);
|
||||
}
|
||||
if (m_bIsCtrl && !m_bIsTraceCursor) {//替换指定窗口所属类的WNDCLASSEX结构
|
||||
@@ -1317,8 +1331,8 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(bool keyFrame)
|
||||
bChange = TRUE;
|
||||
}
|
||||
}
|
||||
// Broadcast H264 keyframe to web clients
|
||||
if (NextScreenLength > 0 && WebService().IsRunning()) {
|
||||
// Broadcast H264 keyframe to web clients (only for Web session dialogs)
|
||||
if (m_bIsWebSession && NextScreenLength > 0 && WebService().IsRunning()) {
|
||||
std::vector<uint8_t> packet(4 + 1 + 4 + NextScreenLength);
|
||||
uint32_t deviceIdLow = (uint32_t)(m_ClientID & 0xFFFFFFFF);
|
||||
uint8_t frameType = 1; // Keyframe
|
||||
@@ -1376,9 +1390,9 @@ VOID CScreenSpyDlg::DrawNextScreenDiff(bool keyFrame)
|
||||
bChange = TRUE;
|
||||
}
|
||||
}
|
||||
// Broadcast H264 frame to web clients
|
||||
// Broadcast H264 frame to web clients (only for Web session dialogs)
|
||||
// Format: [DeviceID:4][FrameType:1][DataLen:4][H264Data:N]
|
||||
if (NextScreenLength > 0 && WebService().IsRunning()) {
|
||||
if (m_bIsWebSession && NextScreenLength > 0 && WebService().IsRunning()) {
|
||||
// Detect H264 keyframe by checking NAL unit type
|
||||
// NAL type 5 = IDR slice (keyframe), NAL type 7 = SPS, NAL type 8 = PPS
|
||||
bool isKeyFrame = false;
|
||||
@@ -1463,8 +1477,8 @@ VOID CScreenSpyDlg::DrawScrollFrame()
|
||||
m_bCursorIndex = m_ContextObject->InDeCompressedBuffer.GetBuffer(2 + sizeof(POINT))[0];
|
||||
if (bOldCursorIndex != m_bCursorIndex) {
|
||||
bChange = TRUE;
|
||||
// 通知 Web 客户端光标变化
|
||||
if (WebService().IsRunning()) {
|
||||
// 通知 Web 客户端光标变化 (只有 Web 会话的对话框才广播)
|
||||
if (m_bIsWebSession && WebService().IsRunning()) {
|
||||
WebService().BroadcastCursor(m_ClientID, m_bCursorIndex);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user