Init: Migrate SimpleRemoter (Since v1.3.1) to Gitea

This commit is contained in:
yuanyuanxiang
2026-04-19 19:55:01 +02:00
commit 5a325a202b
744 changed files with 235562 additions and 0 deletions

124
client/ScreenManager.h Normal file
View File

@@ -0,0 +1,124 @@
// ScreenManager.h: interface for the CScreenManager class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_)
#define AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include "Manager.h"
#include "ScreenSpy.h"
#include "ScreenCapture.h"
// WASAPI 前向声明 (COM 接口)
struct IMMDevice;
struct IAudioClient;
struct IAudioCaptureClient;
// WAVEFORMATEX 使用 void* 避免包含头文件
bool LaunchApplication(TCHAR* pszApplicationFilePath, TCHAR* pszDesktopName);
bool IsWindows8orHigher();
BOOL IsRunningAsSystem();
class IOCPClient;
struct UserParam;
class CScreenManager : public CManager
{
public:
CScreenManager(IOCPClient* ClientObject, int n, void* user = nullptr, BOOL priv=FALSE);
virtual ~CScreenManager();
HANDLE m_hWorkThread;
ScreenSettings m_ScreenSettings = { 20 };
QualityProfile m_QualityProfiles[QUALITY_COUNT]; // 本地质量配置(可被服务端覆盖)
virtual void InitScreenSpy();
void LoadQualityProfiles(); // 从配置文件加载质量配置
void SaveQualityProfiles(); // 保存质量配置到配置文件
static DWORD WINAPI WorkThreadProc(LPVOID lParam);
VOID SendBitMapInfo();
VOID OnReceive(PBYTE szBuffer, ULONG ulLength);
ScreenCapture* m_ScreenSpyObject;
VOID SendFirstScreen();
const char* GetNextScreen(ULONG &ulNextSendLength);
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;
std::string m_DesktopID;
BOOL m_bIsWorking;
BOOL m_bIsBlockInput;
BOOL SendClientClipboard(BOOL fast);
VOID UpdateClientClipboard(char *szBuffer, ULONG ulLength);
std::string m_hash;
std::string m_hmac;
CONNECT_ADDRESS *m_conn = nullptr;
uint64_t m_MyClientID = 0; // V2: 本机客户端ID
void SetConnection(CONNECT_ADDRESS* conn)
{
m_conn = conn;
if (conn) m_MyClientID = conn->clientID;
}
bool IsRunAsService() const
{
if (m_conn && (m_conn->iStartup == Startup_GhostMsc || m_conn->iStartup == Startup_TestRunMsc))
return true;
static BOOL is_run_as_system = IsRunningAsSystem();
return is_run_as_system;
}
// 获取当前活动桌面(带写权限,用于锁屏等安全桌面)
// 使用独立的静态变量避免与WorkThreadProc的g_hDesk并发冲突
HDESK s_inputDesk = NULL;
clock_t s_lastCheck = 0;
DWORD s_lastThreadId = 0;
bool SwitchScreen();
bool RestartScreen();
void SwitchToNextWindow(); // 切换到下一个窗口(类似 Alt+Tab
virtual BOOL OnReconnect();
uint64_t m_nReconnectTime = 0; // 重连开始时间
uint64_t m_DlgID = 0;
BOOL m_SendFirst = FALSE;
// 虚拟桌面
BOOL m_virtual;
POINT m_point;
POINT m_lastPoint;
BOOL m_lmouseDown;
HWND m_hResMoveWindow;
LRESULT m_resMoveType;
BOOL m_rmouseDown; // 标记右键是否按下
POINT m_rclickPoint; // 右键点击坐标
HWND m_rclickWnd; // 右键窗口
int m_nSwitchWindowIndex = 0; // 切换窗口索引
// ========== 系统音频捕获 (WASAPI Loopback) ==========
volatile BOOL m_bAudioThreadRunning = FALSE;// 音频线程运行标志(独立于视频线程)
volatile BOOL m_bAudioInitialized = FALSE; // WASAPI 是否已初始化
HANDLE m_hAudioThread = NULL; // 音频线程句柄
HANDLE m_hAudioEvent = NULL; // 控制线程挂起/唤醒
// WASAPI 相关
IMMDevice* m_pAudioDevice = nullptr;
IAudioClient* m_pAudioClient = nullptr;
IAudioCaptureClient* m_pCaptureClient = nullptr;
void* m_pWaveFormat = nullptr; // 实际类型: WAVEFORMATEX*
BOOL InitWASAPILoopback(); // 初始化 WASAPI Loopback
void UninitWASAPI(); // 释放 WASAPI 资源
static DWORD WINAPI AudioThreadProc(LPVOID lpParam); // 音频捕获线程
void HandleAudioCtrl(BYTE enable, BYTE persist); // 处理音频控制命令
};
#endif // !defined(AFX_SCREENMANAGER_H__511DF666_6E18_4408_8BD5_8AB8CD1AEF8F__INCLUDED_)