开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 347|回复: 6
收起左侧

[讨论] 一些需要懂C++和系统的人研究的问题

[复制链接]
结帖率:95% (84/88)
发表于 2024-5-4 09:36:29 | 显示全部楼层 |阅读模式   泛播地址
本帖最后由 陽陽陽 于 2024-5-4 09:37 编辑

最近发现PrintWindow第三个参数竟然资料这么少,提问也都是AI回答。但是它第三个参数确实可以填3,截图硬件加速窗口。
https://bbs.125.la/forum.php?mod=viewthread&tid=14795771
https://bbs.125.la/forum.php?mod=viewthread&tid=14820250

正好我查了一下PrintWindow这个函数从XP就有了,但是XP源码泄漏了过呀!<del>我怎么这么聪明</del>
但是问题又来了,我不会太多的C++和系统,然后我最近Github一直在跟随AlongsCode,发现他似乎对系统的造诣很深。
这里各行各业的大佬挺多的,有没有谁研究过它第三个参数?

点评

我也试着找Wayback machine,结果发现找了半天没找到之前MSDN.microsft.com的时候WinAPI参考在哪,有大佬可以指点下吗?   泛播地址  发表于 2024-5-4 09:40
结帖率:97% (29/30)

签到天数: 17 天

发表于 2024-5-4 10:46:16 | 显示全部楼层   广西壮族自治区柳州市
陽陽陽 发表于 2024-5-4 10:39
就是想知道PrintWindow它那个第三个参数是干嘛的,有哪些神奇的枚举值可以用。 ...

没了,就1跟2,这俩位或一起就是3,1的作用是使用客户区作为截取范围,2的作用是从dwm中捕获窗口内容

评分

参与人数 1好评 +1 精币 +3 收起 理由
陽陽陽 + 1 + 3 啊好的,谢谢谢谢!

查看全部评分

回复 支持 反对

使用道具 举报

结帖率:95% (84/88)

签到天数: 16 天

 楼主| 发表于 2024-5-4 10:39:08 | 显示全部楼层   泛播地址

就是想知道PrintWindow它那个第三个参数是干嘛的,有哪些神奇的枚举值可以用。
回复 支持 反对

使用道具 举报

结帖率:97% (29/30)

签到天数: 17 天

发表于 2024-5-4 10:25:38 | 显示全部楼层   广西壮族自治区柳州市
陽陽陽 发表于 2024-5-4 10:20
看不懂,但是看了之后又没信心学C++了。
GreSpDwmSyncCaptureSurfaceBits这个函数网上也没有太多的资料, ...

没搞懂你要干嘛
回复 支持 反对

使用道具 举报

结帖率:95% (84/88)

签到天数: 16 天

 楼主| 发表于 2024-5-4 10:20:49 | 显示全部楼层   泛播地址
我的小拇指啊 发表于 2024-5-4 10:13
GreSpDwmSyncCaptureSurfaceBits

