有些公司可能会对员工使用的电脑进行加域控制。如长时间无操作,熄灭屏幕并自动锁定、长时间无使用自动关机等控制。且不能进行个性化设置。有时与同事讨论问题,一段时间没有操作电脑就会导致进入锁定状态,必须重新输入密码登录。关键是密码还不能设太简单,得有大小写、符号、数字长度的要求,实在无语。迫不得已,于是想到了用程序模拟键盘按下操作,来"欺骗"电脑。达到防止锁屏的效果。

随着计算机的发展,scolllock键的作用越来越小,除了在Excel中有点用处,其它地方根本没用不上。于是打算模拟按下scolllock按键来“欺骗”电脑,这样既能防止锁屏,又不会影响电脑的正常使用。

查找相关资料: QT中如下代码可模拟键盘按键。

QKeyEvent tabKey(QEvent::KeyPress, Qt::Key_Tab, Qt::NoModifier);
QCoreApplication::sendEvent(this, &tabKey);

实测后发现并不能达到按键真实按下的效果,QT只是模拟发送了一个信号,能够供QT程序自己使用,window其他的软件并不能接收到。

继续查找资料发现,要模拟键盘按下必须使用windows的 API实现。

头文件:

#include <windows.h>

函数原型:

void keybd_event(BYTE bVk,BYTE bScan,DWORD dwFlags,DWORD dwExtralnfo);

参数:

bVk:定义一个虚拟键码。键码值必须在1~254之间。
  bScan:定义该键的硬件扫描码。
  dwFlags:定义函数操作的各个方面的一个标志位集。应用程序可使用如下一些预定义常数的组合设置标志位。
  KEYEVENTF_EXTENDEDKEY:若指定该值,则扫描码前一个值为OXEO(224)的前缀字节。 
  KEYEVENTF_KEYUP:若指定该值,该键将被释放;若未指定该值,该键将被按下。
  dwExtralnfo:定义与击键相关的附加的32位值。

模拟scolllock键按下的程序如下:

keybd_event(VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY, 0);//按键按下
keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0);//按键松开

防止锁屏程序除了实现定时模拟发送按键信号外,还做了防止程序双开、托盘后台运行等功能,方便使用。代码如下:

widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <windows.h>
#include <QWidget>
#include <QTimer>
#include <QKeyEvent>
#include <QSystemTrayIcon>
#include <QDebug>
#include <QMenu>
#include <QAction>namespace Ui {
class Widget;
}class Widget : public QWidget
{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();void closeEvent(QCloseEvent *event);
public slots:void sleep_timeout();    //定时超时void exit_application();  //退出程序void show_application();  //显示窗口void TrayIcon_proc(QSystemTrayIcon::ActivationReason reason); //托盘图标操作事件响应private slots:void on_pushButton_clicked();void on_spinBox_valueChanged(const QString &arg1);private:Ui::Widget *ui;QTimer *timer;QSystemTrayIcon *mSysTrayIcon;  //托盘图标QAction *show_app; QAction *exit_app; QMenu *mMenu;  //托盘菜单栏
};#endif // WIDGET_H

widget.cpp

