Feat: Support viewing active window via online-host popup menu
This commit is contained in:
@@ -13,10 +13,11 @@
|
||||
//////////////////////////////////////////////////////////////////////
|
||||
|
||||
CScreenSpy::CScreenSpy(ULONG ulbiBitCount, BYTE algo, BOOL vDesk, int gop, BOOL all, int level,
|
||||
RECT rc, BOOL switchScreen, HWND hwnd) :
|
||||
RECT rc, BOOL switchScreen, HWND hwnd, bool dynamicFg) :
|
||||
ScreenCapture(ulbiBitCount, algo, all, level, rc, switchScreen)
|
||||
{
|
||||
m_hTargetWnd = hwnd;
|
||||
m_bDynamicForeground = dynamicFg;
|
||||
m_GOP = gop;
|
||||
|
||||
// 窗口捕获模式:用 DWM 真实边界覆盖基类的全屏尺寸,并缓存阴影偏移量
|
||||
@@ -160,7 +161,36 @@ LPBYTE CScreenSpy::GetFirstScreenData(ULONG* ulFirstScreenLength)
|
||||
|
||||
VOID CScreenSpy::ScanScreen(HDC hdcDest, HDC hdcSour, ULONG ulWidth, ULONG ulHeight)
|
||||
{
|
||||
if (m_hTargetWnd) {
|
||||
if (m_hTargetWnd || m_bDynamicForeground) {
|
||||
// 动态前景模式:每帧查询当前前景窗口,切换时尺寸不变则直接复用,尺寸变化则触发重建
|
||||
if (m_bDynamicForeground) {
|
||||
HWND fg = GetForegroundWindow();
|
||||
if (fg && fg != m_hTargetWnd) {
|
||||
RECT wndRc = {}, frameRc = {};
|
||||
GetWindowRect(fg, &wndRc);
|
||||
frameRc = wndRc;
|
||||
DwmGetWindowAttribute(fg, DWMWA_EXTENDED_FRAME_BOUNDS, &frameRc, sizeof(frameRc));
|
||||
ULONG newW = (ULONG)(frameRc.right - frameRc.left);
|
||||
ULONG newH = (ULONG)(frameRc.bottom - frameRc.top);
|
||||
if (newW != m_ulFullWidth || newH != m_ulFullHeight) {
|
||||
// 尺寸不同:触发重建,同时把新 HWND 写入 m_NextTargetWnd,
|
||||
// 让 WorkThread 在重建前同步更新 CScreenManager::m_hTargetWnd
|
||||
m_NextTargetWnd = fg;
|
||||
m_bNeedRestart = true;
|
||||
return;
|
||||
}
|
||||
// 尺寸相同:直接切换,更新阴影偏移和缓存,无需重建
|
||||
m_ShadowLeft = frameRc.left - wndRc.left;
|
||||
m_ShadowTop = frameRc.top - wndRc.top;
|
||||
m_CachedWndW = wndRc.right - wndRc.left;
|
||||
m_CachedWndH = wndRc.bottom - wndRc.top;
|
||||
m_PendingWndW = m_PendingWndH = 0;
|
||||
m_hTargetWnd = fg;
|
||||
Mprintf("CScreenSpy: 前景切换(同尺寸) -> HWND=%p\n", fg);
|
||||
}
|
||||
if (!m_hTargetWnd) return; // 当前无前景窗口,冻结上一帧
|
||||
}
|
||||
|
||||
// 最小化:不绘制,hdcDest 保留上一帧内容(远程端看到冻结画面)
|
||||
if (IsIconic(m_hTargetWnd)) return;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user