将水印铺满全屏幕

全屏幕铺水印文字这个需求缘自一个梗;说再牛逼的公文管理系统、文件透明加解密技术只能防止文件不被盗拷、复制和私自带出企业。但是如果人家直接用手机(相机)对着屏幕拍照,就能直接把内容拍走了。这个该怎么防?或者说在不采用“特殊显示器”的技术条件下,能快速的捕获被拍照片的源头在哪里,偷拍具体在什么时间拍了哪一台机器的显示画面?于是就有人提出我们可以在屏幕上生成全屏的水印排列,拍照者拍下的画面中就会遗留有水印。

假设这个方案可行,想在全屏幕产生水印( 不单指应用软件 )需要如何实现?

  1. 获取当前桌面的长宽( 分辨率 ),用程序生成一个无边框尺寸与屏幕一样大的窗口撑满全屏。

  2. 将这个窗口设置为全透明、永远置顶,覆盖住整个桌面及其他的窗口。

  3. 让这个窗口无视(  忽略,不接受)所有的用户交互操作。如用户的键盘、使用鼠标操作。这些键鼠等操作将被下层窗口(  相应位置覆盖住的窗口 )响应。

  4. 最后一步简单:在这个窗口通过重写painEvent 用painter  把想画的内容直接绘在这个窗口之上。

总结来说所谓的水印只是被画在了一个全屏的窗口上,不是真的画在桌面上了。但也能达到预期的效果。


MainWindow::MainWindow(QWidget *parent) : QWidget(parent){

    mMoveing=false;

    int dwidth  = QApplication::desktop()->width();
    int dheight = QApplication::desktop()->height();
    setFixedSize( dwidth, dheight );

    setWindowFlags( Qt::FramelessWindowHint |
                    Qt::WindowTransparentForInput |
                    Qt::Dialog |
                    Qt::WindowStaysOnTopHint |
                    Qt::BypassWindowManagerHint );

    this->setAttribute(Qt::WA_TranslucentBackground, true);
    
    //this->setWindowOpacity(0.1);

}


void MainWindow::paintEvent(QPaintEvent *event){

    Q_UNUSED(event);

    QDesktopWidget *des = QApplication::desktop();
    QPainter painter;
    painter.begin(  this );
    //painter.setPen(QColor(10, 10, 10,16)); //颜色
    painter.setFont(QFont("Arial", 14));   //字体字号
    QTransform transform;
    transform.rotate( -25 );               //角度
    painter.setTransform(transform);
    /**
     * 起始座标
     */
    int x = 64;
    int y = 100;
    qsrand( 255 );
    while( y < des->size().height() *2){

        int colorV = rand() % 255;
        qDebug() << "colorV " << colorV;
        painter.setPen(QColor( 10, 10 , colorV, 24)); //颜色
        //z = x;
        while( x < des->size().width() ){
          painter.drawText( QPoint( x, y ), "9891505");
          x += 128; /** 列间隔 */
        }
        y += 64;    /** 行间隔 */
        x = -320;   /** 列再起始位置 */
    }
}