访问外部窗口句柄

时间:2009-10-09 08:59:27

标签: c++ windows-7 windows-vista uipi

我正在处理我正在处理的程序有问题。它是由vista / Windows 7中增加的安全性引起的,特别是UIPI阻止了具有较低完整性级别的窗口“与较高级别”进行对话。

在我的情况下,我想告诉具有高完整性级别的窗口进入我们的应用程序,它在XP或Windows 7上完美运行,安全性关闭。

我已经尝试直接设置较高IL窗口的HWND,而不是使用findwindow()函数,这可以正常工作,但程序在尝试移动它或通常与它交互时失败。窗口处理程序由应用程序保存,以便在较低的IL运行的应用程序中嵌入和读取。

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

有关如何解决此问题的任何想法? 感谢。

1 个答案:

答案 0 :(得分: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和低IL时才有效。 MSDN还有Website上的ChangeWindowMessageFilterEx函数的工作示例