Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >管理员权限下QT进程无法接受拖拽问题

管理员权限下QT进程无法接受拖拽问题

原创
作者头像
lealc
修改于 2024-06-08 07:22:37
修改于 2024-06-08 07:22:37
8940
举报

背景

由于资源管理器是以普通权限启动,而管理员权限启动的qt进程,权限较高导致qt的setAcceptDrops(true)后依然无法触发dropEvent,导致无法接受其它程序或者资源管理器拖拽过来的文件。

解决思路

通过windows原生的事件过滤器来解决,屏蔽掉qt自带的拖拽事件过滤器,创建主窗口后启动原生事件过滤

代码语言:C++
AI代码解释
复制
void EnableDrag(QMainWindow& w) {
    ChangeWindowMessageFilter(WM_DROPFILES, 1);

    w.winId() << w.effectiveWinId();
    ChangeWindowMessageFilterEx((HWND)w.effectiveWinId(), WM_DROPFILES, MSGFLT_ALLOW, NULL);
    ChangeWindowMessageFilterEx((HWND)w.effectiveWinId(), WM_COPYDATA, MSGFLT_ALLOW, NULL);
    ChangeWindowMessageFilterEx((HWND)w.effectiveWinId(), 0x0049, MSGFLT_ALLOW, NULL);

    DragAcceptFiles((HWND)w.effectiveWinId(), true);
    RevokeDragDrop((HWND)w.winId());
}

{
  QMainWindow w;
  EnableDrag(w);
  w.setAcceptDrops(true);
  w.show();
  a.exec();
}

此时窗口已经可以接受拖拽了,重载主窗口的nativeEvent即可

代码语言:C++
AI代码解释
复制
bool QMainWindow::nativeEvent(const QByteArray& eventType, void* message, long* result) {
    if (eventType == "windows_generic_MSG" || eventType == "windows_dispatcher_MSG") {
        MSG* pMsg = reinterpret_cast<MSG*>(message);
        if (pMsg->message == WM_DROPFILES) {
            HDROP hDropInfo = (HDROP)pMsg->wParam;
            wchar_t szFilePathName[_MAX_PATH] = { 0 };
            const UINT nNumOfFiles = DragQueryFile(hDropInfo, 0xFFFFFFFF, NULL, 0);
            if (nNumOfFiles > 0) {
                // DragQueryFile第二个参数为拖入文件的索引
                DragQueryFile(hDropInfo, 0, szFilePathName, _MAX_PATH); //直接取第一个 入参UINT iFile  = 0
                const QString currentfile = QString::fromWCharArray(szFilePathName);
                // currentfile 为当前拖拽文件
                // OnDragFinished(currentfile);
            }
            DragFinish(hDropInfo);
        }
    }
    return false;
}

注意:

1、这里winId()拿到的窗口id可能无效,导致拖拽事件未挂载成功,可以使用QTimer延时一会去挂载拖拽事件即可

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【第3版emWin教程】第44章 emWin6.x窗口管理器官方实例简单讲解
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第44章 emWin6.x窗口管理器官方实例简单讲解 为了帮
Simon223
2021/10/09
1.2K0
【Qt源码笔记】从WinMain说起
Qt在各个平台下都是对平台API进行了一些包装。Windows下是对Win32API的封装。如果是Windows平台的GUI Application就一定是从WinMain开始。
Harper
2021/07/27
1.1K0
【第3版emWin教程】第46章 emWin6.x窗口管理器之ToolTip的使用
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第46章 emWin6.x窗口管理器之ToolTip的使用
Simon223
2021/10/09
5980
17.QT-事件处理分析、事件过滤器、拖放事件
Qt事件处理介绍 Qt平台会将系统产生的消息转换为Qt事件 Qt事件是一个QEvent的对象 Qt事件用来描述程序内部或外部发生的动作 任意的QObject对象都具备事件处理的能力 Qt常见的事件继承
诺谦
2018/05/28
1.7K0
【QT】Qt 窗口 (QMainWindow)
QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了一个预定义的布局。QMainWindow 包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个浮动窗口(铆接部件)(dock widgets)、⼀个状态栏(status bar) 和⼀个 中心部件(central widget),它是许多应用程序的基础,如文本编辑器,图片编辑器等。如下图为 QMainwindow 中 各组件所处的位置:
YoungMLet
2024/07/16
1.1K0
【QT】Qt 窗口 (QMainWindow)
【Qt源码笔记】Qt事件与Windows消息循环的联系
上次研究了一下Qt是如何对Win32初始化程序进行包装的。这次研究下Qt的事件循环和Windows消息循环之间的联系。
Harper
2021/07/27
2.7K0
【第3版emWin教程】第55章 emWin6.x按钮Button控件自定义回调函数,实现各种按钮效果
本章节为大家讲解按钮控件自定义回调函数,通过其回调函数就可以实现各种按钮效果。这方面的问题也是经常有初学者问,所以专门做一期教程。
Simon223
2022/03/10
1.2K0
【第3版emWin教程】第55章       emWin6.x按钮Button控件自定义回调函数,实现各种按钮效果
【第3版emWin教程】第48章 emWin6.x对话框基础知识
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第48章 emWin6.x对话框基础知识 上个章节为大家普及
Simon223
2021/10/09
1.1K0
Windows SDK编程基本框架
在Windows平台下,最常见最流行的编程就是MFC编程了,在网上可以搜索出大把的MFC编程相关的文章,今天我们来讨论另外一种windows下的编程模式,即Windows SDK编程。这种编程具有更加灵活和强大的控制,能实现一些MFC不易实现甚至难以实现的功能。 所有的WindowsSDK编程都有一个类似的框架,本文就说说这个框架,Windows程序设计的框架分为“三部曲”: 注册窗口类 注册窗口类的API函数是RegisterClass或者RegisterClassEx,这两个函数参数区别不大,具
程序员互动联盟
2018/03/12
1.8K0
Windows SDK编程基本框架
MFC原理第六讲.消息传递
    通过上一讲我们的消息映射表.我们得知. 消息映射表 会保存父类的MessageMap 以及自己当前的消息结构体数组.
