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

我正在开发一个显示图形的程序,该图形具有知识产权,有没有什么办法禁 用屏幕拷贝功能(Print Screen)以防止用户将图像拷贝到剪贴板上?

禁止 屏幕拷贝的办法倒是有一个,但是我得告诉你,要阻止其它应用程序从你的窗口 上复制像素内容是不可能的。许多第三方程序都能捕获屏幕内容,这种程序也不 难写。要想截获屏幕上的像素,你只要用 BitBlt 从屏幕设备上下文中拷贝它们 既可,例如:CWindowDC dc(NULL);  // 用 NULL 获取整个屏幕
CDC memdc;
... // 创建, 初始化 memdc
memdc.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);
}

时间: 2024-10-25 16:03:38

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

为什么基类的析构函数不是虚函数时,就不会调用派生类的析构函数

问题描述 为什么基类的析构函数不是虚函数时,就不会调用派生类的析构函数 我知道,基类的析构函数要生命为虚函数,不然用基类指针删除派生类对象时只会调用基类的析构函数,而不会调用派生类的析构函数,从而发生内存泄露.但是为什么会这样?为什么基类析构函数不是虚函数时,就不会调用派生类析构函数而是虚函数时就会调用派生类析构函数???有没有大神指点一下. 看了几位的回答,都不是我想要的.我已经知道了不声明为虚函数,会造成内存泄露.我想知道为什么会造成内存泄露,原因是什么. 解决方案 1. 析构函数跟普通成员

print screen键的作用有哪些

一.截取一般画面 最常用的就是它可以截取当前全屏画面,不管你的画面是什么,只需要按下Print Screen键,然后在打开"附件"上面的"画图"程序或者是打开一些绘图软件比如photoshop(ps)软件然后直接粘贴(ctrl+V)即可打开截取到的图像画面了.现在可以对图片进行编辑和修改了. 二.截取游戏画面 还有就是一些游戏程序,因为它是全屏模式的,如果需要截取游戏屏幕的话用一些截图软件就行不通.这里就可以使用Print Screen键来截取游戏画面窗口了.同样在

电脑 Print Screen键的妙用

  标准键盘中的Print Screen键估计很多人都不知道是做什么的?如何操作,本文就给您讲讲Print Screen键的妙用. 1.代替屏幕截图软件 按下Print Screen键,将会截取全屏幕画面.用鼠标点击"开始→程序→附件→画图",将会打开"画图"程序,点击该窗口中的"编辑→粘贴"菜单,这时会弹出一个 "剪贴板中的图像比位图大,是否扩大位图?"对话框,点击"是",就会将该截取的图片粘贴到其中.再

拷贝构造函数和拷贝赋值运算符的调用问题

问题描述 拷贝构造函数和拷贝赋值运算符的调用问题 假设有如下类:class HasPtr{public: HasPtr(const string &s): ps(new string(s))i(0){} HasPtr(const HasPtr &hp){ ps=new string(*hp.ps); i=hp.i; } HasPtr(const char *s):ps(new string(s))i(0){} HasPtr & operator=(const HasPtr &

编程-为什么派生类的指针指向基类对象 还可以调用派生类的函数?

问题描述 为什么派生类的指针指向基类对象 还可以调用派生类的函数? 想不明白啊,高手帮帮忙吧 Derived1 * hh = static_cast(new Base); hh->derivedfunction(); // 这里竟然是可以的 为什么呢 hh指向的是一个基类对象啊?? 而且即使derivedfunction里面用到派生类的私有成员也是可以的, 这到底是为什么啊??? 解决方案 虽然语法上让你通过了,static_cast是强制类型转换,所以语法没办法阻止你错误的做法,但是实际运行结

拷贝构造函数的调用时机

[拷贝构造函数的调用时机] 1.对象以值传递的方式传入函数参数 2.对象以值传递的方式从函数返回 3.对象需要通过另外一个对象进行初始化    拷贝构造函数原型,假设类名为Foo,则copy constructor为: Foo( const Foo &obj); 限定符必须是const,且必须是引用.

MFC 非模态对话框 关闭 会不会调用变量的析构函数?

问题描述 MFC 非模态对话框 关闭 会不会调用变量的析构函数? 我有一个子对话框,头文件中声明了变量a. 例如a是一个队列. 使用a的过程中,会不断动态申请新空间. 队列a是有析构函数的. 如果是局部变量,局部函数运行完后,队列可以自动调用析构函数. 但上述例子,关闭对话框后,却没有响应a的析构函数. 注,我重载了onclose.如果不能自动析构,我打算在里面手动析构a. 但我不太理解,为什么关闭对话框,析构函数不自动调用? 还有要注意什么别的问题-- 解决方案 是否调用析构函数取决于这个对话

DataV企业版账号间屏幕拷贝功能指南

如果你今天打开产品把鼠标移动到项目卡片上,可以发现右上角多了一个复制的小图标. 没错,账户间的拷屏功能就是这么低调地上线了.虽然操作非常简单,但是会涉及到一个用户识别码的新概念,拷屏过程中也会有一定的规则,所以还是向各位介绍具体操作. 首先,你需要确认拷屏的双方账户都是企业版账户,然后需要对方告知自身账户的用户识别码.用户识别码是目前用于拷屏功能的唯一识别码,可以在下图的位置进行查看. 在对方告知用户识别码以后,点击待拷贝项目右上角的拷屏按钮,可以看到以下的弹窗. 将对方的用户识别码填入图中红标

c# 多显示器设置主屏幕(Set primary screen for multiple monitors)

原文 http://www.cnblogs.com/coolkiss/archive/2013/09/18/3328854.html 经过google加各种百度,终于找到了一个有效的解决方案,下面是两个主要类,方便后人使用   1. Win32 API, 需要添加其它内容可以到这个网站从查找对应的c#实现 public class WinApi { public const Int32 CCHDEVICENAME = 32; public const Int32 CCHFORMNAME = 32