• 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);
    ...
    }

  • 相关阅读:
    django LDAP
    Python egg
    皮皮书屋
    Linux运维
    bash shell 快捷键汇总
    linux ldconfig
    Linux set env export declare unset
    OpenStack
    【LeetCode】258. Add Digits
    一个"Median Maintenance"问题
  • 原文地址:https://www.cnblogs.com/elonlee/p/3833539.html
Copyright © 2020-2023  润新知