zoukankan      html  css  js  c++  java
  • 管理员权限的窗口,收不到WM_COPYDATA

    windows用户界面特权隔离
    一个运行在较低特权等级的应用程序的行为就受到了诸多限制,它不可以:
      验证由较高特权等级进程创建的窗口句柄
      通过调用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

    修复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);
    }

  • 相关阅读:
    代码 技术债务 打分
    C++ boost coroutine
    什么是 Python Django Flask &Tornado
    Quartz应用与集群原理分析
    和开源产品对比
    Apache Storm || Processing real-time data
    认清自我,不在迷茫 程序员
    快速傅里叶变换算法
    Netty和Tomcat的区别、性能对比
    HTTP vs. MQTT ->TCP
  • 原文地址:https://www.cnblogs.com/Mojito2020/p/13713011.html
Copyright © 2011-2022 走看看