2009-10-09 77 views
2

我遇到目前正在处理的程序存在问题。这是由vista/Windows 7中增加的安全性引起的,尤其是UIPI,它可以防止较低完整性级别的窗口“与较高级别”通话。访问外部窗口句柄

在我的情况下,我想告诉窗口具有较高的完整性级别以进入我们的应用程序,它可以在XP或Windows 7上安全无瑕地工作。

我试图直接设置较高的IL窗口的HWND,而不是使用findwindow()函数,这工作正常,但程序然后尝试移动或通常与其交互失败。窗口句柄由应用程序保存以嵌入并由在较低IL处运行的应用程序读取。

我也尝试在清单中将UIaccess设置为TRUE并对程序进行数字签名,但没有运气。

关于如何解决这个问题的任何想法? 谢谢。

回答

3

只是想到我会跟随这一点,因为任何人也挣扎,因为我终于找到了一种方法来做到这一点。

IL =完整性等级。

我有2个应用程序,highIL.exe和lowIL.exe,highIL想要找到lowIL.exe窗口,将其设置为子窗口并将其移动到为highIL.exe创建的区域。这在Vista中被UIPI阻止。

最后,我使用了Vista中的ChangeWindowMessageFilter方法和Windows7中的ChangeWindowMessageFilterEx,它们都在user32.dll中。这些功能允许您在UIPI中插入一个洞来允许您想要的消息。

我使用RegisterWindowMessage功能,我使用该功能来注册在两个highIL和lowIL应用的方法创建了一些自定义消息,线看起来有点像这样:

const UINT MY_MOVEINTWINDOW_MSG = RegisterWindowMessage(_T("MyMsg.MoveWindow")); 

的lowIL.exe然后能够将这些消息发送到highIL.exe窗口而不被阻止。然后,它只是简单地添加和编写消息处理程序。

只有当你有权访问高低IL时,此方法才有效。 MSDN也有ChangeWindowMessageFilterEx函数的工作示例Website