WIN7/8系统下程序接收不到WM_COPYDATA 消息的原因和解决

在WIN7/win8,如果发送消息的程序用户权限低于和接收消息的程序,则消
息无法传递。发送程序必须等于或者等于接收程序的权限。如发送与接收
是同一个用户,或者发送是管理员帐户,接收是是普通用户,这样就可以
成功。

以下内容摘自: http://blog.csdn.net/tian_jinping/article/details/12950077

正如我们前文所说,等级的划分,是为了防止以下犯上。所以,有了用户
界面特权隔离,一个运行在较低特权等级的应用程序的行为就受到了诸多
限制,它不可以:
  验证由较高特权等级进程创建的窗口句柄
  通过调用SendMessage和PostMessage向由较高特权等级进程创建的窗
口发送Windows消息
  使用线程钩子处理较高特权等级进程
  使用普通钩子(SetWindowsHookEx)监视较高特权等级进程
  向一个较高特权等级进程执行DLL注入
  但是,一些特殊Windows消息是容许的。因为这些消息对进程的安全性
没有太大影响。这些Windows消息包括:
  0x000 - WM_NULL
  0x003 - WM_MOVE
  0x005 - WM_SIZE
  0x00D - WM_GETTEXT
  0x00E - WM_GETTEXTLENGTH
  0x033 - WM_GETHOTKEY
  0x07F - WM_GETICON
  0x305 - WM_RENDERFORMAT
  0x308 - WM_DRAWCLIPBOARD
  0x30D - WM_CHANGECBCHAIN
  0x31A - WM_THEMECHANGED
  0x313, 0x31B (WM_???)
  修复UIPI问题
  基于Windows Vista之前的操作系统行为所设计的应用程序,可能希望
Windows消息能够在进程之间自由的传递,以完成一些特殊的工作。当这些
应用程序在Windows 7上运行时,因为UIPI机制,这种消息传递被阻断了,
应用程序就会遇到兼容性问题。为了解决这个问题,Windows Vista引入了
一个新的API函数ChangeWindowMessageFilter。利用这个函数,我们可以
添加或者删除能够通过特权等级隔离的Windows消息。这就像拥有较高特权
等级的进程,设置了一个过滤器,允许通过的Windows消息都被添加到这个
过滤器的白名单,只有在这个白名单上的消息才允许传递进来。
  如果我们想容许一个消息可以发送给较高特权等级的进程,我们可以
在较高特权等级的进程中调用ChangeWindowMessageFilter函数,以
MSGFLT_ADD作为参数将消息添加进消息过滤器的白名单。同样的,我们也
可以以MSGFLT_REMOVE作为参数将这个消息从白名单中删除。例如:
在dtssm的主窗口中添加如下调用即可。
[DllImport("user32")]
public static extern bool ChangeWindowMessageFilter(uint msg, int
flags);

private void MainForm_Load(object sender, EventArgs e)
{
ChangeWindowMessageFilter(WM_COPYDATA, 1);
...
}

原文地址:https://www.cnblogs.com/elonlee/p/3833539.html