找回密码
 立即注册
收起左侧

dropEvent在UAC下无效的问题

1
回复
8670
查看
[复制链接]

尚未签到

来源: 2017-12-25 19:49:30 显示全部楼层 |阅读模式
8Qter豆
我写了一个窗口,并根据dropEvent打开了拖拽入界面的文件。
整个程序在普通用户模式下正常使用。但在 win7 以后的系统上,如果开启了 UAC控制,则如果用管理员用户运行程序,不能接受到 dropEvent。

我尝试过
ChangeWindowMessageFilterEx((HWND)this->winId(), WM_DROPFILES, MSGFLT_ALLOW, NULL);
以及 manifest 的 uiAccess='true' ,都不能解决问题。

第一种方法调用成功,返回 true,但仍然不能接收到 dropEvent。
第二种方法设置成功,也同样不能接收到。

回复

使用道具 举报

累计签到:1 天
连续签到:1 天
2018-3-9 00:45:45 显示全部楼层
因为Explorer是低权限程序,自然不能向高权限程序发送请求。不过我记得高权限程序,可以提前调用一个API函数,就可以接受了。

实现在vista和win7中使用管理员权限接收WM_DROPFILES(OnDropFiles())消息的方法(XP不支持这个函数)
#pragma once

#ifndef WM_COPYGLOBALDATA
#define WM_COPYGLOBALDATA 0x0049
#endif

typedef WINUSERAPI BOOL WINAPI CHANGEWINDOWMESSAGEFILTER(UINT message, DWORD dwFlag);

//修复OnDropFile在win7管理员权限下接收不到的问题
void DropFileFix()
{
HINSTANCE hDllInst = LoadLibrary(_T("user32.dll"));
if (hDllInst)
{
CHANGEWINDOWMESSAGEFILTER *pAddMessageFilterFunc = (CHANGEWINDOWMESSAGEFILTER *)GetProcAddress(hDllInst, "ChangeWindowMessageFilter");
if (pAddMessageFilterFunc)
{
pAddMessageFilterFunc(WM_DROPFILES, MSGFLT_ADD);
pAddMessageFilterFunc(WM_COPYDATA, MSGFLT_ADD);
pAddMessageFilterFunc(0x0049, MSGFLT_ADD);
}
FreeLibrary(hDllInst);
}
}
在程序入口或对话框初始化函数中调用DropFileFix() 即可解决vista和win7中使用管理员权限接收不到WM_DROPFILES(OnDropFiles())消息的问题。

http://blog.csdn.net/ningbinzhang/article/details/39956801
https://blog.twofei.com/602/
http://blog.sina.com.cn/s/blog_6294abe70101bko6.html
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了