c++ 如何关闭windows系统的窗口

工作中有个需求是禁止文件进行另存,想着直接把另存弹窗给他关闭就行了,这里记录一下

分为两个步骤:

1.找到另存弹窗

我们可以借助Windows API函数 FindWindowFindWindowEx 来获取另存弹框的句柄。

这两个函数的区别在于,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);
    }
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值