[mw_shl_code=cpp,true]__int64 __fastcall xxxPrintWindow(__int64 pwnd ...

看不懂,但是看了之后又没信心学C++了。
GreSpDwmSyncCaptureSurfaceBits这个函数网上也没有太多的资料,有个类似的叫dwmdxgetwindowsharedsurface,但是很明显不一样。
大佬能指点下吗
回复 支持 反对

使用道具 举报

结帖率:97% (29/30)

签到天数: 17 天

发表于 2024-5-4 10:13:01 | 显示全部楼层   广西壮族自治区柳州市
GreSpDwmSyncCaptureSurfaceBits

[C++] 纯文本查看 复制代码
__int64 __fastcall xxxPrintWindow(__int64 pwnd, HDC hdc, char flags)
{
  _DWORD *v3; // r9
  int v5; // edi
  int v6; // r12d
  int v7; // r14d
  int v8; // r13d
  int v9; // r15d
  __int64 StyleWindow; // rax
  __int64 v11; // rbx
  __int64 v12; // rax
  __int128 v13; // xmm0
  __int64 v14; // rax
  __m128i v15; // xmm0
  unsigned int v16; // edi
  float *v17; // rax
  float v18; // xmm2_4
  int v19; // eax
  __int64 v20; // rcx
  __int64 DCEx; // rbx
  __int128 v23; // [rsp+60h] [rbp-9h] BYREF
  __int64 v24; // [rsp+70h] [rbp+7h] BYREF
  int v25; // [rsp+78h] [rbp+Fh]
  int v26; // [rsp+7Ch] [rbp+13h]
  __int128 v27; // [rsp+80h] [rbp+17h] BYREF
  int v29; // [rsp+E0h] [rbp+77h]

  v29 = 0;
  v3 = *(_DWORD **)(pwnd + 40);
  v27 = 0i64;
  v5 = flags & 1;
  if ( (flags & 1) != 0 )
  {
    v6 = v3[26] - v3[22];
    v7 = v3[28] - v3[26];
    v8 = v3[27] - v3[23];
    v9 = v3[29] - v3[27];
  }
  else
  {
    v6 = 0;
    v7 = v3[24] - v3[22];
    v8 = 0;
    v9 = v3[25] - v3[23];
  }
  if ( (flags & 2) != 0
    && (unsigned int)IsWindowDesktopComposed(pwnd)
    && (StyleWindow = GetStyleWindow(pwnd, 2568), (v11 = StyleWindow) != 0) )
  {
    if ( StyleWindow != pwnd )
    {
      v12 = *(_QWORD *)(pwnd + 40);
      if ( v5 )
        v13 = *(_OWORD *)(v12 + 104);
      else
        v13 = *(_OWORD *)(v12 + 88);
      v14 = *(_QWORD *)(v11 + 40);
      v23 = v13;
      v15 = *(__m128i *)(v14 + 88);
      LODWORD(v14) = _mm_cvtsi128_si32(v15);
      HIDWORD(v23) -= v15.m128i_i32[1];
      DWORD1(v23) -= v15.m128i_i32[1];
      LODWORD(v23) = v23 - v14;
      DWORD2(v23) -= v14;
      v25 = v15.m128i_i32[2] - v14;
      v26 = v15.m128i_i32[3] - v15.m128i_i32[1];
      v24 = 0i64;
      v16 = IntersectRect(&v27, (int *)&v24, (int *)&v23);
      if ( !v16 )
        return v16;
      v6 = v27;
      v7 = DWORD2(v27) - v27;
      v8 = DWORD1(v27);
      v9 = HIDWORD(v27) - DWORD1(v27);
    }
    if ( gdwInAtomicOperation && (gdwExtraInstrumentations & 1) != 0 )
      KeBugCheckEx(0x160u, gdwInAtomicOperation, 0i64, 0i64, 0i64);
    UserSessionSwitchLeaveCrit();
    v17 = *(float **)(v11 + 216);
    v18 = FLOAT_1_0;
    if ( v17 )
      v18 = *v17;
    v16 = GreSpDwmSyncCaptureSurfaceBits(*(HWND *)v11, hdc, v18, v6, v8, v7, v9);
    EnterCrit(0i64, 1i64);
  }
  else
  {
    if ( (GetRedirectionFlags(pwnd) & 8) == 0 )
    {
      v19 = SetRedirectedWindow(pwnd, 8i64);
      v20 = *(_QWORD *)(pwnd + 40);
      if ( v19 < 0 )
        return (*(unsigned __int8 *)(v20 + 26) >> 5) & 1;
      *(_DWORD *)(v20 + 232) |= 4u;
      v29 = 1;
    }
    v16 = 1;
    xxxInternalUpdateWindow((struct tagWND *)pwnd, 1u);
    DCEx = _GetDCEx(pwnd, 0i64, 3i64);
    NtGdiBitBltInternal((_DWORD)hdc, 0, 0, v7, v9, DCEx, v6, v8, -2134114272, 0, 0);
    _ReleaseDC(DCEx);
    if ( v29 && (*(_DWORD *)(*(_QWORD *)(pwnd + 40) + 232i64) & 4) != 0 )
    {
      UnsetRedirectedWindow(pwnd, 8i64);
      *(_DWORD *)(*(_QWORD *)(pwnd + 40) + 232i64) &= ~4u;
    }
  }
  return v16;
}
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 诚聘英才| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 800073686,邮箱:800073686@b.qq.com
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表