禁用屏幕拷贝(Print Screen) 调用派生的析构函数及其它......

2016-01-29 12:26 75 1 收藏

禁用屏幕拷贝(Print Screen) 调用派生的析构函数及其它......,禁用屏幕拷贝(Print Screen),调用派生的析构函数及其它......

【 tulaoshi.com - C语言心得技巧 】

C++ At Work 专栏...
禁用屏幕拷贝(Print Screen),调用派生的析构函数及其它......

原著:Paul DiLascia
翻译:FatFatSon,NorthTibet

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

下载源代码:CAtWork0511.exe (273KB)
原文出处:Disabling Print Screen, Calling Derived Destructors, and More


我正在开发一个显示图形的程序,该图形具有知识产权,有没有什么办法禁用屏幕拷贝功能(Print Screen)以防止用户将图像拷贝到剪贴板上?Martin Cruz 禁止屏幕拷贝的办法倒是有一个,但是我得告诉你,要阻止其它应用程序从你的窗口上复制像素内容是不可能的。许多第三方程序都能捕获屏幕内容,这种程序也不难写。要想截获屏幕上的像素,你只要用 BitBlt 从屏幕设备上下文中拷贝它们既可,例如:

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com)

CWindowDC dc(NULL);   // 用 NULL 获取整个屏幕CDC memdc;... // 创建, 初始化 memdcmemdc.BitBlt(..., &dc); // 拷贝屏幕内容
  若要复制当前活动窗口的内容,只要获取该窗口的 CWnd 指针,然后用它来构造一个 CWindowDC,即可从中提取内容。
  总之,你无法阻止其它程序截获你窗口的像素。那么,如果你仅仅只是要禁用“屏幕拷贝”,或是阻止该功能做些什么,那其实很容易。Windows 通过注册热键来实现“屏幕拷贝”功能。在我 2000 年 12 月的栏目中,我示范了如何用 RegisterHotKey 来注册应用程序热键(参见 C++ Q&A: Sending Messages in Windows, Adding Hot Keys to your Application),Windows 使用预定义的热键 IDHOT_SNAPDESKTOP 和 IDHOT_SNAPWINDOW 来处理“屏幕拷贝”。这两个热键分别对应于“Print Screen”和“Alt+Print Screen”,前者用来复制整个屏幕,而后者则仅复制当前活动窗口。为了禁用这些功能,你只要注册这些热键,当用户按下这些热键时,让 Windows 向你的程序发送 WM_HOTKEY 消息,此时你可以忽略这些消息,旁路掉默认的屏幕复制行为既可。你的主框架(mainframe)类是最适合做这件事的地方。
// 热键的处理方法
// MainFrame.h#include "FolderFrame.h" #include "resource.h" //////////////// // Typical MFC Main frame window, override to disable PrintScreen. // class CMainFrame : public CFrameWnd { protected: ... afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct); // disable PrintScreen afx_msg void OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized); afx_msg LRESULT OnHotKey(WPARAM wp, LPARAM lp); afx_msg void OnDestroy(); DECLARE_MESSAGE_MAP() }; MainFrame.cpp #include "StdAfx.h"#include "MainFrm.h"#include "View.h"IMPLEMENT_DYNCREATE(CMainFrame, CFrameWnd)BEGIN_MESSAGE_MAP(CMainFrame, CFrameWnd)... // disable PrintScreen: ON_WM_CREATE() ON_WM_DESTROY() ON_WM_ACTIVATE() ON_MESSAGE(WM_HOTKEY, OnHotKey)END_MESSAGE_MAP()...int CMainFrame::OnCreate(LPCREATESTRUCT lpCreateStruct){... RegisterHotKey(m_hWnd, IDHOT_SNAPDESKTOP, 0, VK_SNAPSHOT); return 0;}void CMainFrame::OnDestroy(){ UnregisterHotKey(m_hWnd, IDHOT_SNAPDESKTOP);}//////////////////// Handle hotkey: should be PrintScreen or Alt-PrintScreen.// Do nothing (bypass Windows screen capture)//LRESULT CMainFrame::OnHotKey(WPARAM wp, LPARAM){ UNREFERENCED_PARAMETER(wp); return 0; // ignore}//////////////////// When window is activated/deactivated, disable/enable Alt-PrintScreen.// (IDHOT_SNAPWINDOW)//void CMainFrame::OnActivate(UINT nState, CWnd* pWndOther, BOOL bMinimized){ CFrameWnd::OnActivate(nState, pWndOther, bMinimized); if (nState) RegisterHotKey(m_hWnd, IDHOT_SNAPWINDOW, MOD_ALT, VK_SNAPSHOT); else UnregisterHotKey(m_hWnd, IDHOT_SNAPWINDOW);}
  上述代码段展示了一个典型的 MFC CMainFrame 类实现。OnCreate/OnDestroy 函数用来注册/注销 IDHOT_SNAPDESKTOP 热键;OnActivate 函数用来在应用程序处于激活/和非激活状态时注册/注销 IDHOT_SNAPWINDOW 热键。当你的窗口处于非激活状态时,通过重新启用 IDHOT_SNAPWINDOW,当别的应用程序拥有焦点时,用户仍然能用 Alt+Print Screen 来复制屏幕。
  你也许会想到用 CS_OWNDC 式样来注册窗口类以防止屏幕拷贝(它导致 Windows 为窗口类分配一个私有设备上下文),但

来源:https://www.tulaoshi.com/n/20160129/1486067.html

延伸阅读
技术英语(一) 栏目编辑:小刀人 编者按—— 技术英语论坛自开通以来,受到广大网友的热情关注。在广大网友的积极参与下,论坛的热烈而又良好的学习气氛感染了我们每一个到技术英语论坛的朋友。现将技术英语论坛的精华帖子和较好的译文编撰成文,并作为 VCKBASE《在线杂志》的一个栏目发布。供大家学习参考。...
c++中,如果没有为一个类提供析构函数,那么编译器会为这个类提供默认的析构的函数。由于析构函数的功能和构造函数相反,因此和默认的构造函数类似,编译器也会提供无用的默认的析构函数,和非无用的析构函数。两者的分析情况一样(对于默认的构造函数分析,请参看《从汇编看c++中默认构造函数的使用分析》)。并且编译器会提供非无用的默认析构...
请注重,这一节内容是c++的重点,要非凡注重! 我们先说一下什么是构造函数? !-- frame contents -- !-- /frame contents -- 上一个教程我们简单说了关于类的一些基本内容,对于类对象成员的初始化我们始终是建立成员函数然后手工调用该函数对成员进行赋值的,那么在c++中对于类来说有没有更方便的方式能...
看如下代码: 代码如下: #includeiostream class TestConstructor { public:     TestConstructor()     {         std::cout"TestConstructor()"std::endl;     }     ~TestConstructor()     {     &...
标签: Web开发
这是基本JavaScript的屏幕对象 screen 屏幕对象 反映了当前用户的屏幕设置。 width 返回屏幕的宽度(像素数)。 height 返回屏幕的高度。 availWidth 返回屏幕的可用宽度(除去了一些不自动隐藏的类似任务栏的东西所占用的宽度)。 availHeight 返回屏幕的可用高度。 colorDepth 返回当前颜色...

经验教程

242

收藏

63
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部