工作中有个需求是禁止文件进行另存,想着直接把另存弹窗给他关闭就行了,这里记录一下
分为两个步骤:
1.找到另存弹窗
我们可以借助Windows API函数 FindWindow
或 FindWindowEx
来获取另存弹框的句柄。
这两个函数的区别在于,FindWindow
只能查找顶层窗口,而 FindWindowEx
可以查找子窗口。
WINAPI
FindWindowW(
_In_opt_ LPCWSTR lpClassName,
_In_opt_ LPCWSTR lpWindowName);
#ifdef UNICODE
#define FindWindow FindWindowW
#else
#define FindWindow FindWindowA
#endif // !UNICODE
FindWindow
函数需要传入两个参数,分别是窗口类名和窗口名称,类名我们选择不填,这样可以查找窗口名称为另存为的所有弹窗
QString windowname(QStringLiteral("另存为"));
HWND hwnd = FindWindow(NULL,(LPCWSTR)windowname.unicode());
这里需要注意LPCWSTR是一个常量指针,在这里必须要进行强制转换,负责QT会报错
2.通过SendMessage函数向另存弹窗发送关闭消息,使其关闭
SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
这里我写了一个QT的例子
在pro文件中加入
win32{
LIBS += -luser32
}
mainwindow.h
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void closeSaveASForm();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <Windows.h>
#include <QDebug>
#include <WinUser.h>
#include <QPushButton>
#include "CommCtrl.h"
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QPushButton * btn = new QPushButton(this);
btn->setText(QStringLiteral("按钮"));
btn->move(200,200);
connect(btn, &QPushButton::clicked, this, &MainWindow::closeSaveASForm);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::closeSaveASForm()
{
QString windowname(QStringLiteral("另存为"));
HWND hwnd = FindWindow(NULL,(LPCWSTR)windowname.unicode());
if (hwnd == NULL) {
// 没有找到另存弹框
} else {
//关闭另存弹窗
SendMessage(hwnd, WM_SYSCOMMAND, SC_CLOSE, 0);
}
}