欢迎光临散文网 会员登陆 & 注册

python tkinter 实现反截图(采用windows api)

2023-07-18 14:31 作者:xiaozhang_awa  | 我要投稿


前文

我们需要明白 windows user32.dll 动态库 的 "SetWindowDisplayAffinity"模块

SetWindowDisplayAffinit 旨在支持 Windows 7 新增的窗口内容保护功能。 此功能使应用程序能够保护其自己的屏幕窗口内容

他有两个值  【分别是hWnd 和 dwAffinity】

其中 hWnd 类型是:HWND 他是顶级窗口的句柄。 窗口必须属于当前进程。

而 dwAffinity 类型:DWORD 用于显示相关性设置,用于指定窗口的内容可以显示的位置。

他有3个值 :

【0x00000000 对窗口的显示位置施加任何限制。】

【0x00000001 窗口内容仅显示在监视器上。 在其他地方,该窗口不显示任何内容。[黑]】

【0x00000011 窗口仅显示在监视器上。 在其他地方,窗口根本不显示。[透明]】

正文

我们须安装ctypes,tkinter 模块  【用pip install 模块名】安装

接着在文件内导入



import tkinter as tk  #as tk tkinter的别名。

from ctypes import *

from ctypes import wintypes #在 ctypes 导入 wintypes 模块

win = tk.Tk()

win.geometry('450x250') #窗口大小

win.update() # 刷新窗口 以便句柄能正常使用

dwAffinity = wintypes.DWORD(0x00000001)#使用wintypes模块,“0x00000001”可换成其他值

a = win.winfo_id() #获取程序窗口的句柄 注意!这不是系统句柄

hWindow = windll.user32.GetParent(a) # 所以我们还要用这改为系统句柄

dll = cdll.LoadLibrary(r"C:\WINDOWS\system32\")#接着导入user32.dll 模块

v = dll.SetWindowDisplayAffinity(hWindow,dwAffinity)#最后调用user32.dll模块的SetWindowDisplayAffinity

win.mainloop()#保持一下窗口显示

#这就好了,但是为了方便显示成功没,我们就再写个判断

if v != 1 :

  dll = cdll.LoadLibrary(r"C:\WINDOWS\system32\kernel32.dll")#导入windows中的显示错函数

  dll = dll.GetLastError()#调用

  print(dll)#打印到控制台



这就结束了

给张图:

系统截图

多嘴几句

【仅供学习】

如有写的不对,请大佬多多指教

这只支持windows系统

还有 还有“反反截图”软件  运用 Hook 【钩子】强制注入dll 实现废除功能 就不放地址了

水一篇文章


python tkinter 实现反截图(采用windows api)的评论 (共 条)

分享到微博请遵守国家法律