click to login
某不知名程序员的网上巢穴。稍安勿躁,正在开发。

管理员权限程序进程无法接收拖拽消息

在开启 UAC 的 Win7 及以上操作系统中对程序使用最高权限执行时,常会发现其无法接收外部对其发送的文件拖拽消息。比如说 Kernel-Mode Driver Manager 进行驱动加载时会遇到此问题。

UAC 下最高权限的 KMDM 无法拖拽文件路径

这其实不是系统的"BUG",而是 Windows 中 UAC 的一种新的保护机制。Windows 为了进程的安全性,对外部传入的消息进行了选择性的屏蔽。较低权限无法对高权限进程发送一些特殊的消息。其中就包括这里的文件拖拽消息: WM_DROPFILES 。

对别人发布的程序没有什么解决途径,但是在我们自己编写的程序中,有解决这个问题的方法。微软提供了函数:

BOOL ChangeWindowMessageFilter(
  __in  UINT message,
  __in  DWORD dwFlag
);

看 MSDN 中对此函数的解释:

Adds or removes a message from the User Interface Privilege Isolation (UIPI) message filter.

“从用户接口权限隔离(UIPI)消息过滤器添加或删除一个消息。”通过这个函数,为我们编写的程序在消息过滤添加通过的规则。以下是添加在程序中的代码。其中第一行是添加拖拽消息的,第二句添加一个未公开的规则。这两句必须同时作用。

ChangeWindowMessageFilter(WM_DROPFILES, MSGFLT_ADD);
ChangeWindowMessageFilter(0x0049, MSGFLT_ADD); //0x0049==WM_COPYGLOBALDATA

在 MSDN 中对该函数的表述中,微软表示不建议开发者继续在工程中使用该函数,而可以使用另一个函数 ChangeWindowMessageFilterEx 来代替。关于这个函数的用法,各位可自行参悟。在这里就懒得介绍了。

ChangeWindowMessageFilter 档案
头文件:Winuser.h (包含 Windows.h)
静态库:User32.lib
动态库:User32.dll

MSDN 中关于该函数的解释:http://msdn.microsoft.com/zh-cn/office/ms632675

1 个回答

  1. 试了好多个代码高亮插件。。都不好用。。。还是用默认的格式吧。

评论:

版权所有 © 2010-2016 小刀志 · 本站基于 WordPress 构建 · 原创内容转载请取得作者同意和授权