首先说移到屏幕上方是在windows上操作的,所以必须用到windows自己的api,这里用到了Windows的钩子函数:

HHOOK WINAPI SetWindowsHookEx(
__in int idHook, \钩子类型
__in HOOKPROC lpfn, \回调函数地址
__in HINSTANCE hMod, \实例句柄
__in DWORD dwThreadId); \线程ID

我的系统环境是win10 x64,使用上面的函数需要包含User32.lib 我的pro文件里这么写的:
LIBS += $$quote(C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Lib\x64\User32.Lib)
其他的没啥要注意的了,下面是代码:

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <Windows.h>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE//typedef LRESULT(*mouseProc)(INT nCode, WPARAM wParam, LPARAM lParam);
class MainWindow : public QMainWindow
{Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr);~MainWindow();static LRESULT mouseProc(int nCode, WPARAM wParam, LPARAM lParam);static QWidget *currentWidget;static bool bHide;static bool bShow;
public slots:void on_pushButton_clicked();private:Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QScreen>
#include <QPropertyAnimation>
HHOOK mouseHook = NULL;
QWidget *MainWindow::currentWidget = NULL;
bool MainWindow::bHide = false;
bool MainWindow::bShow = false;MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);this->move(1580, 0);
}MainWindow::~MainWindow()
{if (nullptr != mouseHook){UnhookWindowsHookEx(mouseHook);mouseHook = nullptr;}delete ui;
}LRESULT MainWindow::mouseProc(int nCode, WPARAM wParam, LPARAM lParam)
{if (nCode < 0){return CallNextHookEx(mouseHook, nCode, wParam, lParam);}if (nCode == HC_ACTION) //当nCode等于HC_ACTION时,要求得到处理{if (wParam == WM_MOUSEMOVE) //屏蔽鼠标的移动{QPoint point = QCursor::pos();QSize size = qApp->screens().first()->size();if (QRect(0, 0, size.width(), 100).contains(point)){if (bShow){return CallNextHookEx(mouseHook, nCode, wParam, lParam);}QPropertyAnimation *pPosAnimation1 = new QPropertyAnimation(currentWidget, "geometry");pPosAnimation1->setDuration(500);pPosAnimation1->setStartValue(QRect(1580, -110, 400, 100));pPosAnimation1->setEndValue(QRect(1580, 0, 400, 100));pPosAnimation1->start();currentWidget->show();bShow = true;bHide = false;}else{if (bHide){return CallNextHookEx(mouseHook, nCode, wParam, lParam);}QPropertyAnimation *pPosAnimation1 = new QPropertyAnimation(currentWidget, "geometry");pPosAnimation1->setDuration(500);pPosAnimation1->setStartValue(QRect(1580, 0, 400, 100));pPosAnimation1->setEndValue(QRect(1580, -110, 400, 100));pPosAnimation1->start();bHide = true;bShow  = false;}//return true;//如果是这些事件产生的话,就返回真,即屏蔽掉这些事件,也就是安装有同类型的其他钩子,捕获不到同样的事件}//        if (wParam == WM_MOUSEWHEEL //屏蔽滑轮//            || wParam == WM_RBUTTONDOWN //屏蔽鼠标右键按下//            || wParam == WM_LBUTTONDOWN //屏蔽鼠标左键按下//            || wParam == WM_RBUTTONUP //屏蔽鼠标右键弹起的消息//            || wParam == WM_LBUTTONUP //屏蔽鼠标左键弹起的消息//            || wParam == WM_MOUSEMOVE) //屏蔽鼠标的移动//        {//            return true;//如果是这些事件产生的话,就返回真,即屏蔽掉这些事件,也就是安装有同类型的其他钩子,捕获不到同样的事件//        }}return CallNextHookEx(mouseHook, nCode, wParam, lParam);
}void MainWindow::on_pushButton_clicked()
{currentWidget = this;mouseHook = SetWindowsHookEx(WH_MOUSE_LL, MainWindow::mouseProc, GetModuleHandle(NULL), 0); //注册鼠标钩子
}

使用时注意return CallNextHookEx(mouseHook, nCode, wParam, lParam); 千万别直接true,会让你电脑变傻的

