首先说移到屏幕上方是在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_OBJECT
public:
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,会让你电脑变傻的