繁体   English   中英

在没有管理员权限的情况下从桌面应用访问OSK(屏幕键盘)句柄

[英]Access OSK(on screen keyboard) handle from desktop app without administrator rights

我有一个在Windows 7和8上没有管理员权限运行的桌面delphi应用程序。该应用程序需要将(SendInput)鼠标事件(单击并移动)发送到另一个正在运行的应用程序。 此应用程序的工作方式类似于远程wifi笔的驱动程序,可控制鼠标移至桌面。 当焦点位于OSK(在屏幕键盘上)上时,鼠标按下左键移动不起作用,osk窗口不移动,所有其他应用程序在收到这些mouve事件时都移动。 我可以处理OSK。 当我以管理员权限(UAC)运行我的应用程序时,一切正常,当应用程序发送Mouve Envets时,OSK移动。 我认为该问题与UAC有关。 我找到了一种绕过UAC的方法,例如http://www.thewindowsclub.com/create-elevated-shortcut-run-programs-bypass-uac ,但在某些环境中并不是一个好主意。 有没有一种方法可以绕过UAC而无需地下方法? 或者如何强制OSK对发送给他的所有鼠标事件做出响应。


这是嵌入在Osk.exe中的清单的一个片段:

<trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
  <security>
    <requestedPrivileges>
      <requestedExecutionLevel level="asInvoker" uiAccess="true"/>
    </requestedPrivileges>
  </security>
</trustInfo>

需要注意的level ,它要求,asInvoker 要求UAC提升,只有requireAdministrator一样。 换句话说,它以启动程序具有的任何特权运行。 您可以说,启动Osk.exe时没有得到同意提示

此处重要的是uiAccess 将其设置为true时 ,程序将绕过UIPI。 UAC鲜为人知的双胞胎用户界面特权隔离通过不允许另一个进程将键盘敲击和鼠标单击戳入高架应用程序所拥有的窗口中来防止遭受破坏攻击。 这样的过程仍在高完整性模式下运行,这就是为什么您不能自己戳入Osk,但没有启用使UAC提升的应用程序变得危险的特权。

这并不罕见,大多数使用UI自动化或提供可访问性功能的程序都必须能够做到这一点。 与Osk.exe一样,它需要能够将击键击入任何应用程序。 显然,您也想做什么。

获取uiAccess不需要用户像UAC提升一样同意提示。 操作系统必须“信任”您。 MSDN这篇文章的 “用于UI自动化应用程序的UIAccess”一节中对此进行了很好的介绍。 我在这里总结一下:

  • 在应用清单中设置uiAccess =“ true”
  • 您的可执行文件必须具有有效的数字证书,即您从Verisign等供应商处购买的证书。
  • 您的可执行文件必须存储在c:\\ program文件或c:\\ windows子目录下的拒绝写访问的目录中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM