Feature: Add menu to switch screen for remote control

This commit is contained in:
yuanyuanxiang
2025-11-28 20:53:28 +01:00
parent 3270527dd0
commit 9a3277d638
6 changed files with 83 additions and 24 deletions

View File

@@ -133,6 +133,7 @@ public:
int m_GOP; // <20>ؼ<EFBFBD>֡<EFBFBD><D6A1><EFBFBD><EFBFBD>
bool m_SendKeyFrame; // <20><><EFBFBD>͹ؼ<CDB9>֡
CX264Encoder *m_encoder; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
int m_nScreenCount; // <20><>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD>
ScreenCapture(int n = 32, BYTE algo = ALGORITHM_DIFF, BOOL all = FALSE) :
m_ThreadPool(nullptr), m_FirstBuffer(nullptr), m_RectBuffer(nullptr),
@@ -141,11 +142,11 @@ public:
m_FrameID(0), m_GOP(DEFAULT_GOP), m_iScreenX(0), m_iScreenY(0), m_biBitCount(n),
m_SendKeyFrame(false), m_encoder(nullptr)
{
m_BlockNum = 8;
m_ThreadPool = new ThreadPool(m_BlockNum);
static auto monitors = GetAllMonitors();
static int index = 0;
m_nScreenCount = monitors.size();
if (all && !monitors.empty()) {
int idx = index++ % (monitors.size()+1);
if (idx == 0) {
@@ -207,6 +208,10 @@ public:
SAFE_DELETE(m_encoder);
}
virtual int GetScreenCount() const {
return m_nScreenCount;
}
virtual int SendQuality(int quality)
{
int old = m_SendQuality;

View File

@@ -111,6 +111,18 @@ CScreenManager::CScreenManager(IOCPClient* ClientObject, int n, void* user):CMan
m_hWorkThread = __CreateThread(NULL,0, WorkThreadProc,this,0,NULL);
}
bool CScreenManager::SwitchScreen() {
if (m_ScreenSpyObject == NULL || m_ScreenSpyObject->GetScreenCount() <= 1)
return false;
m_bIsWorking = FALSE;
DWORD s = WaitForSingleObject(m_hWorkThread, 3000);
if (s == WAIT_TIMEOUT) {
TerminateThread(m_hWorkThread, -1);
}
m_bIsWorking = TRUE;
m_hWorkThread = __CreateThread(NULL, 0, WorkThreadProc, this, 0, NULL);
return true;
}
std::wstring ConvertToWString(const std::string& multiByteStr)
{
@@ -190,8 +202,8 @@ void CScreenManager::InitScreenSpy()
DXGI = param->buffer[0];
algo = param->length > 1 ? param->buffer[1] : algo;
all = param->length > 2 ? param->buffer[2] : all;
delete param;
}
m_pUserParam = param;
} else {
DXGI = (int)user;
}
@@ -224,7 +236,7 @@ void CScreenManager::InitScreenSpy()
SetThreadDesktop(g_hDesk = hDesk);
}
}
SAFE_DELETE(m_ScreenSpyObject);
if ((USING_DXGI == DXGI && IsWindows8orHigher())) {
m_isGDI = FALSE;
auto s = new ScreenCapturerDXGI(algo, DEFAULT_GOP, all);
@@ -355,6 +367,7 @@ CScreenManager::~CScreenManager()
delete m_ScreenSpyObject;
m_ScreenSpyObject = NULL;
SAFE_DELETE(m_pUserParam);
}
void RunFileReceiver(CScreenManager *mgr, const std::string &folder)
@@ -404,6 +417,10 @@ void FinishSend(void* user)
VOID CScreenManager::OnReceive(PBYTE szBuffer, ULONG ulLength)
{
switch(szBuffer[0]) {
case COMMAND_SWITCH_SCREEN: {
SwitchScreen();
break;
}
case COMMAND_NEXT: {
NotifyDialogIsOpen();
break;

View File

@@ -19,6 +19,8 @@ bool IsWindows8orHigher();
class IOCPClient;
struct UserParam;
class CScreenManager : public CManager
{
public:
@@ -37,6 +39,7 @@ public:
VOID SendNextScreen(const char* szBuffer, ULONG ulNextSendLength);
VOID ProcessCommand(LPBYTE szBuffer, ULONG ulLength);
UserParam *m_pUserParam = NULL;
INT_PTR m_ptrUser;
HDESK g_hDesk;
BOOL m_isGDI;
@@ -56,6 +59,8 @@ public:
bool IsRunAsService() const {
return m_conn ? m_conn->iStartup == Startup_GhostMsc : false;
}
bool SwitchScreen();
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
BOOL m_virtual;
POINT m_point;