我当前正在处理的程序有问题。这是由于 vista/Windows 7 中增强的安全性引起的,特别是 UIPI,它阻止完整性级别较低的窗口与较高完整性级别的窗口“对话”。
就我而言,我想告诉具有高完整性级别的窗口进入我们的应用程序,它可以在 XP 或 Windows 7 上完美运行,并且安全性关闭。
我尝试直接设置较高 IL 窗口的 HWND,而不是使用 findwindow() 函数,这工作正常,但在尝试移动它或通常与其交互时程序会失败。窗口句柄由应用程序保存,以供运行在较低 IL 的应用程序嵌入和读取。
我还尝试将 list 中的 UIaccess 设置为 TRUE 并对程序进行数字签名,但没有成功。
关于如何解决这个问题有什么想法吗? 谢谢。
最佳答案
只是想我会为那些也遇到困难的人跟进这个问题,因为我终于找到了一种方法来做到这一点。
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 上还有 ChangeWindowMessageFilterEx 函数的工作示例 Website
关于c++ - 访问外部窗口句柄,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1542675/