Feat: ROI screen capture with remote control support via COMMAND_SCREEN_ROI

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
yuanyuanxiang
2026-06-14 00:24:46 +02:00
parent 1335d636da
commit 63ef75b7ce
7 changed files with 102 additions and 31 deletions

View File

@@ -173,10 +173,10 @@ bool CScreenManager::SwitchScreen()
if (m_ScreenSpyObject == NULL || m_ScreenSpyObject->GetScreenCount() <= 1 ||
!m_ScreenSpyObject->IsMultiScreenEnabled())
return false;
return RestartScreen();
return RestartScreen(TRUE);
}
bool CScreenManager::RestartScreen()
bool CScreenManager::RestartScreen(BOOL switchScreen)
{
if (m_ScreenSpyObject == NULL || m_bIsWorking == FALSE)
return false;
@@ -194,6 +194,7 @@ bool CScreenManager::RestartScreen()
// 3. 重新启动工作线程InitScreenSpy 会创建新对象)
m_bIsWorking = TRUE;
m_SendFirst = FALSE;
m_SwitchScreen = switchScreen;
m_hWorkThread = __CreateThread(NULL, 0, WorkThreadProc, this, 0, NULL);
return true;
}
@@ -462,6 +463,8 @@ void CScreenManager::InitScreenSpy()
BYTE algo = ALGORITHM_DIFF;
BYTE* user = (BYTE*)m_ptrUser;
BOOL all = FALSE;
RECT rect = m_ROI;
BOOL switchScreen = m_SwitchScreen;
if (!(user == NULL || ((int)user) == 1)) {
UserParam* param = (UserParam*)user;
if (param) {
@@ -522,18 +525,18 @@ void CScreenManager::InitScreenSpy()
SAFE_DELETE(m_ScreenSpyObject);
if ((USING_DXGI == DXGI && IsWindows8orHigher())) {
m_isGDI = FALSE;
auto s = new ScreenCapturerDXGI(algo, DEFAULT_GOP, all, m_ScreenSettings.EncodeLevel);
auto s = new ScreenCapturerDXGI(algo, DEFAULT_GOP, all, m_ScreenSettings.EncodeLevel, rect, switchScreen);
if (s->IsInitSucceed()) {
m_ScreenSpyObject = s;
} else {
SAFE_DELETE(s);
m_isGDI = TRUE;
m_ScreenSpyObject = new CScreenSpy(32, algo, FALSE, DEFAULT_GOP, all, m_ScreenSettings.EncodeLevel);
m_ScreenSpyObject = new CScreenSpy(32, algo, FALSE, DEFAULT_GOP, all, m_ScreenSettings.EncodeLevel, rect, switchScreen);
Mprintf("CScreenManager: DXGI SPY init failed!!! Using GDI instead.\n");
}
} else {
m_isGDI = TRUE;
m_ScreenSpyObject = new CScreenSpy(32, algo, DXGI == USING_VIRTUAL, DEFAULT_GOP, all, m_ScreenSettings.EncodeLevel);
m_ScreenSpyObject = new CScreenSpy(32, algo, DXGI == USING_VIRTUAL, DEFAULT_GOP, all, m_ScreenSettings.EncodeLevel, rect, switchScreen);
}
}
@@ -820,6 +823,14 @@ VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
m_ClientObject->StopRunning();
break;
}
case COMMAND_SCREEN_ROI:{
if (ulLength > sizeof(RECT)) {
memcpy(&m_ROI, szBuffer + 1, sizeof(RECT));
Mprintf("[CScreenManager] Set ROI: (%d, %d), (%d, %d)\n", m_ROI.left, m_ROI.top, m_ROI.right, m_ROI.bottom);
RestartScreen();
}
break;
}
case COMMAND_ENCODE_LEVEL: {
int encodeLevel = szBuffer[1];
iniFile cfg(CLIENT_PATH);