我在 Windows 7 PC 上使用 Miniframe 的“SoftXPand 2011 Duo”程序。它将一台计算机变成两个工作站。它使用 Windows 内置的终端服务来创建附加会话。我使用两个屏幕、两个键盘和两个鼠标来创建两台计算机的“幻觉”。它运行良好,我甚至可以在这台机器上的两个屏幕上玩两个不同的 3D 游戏(使用 Radeon HD5770 和 Core i5 2500k,配备 8 GB RAM)。
这有几个缺点。我刚发现一个乍一看就隐藏的缺点。你所在的会话(即使在第一个工作站上)将被识别为终端服务器会话!现在,一些程序将以有限的效果(图形)运行,而有些程序根本无法运行。
这也导致一些游戏根本无法运行。它们只是说“无法在终端服务器会话中运行”然后退出。我已经证明顶级现代游戏(DirectX 10、11)的运行效果与没有 SoftXPand 的同一台机器一样好,所以这是一个相当人为的限制!
那么,我能以某种方式破解我当前的会话,使它看起来不再像终端服务器会话吗?IE
#include <windows.h>
#pragma comment(lib, "user32.lib")
BOOL IsRemoteSession(void)
{
return GetSystemMetrics( SM_REMOTESESSION );
}
将返回 FALSE?(这不是编程问题!只是一个程序如何检测它们是否处于终端服务器会话中的示例!)
答案1
应用程序可以通过多种方式检查其是否在终端服务器会话中运行。其中一些方法您可以破解,如下所示:
- 註冊 :
HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server\TSAppCompat
。
此键在我的桌面上的正常会话中丢失了。
如果可以,您可以尝试将其删除。 - SESSIONNAME 环境变量值:控制台 / “RDP#” / (空)。您可以在执行(我的桌面值) 或(空)
后尝试从命令提示符 (cmd) 运行游戏。 要找出其当前值,请在更改任何内容之前输入。
SET SESSIONNAME=Console
SET SESSIONNAME=
SET SESSIONNAME
- 系统调用获取系统指标(SM_REMOTESESSION)和获取版本信息(操作系统版本信息.wSuiteMask) 返回执行上下文。
除了为它编写系统钩子外,你对此无能为力。
如果感兴趣,请参阅此 codeproject.com 文章:API 挂钩揭秘。
答案2
我找到了一个解决方案:通过“runas”运行你想要的程序
通过桌面登录后,在cmd中输入:
runas /user:您的名称“您的程序路径”
我根据 Bently 的软件对其进行了测试,它们确实运行良好。
答案3
我使用的是 Microsoft 远程桌面,我尝试了 @harrymc 发布的前两种方法,但它们对我而言不起作用。第三种方法对我来说太复杂了,所以我没有尝试。
最后,我发现 Parallel Access 可以让我使用显示错误的程序。它不如 RDP 那么流畅,所以如果我真的必须使用该程序,我就会使用它。
答案4
没有直接解决 SoftXPand 问题,但我通过 Google 搜索来到这里,它与 @harrymc 的答案一致。
我创建了一个批处理文件,延迟 60 秒,然后启动我想要运行的应用程序。我启动了批处理文件,退出我的 RDP 连接,等待了大约 5 分钟,然后重新连接到 RDP。当我重新连接时,我想要的那个烦人的应用程序正在等着我。以下是批处理文件的内容:
timeout 60
start /D "your path here" yourExecutable.exe
如果路径中有空格,则需要用引号括住路径。
向这个家伙致敬: https://stackoverflow.com/users/959263/raihan
(它说要提供详细信息并分享我的研究)