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:
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user