IBinary
2019/05/25
1.1K0
C++实现一键关闭桌面
本程序使用C语言编写,调用的Windows API,所以只能在windows上运行
芯动大师
2023/10/14
3560
C++实现一键关闭桌面
【第3版emWin教程】第45章 emWin6.x窗口管理器之定时器使用
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第45章 emWin6.x窗口管理器之定时器使用 本期教程为
Simon223
2021/10/09
1.2K0
DotNet4应用程序打包工具->升级版【二】安装工具分析
-------------------------------------------------------
liulun
2022/05/09
3780
DotNet4应用程序打包工具->升级版【二】安装工具分析
Qt学习之路_6(Qt局域网聊天软件)
http://www.cnblogs.com/tornadomeet/archive/2012/07/04/2576355.html
bear_fish
2018/09/20
3.5K0
Qt学习之路_6(Qt局域网聊天软件)
【第3版emWin教程】第42章 emWin6.x窗口管理器之回调消息类型
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第42章 emWin6.x窗口管理器之回调消息类型 本章节为
Simon223
2021/09/29
8870
【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
本系列博文几乎没有难啃的“专业术语”,尽量让读者能够看明白文章所述内容,是本系列博文的核心宗旨之一。(由于本人也是由于项目需要,所以才来查阅相关资料,文中出现的错误欢迎指出,共同进步!谢谢!)
1_bit
2020/10/23
1.6K0
【二】Windows API 零门槛编程指南——CreateWindow 窗口创建 “万字长篇专业术语全解”
VC++6.0入门——第九讲 定制应用功能程序外观
好事文章地址:https://cloud.tencent.com/developer/article/2470499
Arya
2024/12/03
1770
VC++6.0入门——第九讲 定制应用功能程序外观
【第3版emWin教程】第43章 emWin6.x窗口管理器实例(含自定义消息)
教程不断更新中:http://www.armbbs.cn/forum.php?mod=viewthread&tid=98429 第43章 emWin6.x窗口管理器实例(含自定义消息) 为
Simon223
2021/09/29
7050
Qt音视频开发27-Onvif设备搜索
最近业余时间主要研究音视频开发这块,前面的文章写了好多种视频监控内核,一旦将这些内核搞定以后,视频监控的相关功能水到渠成。做视频监控系统,绕不过onvif这玩意,这玩意主要就是为了统一一个大概的标准,能够对各个厂家的监控设备进行常用的一些操作,比如搜索、获取信息、云台控制、事件订阅、抓拍图片等,如果没有这个规范,那么各个厂家都各自为政,需要用私有的sdk去处理,这样就很麻烦很惨了,几十个厂家就需要几十个sdk,对于程序员来说简直是灾难,想想就很恐怖的事情,哪个程序员不想多活几年!
feiyangqingyun
2020/10/04
1.2K0
Qt音视频开发27-Onvif设备搜索
一种在注入进程中使用WTL创建无焦点不在任务栏出现“吸附”窗口的方法和思路
        最近一直在做沙箱项目,在项目快接近结尾的时候,我想给在我们沙箱中运行的程序界面打上一个标记——标识其在我们沙箱中运行的。我大致想法是:在被注入程序的顶层窗口上方显示一个“标题性”窗口,顶层窗口外框外显示一个“异形”的空心窗口。这些窗口如影子般随着其被“吸附”窗口移动而移动,大小变化而变化。(转载请指明出处)以记事本为被注入程序为例:
方亮
2019/01/16
1.6K0
推荐阅读
相关推荐
【第3版emWin教程】第44章 emWin6.x窗口管理器官方实例简单讲解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档