Qt实现类似金山快译那种鼠标移到上方移动滑出的窗口(钩子函数)相关推荐

  1. 实现金山快译工具条的自动收缩功能

    使用了二个API: GetCursorPos(lpPoint As POINTAPI) as Long ScreenToClient(ByVal hwnd As Long, lpPoint As PO ...

  2. 金山快译 2007 下载-个人收藏专业版

    金山快译2007下载版客户端 http://dl2.it168.com/1809/IT168.com-15404FastAIT2007_2.rar   请点击右边下载 若不能正常下载请留言 电信下载 ...

  3. VC++实现全局钩子勾住textout金山快译的原理实现

    分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章.分享知识,造福人民,实现我们中华民族伟大复兴! 大家都对 ...

  4. win7下QQ2011隐藏后,鼠标移桌面边缘 QQ滑出来后又自动收进去了解决方法

    我是联想ThinkPad SL410K的本本,这本本问题还不少呢,我装的是windows7 旗舰版,安装QQ2011后,QQ在桌面边缘隐藏后,鼠标移过去QQ滑出来后又自动收进去了,哎,这个问题真是烦人 ...

  5. 用Delphi实现Windows的鼠标钩子函数

    用Delphi实现Windows的鼠标钩子函数 Delphi是基于PASCAL语言的Windows编程工具,功能十分强大.然而在Delphi的帮助 文件中,对Windows API函数的说明沿袭了 V ...

  6. div 鼠标移入滑入滑出

    效果:原始样子 当鼠标移入div向右滑出: 当鼠标移开,div向左滑入: //1.先设置一个div,里面放入一张图片, //注意div样式里需设置 position:absolute;必须设置 //原 ...

  7. 金山快盘使用的一些注意

    最近开始使用金山快盘,台式和笔记本共享,还是挺方便,但也有一些事情需要注意. 1 最好不要放那种很多小文件的目录,如果备份,建议压缩后备份,否则同步速度太慢了. 2 U盘模式可以加密,但是不能本地访问 ...

  8. 利用金山快盘和TortoiseSVN搭建自己的svn服务器

    安装搭建环境: 1.下载安装金山快盘和TortoiseSVN  2.在金山快盘目录下建立svn_repository(随意),右键选择TortoiseSVN->Create repository ...

  9. 简陋而又粗鄙的金山快盘

    简陋而又粗鄙的金山快盘 金山公司于近期推出了金山快盘.我试用了一下,主界面如下: 图1 主界面右上方的"正在传输"."历史记录"."保护设置" ...

最新文章

  1. SAP MM 事务代码MI31之思考之续集
  2. AndroidManifest.xml配置详解
  3. 最近在学OpenGL和英语
  4. 【图像分类】从数据集和经典网络开始
  5. String比较? 用==判断两个字符串,有时为true有时为false
  6. Android 解决: Failed to resolve: com.android.support:appcompat-v7:28.+ 错误
  7. 物联网技术周报第 143 期: Unity 3D 和 Arduino 打造虚拟现实飞行器
  8. HTTP与HTTPS区别(详细)
  9. Mybatis Generator 配置详解
  10. gdb 7.X 下载编译(aarch64)
  11. 【Django】Specifying a namespace in include() without providing an app_name is not supported
  12. 杭电ACM2000题
  13. java基础习题_Java基础知识练习题及答案
  14. 软考中级软件设计师--13.数据结构与算法
  15. 显卡识别为Microsoft基本显示适配器,安装9700k核芯显卡HD630驱动或安装其他核显驱动
  16. html调用zblog文章,自定义调用ZBLOG分类页、内容页模板
  17. java题目练习笔记,java 20道、数量关系8道、判断推理8道、智力题8道
  18. 客户体验决胜2022,低代码是快速取胜之道
  19. java crumb_vuex中,我在index.vue组件设置的值,为什么在另外一个组件crumb.vue获取不到...
  20. C语言 进阶版三子棋小游戏

热门文章

  1. oracle创建job和删除job
  2. 如何在3dMax 中为模型赋予材质教程
  3. 聚合码支付制作思路和流程
  4. wifi万能钥匙也出自媒体平台了!
  5. 常用资料备查(3)-A股历史中的高分红股
  6. mac 下mysql客户端安装
  7. Gavin老师Transformer直播课感悟 - 基于Transformer的Rasa Internals解密之全新一代可伸缩DAG图架构(四)
  8. hadoop安装(三台虚拟机)一些常见问题
  9. 48个国际音标的学习和输入
  10. 网上PPT模板资源搜集整理