尝试为我的屏幕保护程序显示配置窗口的问题(来自以高强制完整性级别运行的GUI应用程序)

我有一个带有自己的屏幕保护程序的旧项目。 该项目的GUI应用程序有一个“配置屏幕保护程序”选项,它应该显示我的屏幕保护程序配置窗口(通常从控制面板 – >显示 – >个性化 – >屏幕保护程序 – >设置。)

要显示配置窗口,需要使用/c参数调用屏幕保护程序进程,如此处所述 。 屏幕保护程序本身放在系统目录中,即"C:\Windows\System32"

因此,要从我的(32位)GUI应用程序模拟这个,我执行以下操作:

 //Error checks are omitted for brevity BOOL bResult = FALSE; TCHAR buffSysFldr[MAX_PATH]; buffSysFldr[0] = 0; ::GetSystemDirectory(buffSysFldr, SIZEOF(buffSysFldr)); //Make the path, which basically becomes: // "C:\Windows\System32\mysvr.scr" /c TCHAR buff[MAX_PATH]; buff[0] = 0; ::StringCbPrintf(buff, sizeof(buff), L"\"%s\\mysvr.scr\" /c", buffSysFldr); STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; ZeroMemory(&si,sizeof(si)); ZeroMemory(&pi,sizeof(pi)); si.cb = sizeof(si); PVOID OldValue; Wow64DisableWow64FsRedirection(&OldValue); //And run it if(CreateProcess(NULL, buff, NULL, NULL, FALSE, NORMAL_PRIORITY_CLASS | CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) { //Success bResult = TRUE; } Wow64RevertWow64FsRedirection(OldValue); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); 

当我将它部署到Windows 7机器时,上面的代码返回bResult = TRUE但我的屏幕保护程序的配置窗口永远不会显示。

我试着在32位和64位Windows 7上认为Wow64重定向与它有关,但它仍然没有改变结果。

知道为什么这不起作用吗?

PS。 当我将该命令复制并粘贴到命令提示符时,它运行正常并显示我的配置窗口没有问题:

在此处输入图像描述

编辑:进一步审查后,事实certificate这个问题似乎与我的GUI应用程序以高强制完整性级别或S-1-16-12288运行这一事实有关 ,这似乎是屏幕保护程序配置窗口的原因没有显示。 如果我使用常规的中等完整性级别或S-1-16-8192运行我的GUI应用程序,配置窗口将显示OK。

否则,我可以看到我的屏幕保护程序的RegisterDialogClasses方法被称为OK,但是当我从它返回TRUE时,从不调用ScreenSaverConfigureDialog 。

由于引入了完整性级别以防止具有较低级别的进程将消息发送到具有较高级别的进程,显然屏幕保护程序配置机制尝试向我的GUI应用程序发送一些消息(无论出于何种未记录的原因)并且失败然后静默失败。 。

所以这是最新的。 我会感谢任何知道如何解决这个问题的人的任何意见(除了降低我的GUI应用程序的完整性级别,我显然不想这样做。)

该死的微软文档 (对不起,我今天只是浪费了一整天来试图修复它。)

对于其他任何人遇到这个 – 事实certificate,人们需要这样称呼它:

“C:\ Windows \ System32 \ mysvr.scr”/ c:N

其中N是父窗口的窗口句柄,表示为整数。 通过检查通过控制面板显示的配置窗口的命令行找到它(使用Process Explorer做到了。)

就我而言,由于我的GUI流程以更高的完整性级别运行,因此执行以下操作就足够了:

 HWND hWndToUse = ::GetDesktopWindow(); ::StringCbPrintf(buff, sizeof(buff), L"\"%s\\mysvr.scr\" /c:%d", buffSysFldr, (int)hWndToUse); 

就是这样!