#include "widget.h"
#include "ui_widget.h"Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget)
{ui->setupUi(this);QIcon icon("ico.png");//默认为当前目录,所谓当前目录,指编译后生成的以build开头的那个目录this->setWindowIcon(icon);//图标this->setWindowTitle("防锁屏工具");//设置窗体标题mSysTrayIcon = new QSystemTrayIcon(this);mSysTrayIcon->setIcon(icon);mSysTrayIcon->setToolTip("防锁屏工具");connect(mSysTrayIcon,SIGNAL(activated(QSystemTrayIcon::ActivationReason)),this,SLOT(TrayIcon_proc(QSystemTrayIcon::ActivationReason)));show_app = new QAction(QObject::trUtf8("显示主界面"),this);connect(show_app,SIGNAL(triggered()),this,SLOT(show_application()));exit_app = new QAction(QObject::trUtf8("退出程序"),this);connect(exit_app,SIGNAL(triggered()),this,SLOT(exit_application()));mMenu = new QMenu(this);mMenu->addAction(show_app);mMenu->addSeparator(); //增加分隔符mMenu->addAction(exit_app);mSysTrayIcon->setContextMenu(mMenu);mSysTrayIcon->show();timer = new QTimer(this);connect(timer,SIGNAL(timeout()), this, SLOT(sleep_timeout()));on_pushButton_clicked();
}Widget::~Widget()
{delete ui;
}void Widget::closeEvent(QCloseEvent *event)
{qDebug()<<"close !";this->hide();//mSysTrayIcon->showMessage("提示","程序已最小化至托盘,右键单击托盘图标可退出程序",QSystemTrayIcon::Information,1000);event->ignore();
}void Widget::TrayIcon_proc(QSystemTrayIcon::ActivationReason reason)
{switch (reason) {case QSystemTrayIcon::Trigger:qDebug()<<"单击";this->show();break;case QSystemTrayIcon::DoubleClick:qDebug()<<"双击";this->show();break;case QSystemTrayIcon::MiddleClick:qDebug()<<"中间按键";this->show();break;default:break;}
}void Widget::sleep_timeout()
{timer->stop();// QKeyEvent tabKey(QEvent::KeyPress, Qt::Key_ScrollLock, Qt::NoModifier);qDebug()<<"send key";//      QKeyEvent tabKey(QEvent::KeyPress , Qt::Key_A, Qt::NoModifier);//      QApplication::sendEvent(focusObject, &tabKey);//        int key = translateKeyCode(Qt::Key_ScrollLock);keybd_event(VK_SCROLL, 0, KEYEVENTF_EXTENDEDKEY, 0);//按键按下keybd_event(VK_SCROLL, 0, KEYEVENTF_KEYUP, 0);//按键松开int time = ui->spinBox->value();timer->start(time*1000);}void Widget::exit_application()
{qApp->quit();
}void Widget::show_application()
{this->show();
}void Widget::on_pushButton_clicked()
{if(timer->isActive())timer->stop();if(ui->pushButton->text() == "启用"){int time = ui->spinBox->value();timer->start(time*1000);ui->pushButton->setText("停用");}else if(ui->pushButton->text() == "停用"){ui->pushButton->setText("启用");}
}void Widget::on_spinBox_valueChanged(const QString &arg1)
{if(timer->isActive()){timer->stop();int time = ui->spinBox->value();timer->start(time*1000);}
}

main.c

#include "widget.h"
#include <QApplication>
#include <QTextCodec>
#include <QSharedMemory>int main(int argc, char *argv[])
{QApplication a(argc, argv);QTextCodec *codec = QTextCodec::codecForName("unlock");QTextCodec::setCodecForLocale(codec);QSharedMemory shared_memory;shared_memory.setKey(QString("123456"));if(shared_memory.attach()){return 0;}if(shared_memory.create(1)){Widget w;w.show();return a.exec();}return 0;
}

运行效果如图:

QT防止锁屏工具(QT模拟Windows按键按下)相关推荐

  1. qt实现锁屏功能,即点击锁屏按钮后再点击界面则无效

    qt实现锁屏功能,就像我们在使用视频软件的时候,会有一个锁的图标,点击后屏幕就不会被误触. 我想要实现的功能是:在点击了右下角的锁的图标之后,界面上的内容就不能点击了,也就是点击关闭是没有响应的,这样 ...

  2. linux自动锁屏命令_自制Linux终端锁屏工具

    很多时候我们不能一直守护在自己的电脑旁边,而且有些文件并不想让别人知道.那么这时候来个锁屏,是再合适不过的了.今天分享一个自制的锁屏工具,如下. 准备 •操作系统 : 我这里是ElementaryOS ...

  3. c/c++ 模拟键盘按键按下

    写个程序模拟用户按下某个键 获取按键状态: GetKeyState( [in] int nVirtKey )函数是获取某个按键的状态,nVirtKey对应的按键参数为VK_开头的宏定义.若为1则为按下 ...

  4. ubuntu下qt模拟键盘按键按下_基于QT的跨平台虚拟键盘设计与实现

    摘  要: 针对QT在Windows.Linux.以及嵌入式Linux-arm等不同平台下没有开源.高效的虚拟键盘(包含中文输入法),以及QT版本升级造成代码不兼容等问题,设计并实现了一个跨平台的虚拟 ...

  5. ubuntu下qt模拟键盘按键按下_基于Linux+Qt软键盘设计及其实现.pdf

    计算机与现代化 YUXIANDAIHUA 2011年第12期 JISUANJI 总第196期 文章编号:1006-2475(2011)12-0179-03 基于Linux Qt的软键盘设计与实现 田福 ...

  6. 小米手机60帧录屏_专业录屏工具,你们一定要收下

    还记得小懒分享过一个开源的录屏软件么:实用,开源,免费,录屏软件分享 文章里也提到了这个大厂软件,Bandicam. bandican 今天给大家带来的是VIP版了,所以无需激活,尽情使用. 这款录屏 ...

  7. iphone11没有锁屏声音_iphone11屏幕解锁按键音怎么关闭-互盾苹果恢复精灵

    随着iphone11的发布,很多果粉已经陆续的购买了iphone11手机,那么在很多人使用iphone11的时候都会遇到很多问题,那么iphone11屏幕解锁按键音怎么关闭,如何将这些功能进行关闭?下 ...

  8. 防止电脑休眠锁屏、防止休眠锁定、防止电脑休眠的小工具 —— 定时执行专家

    目录 ◆ 定时执行专家 - 防锁屏设置方法 ◆ 定时执行专家 - 介绍 ▼定时执行专家 - 最新版下载 ▼支持23种任务类型 ▼支持12种触发方式 ▼关键字/Keyword 电脑设置了待机或者睡眠模式 ...

  9. 如何更改Windows 10锁屏界面超时时间

    微软于 Windows 8 开始推出了新的锁屏特性,并于 Windows 10 周年更新中进行了重大更新.虽然我们已经可以于锁屏界面使用 Cortana.查看各种系统或应用的提示信息.以及动态切换锁屏 ...

最新文章

  1. Windows保护模式学习笔记(十四)—— 阶段测试
  2. DOS命令行数据乱码解决
  3. Object.defineProperty 详解
  4. 《假如编程是魔法之零基础看得懂的Python入门教程 》——(七)我把魔法变成了积木
  5. 什么是股票的发行价和市价
  6. mysql 多点在 多边形,在MySQL中获取多点空间数据
  7. [转载] Python 中reduce()与lambda函数详解
  8. jdk的安装(redhat)
  9. Spring Cloud - Nacos 注册中心入门单机模式及集群模式
  10. Spring Boot
  11. Android蓝湖图片格式,蓝湖「自动切图」新增 JPG、PDF、WebP 格式
  12. 【软考-软件设计师精华知识点笔记】第三章 数据结构
  13. lucas–kanade_Lucas–Kanade
  14. java多种货币的相互转换_使用java将不同的国家货币转换为双倍
  15. 用html语言设计李白的一首诗,李白《赠汪伦》的教案设计
  16. opencv------图片转化为视频
  17. 河北工业职业技术学院计算机怎样,河北工业职业技术学院宿舍怎么样 住宿条件好不好...
  18. bugku 我永远喜欢穹妹
  19. 有趣的跳跃(循环判断)
  20. 八十二、ElasticSearch详解(下)

热门文章

  1. Excel输入分数的六种方法
  2. 【#9733;】微信之于QQ的市场哲学
  3. 一篇文章让你了解Android各个版本的历程
  4. 虚拟化服务--KVM虚拟机的使用与管理
  5. ipad pro键盘快捷键
  6. 如何将亚马逊广告添加到您的 WordPress 网站(3 种方法)
  7. 亚马逊echo中国使用_如何将您的Amazon Echo购物清单发送到您的电子邮件
  8. 计算机视觉的创新,谈计算机视觉课程的教学创新
  9. MT7621 IPSEC加密转发性能测试报告
  10. 汉诺塔代码执行的流程图