delphi文件无法拖拽功能失效


本文整理自网络,侵删。

 

delphi文件拖拽功能失效,原来是UAC系统权限把它过滤了

 

delphi 下搞不定谁有好方法麻烦分享一下。 QQ123691873


已经知道解决办法:如下:


ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);

ChangeWindowMessageFilter(WM_COPYDATA, MSGFLT_ADD);

ChangeWindowMessageFilter(WM_COPYGLOBALDATA , MSGFLT_ADD);



碰到这样一个问题,文件拖拽功能在没有以管理员身份运行的时候是正常的,但是一旦使用管理员身份运行,这个功能就失效了,搜索了好久总算找到原因了。

在window visa以上版本里引入了用户账户控制(UAC),在管理员权限上会过滤掉一些窗口消息,文件拖拽正好也也被过滤了,解决的方法就是使用ChangeWindowMessageFilterEx()解除过滤

//解除window7以上窗口对该消息的过滤
ChangeWindowMessageFilterEx(hwndDlg, WM_DROPFILES, MSGFLT_ALLOW, NULL);
ChangeWindowMessageFilterEx(hwndDlg, 0x0049, MSGFLT_ALLOW, NULL);//这句不详,但是没它不行

//ChangeWindowMessageFilterEx函数最低版本要window visa,所以要做版本校验

 

ChangeWindowMessageFilterEx 函数,为指定窗口修改用户界面特权隔离 (UIPI) 消息过滤器。

函数原型:

BOOL WINAPI ChangeWindowMessageFilterEx(

  __in HWND hWnd,

  __in UINT message,

  __in DWORD action,

  __inout_opt PCHANGEFILTERSTRUCT pChangeFilterStruct

  );

【参数】
hWnd
要修改其 UIPI 消息过滤器的窗口句柄。
message
要允许或阻止通过消息过滤器的消息。
action
要执行的操作,可以采取下列值之一:
MSGFLT_ALLOW :允许消息通过过滤器。允许窗口接收该消息,不管源消息是什么,甚至它来自一个低特权的进程。
MSGFLT_DISALLOW :如果消息来自低特权的进程,阻止它转递给窗口。
MSGFLT_RESET :为窗口重置消息过滤器为默认,任何全局允许消息或进程范围内的将通过。但不包含这两个类别,其中其中来自低特权的进程将被阻塞。
pChangeFilterStruct
指向CHANGEFILTERSTRUCT结构指针的可选项。
【返回值】
如果函数成功,则返回值为非零值。
如果该函数失败,则返回值为零。要获取扩展的错误的信息,请调用GetLastError 。

eg:
//用于取消低权限程序向高权限程序发送消息不成功的限制
BOOL bRes = ChangeWindowMessageFilterEx(m_hWnd, WM_COPYDATA, MSGFLT_ALLOW, NULL);


--------------------------------------------------------------------------------------------------------------------------------
        UIPI:用户界面特权隔离(User Interface Privilege Isolation),是 Windows 7 通过 MIC 机制新引入的一种安全特性,用于拦截接收比自身进程 MIC 等级低的进程发来的消息。UIPI 的目的是为了规范不同进程窗口之间的窗口消息处理过程,默认情况下,高权限进程不会接收到低权限进程发送的窗口消息的,但是低权限进程能够接收到高权限进程的窗口消息。UIPI 的本质是系统检查目标窗口和发送方是否具有相同的 MIC 等级或者发送方具有更高的 MIC 等级,如果符合上述条件,则允许消息的传递,否则将消息丢弃。
        因此,在 Windows 7 操作系统中运行的用户进程,如果运行时具有不同的完整性等级,即具有不同的 MIC 等级,那么相互间的通信将会无法像 Windows XP 那样正常进行。

        MIC:消息完整性检查(Message Integrity Check),是 Windows 7 增加的 Windows 安全对象访问控制安全机制,系统利用完整性级别对一个安全对象进行标记,通过降低进程的完整性级别可以限制其对安全对象的写入权限,这一点类似于用户帐户组的成员被限制访问系统组件这种方式。完整性检查机制使得用更少的权限或以更低的完整性级别运行一些程序,会降低进程修改系统或损害用户数据文件的可能性。在 Windows 7 中消息完整性检查分为 6 个等级,如下所示:
MIC等级
说明
SECURITY_MANDATORY_UNTRUSTED_RID
不信任的MIC等级
SECURITY_MANDATORY_LOW_RID
低MIC等级,如IE
SECURITY_MANDATORY_MEDIUM_RID
中MIC等级,默认为这个等级,如Explorer
SECURITY_MANDATORY_HIGH_RID
高MIC等级,以管理员身份运行的程序
SECURITY_MANDATORY_SYSTEM_RID
系统MIC等级,一般是服务应用程序
SECURITY_MANDATORY_PROTECTED_PROCESS_RID
被保护进程的MIC等级

相关阅读 >>

Delphi 取得ie下面输入框内容

Delphi 中的哈希表: thashedstringlist

Delphi access 导出 excel 表格

Delphi 调用cmd获取java 版本号

winapi 字符及字符串函数(9): lstrcat - 合并字符串

Delphi 用代码实现为程序创建快捷方式的二种方法

Delphi idhttp控件学习(图片下载)

Delphi最简化异步选择tcp服务器

Delphi下的字符串分隔函数的一种用法

Delphi idhttp1下载文件防止假死

更多相关阅读请进入《Delphi》频道 >>



打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...