如何查看远程桌面会话的图像质量设置?

4
我正在使用DevExpress皮肤。我实现了一个手动禁用皮肤的开关。基本上是因为终端服务器(我需要扁平化外观以节省连接带宽)。
无论如何,手动开关并不好用,因为用户必须在本地或远程使用应用程序时不断使用它。当然只有关心外观的用户会这样做。
我想保留手动开关,但也添加另一个自动开关,检查Windows性能设置(我不知道如何用英语表达,无论如何,我的意思是那个设置可以让任何版本的Windows看起来像Windows'98)。如果可能的话,我希望有一个通用函数适用于每个Windows版本(2K、XP、Vista、7和服务器对应版本)。
请注意,我不仅仅是想知道我的系统是否在RDP中运行,而是想知道性能设置是否设置为高图像质量。
4个回答

2
你可以使用我在Delphi Jedi Apilib中的JwaWinsta单元。
更具体地说,你可以使用WinStationQueryInformationW函数并指定WinStationClient信息类,该函数将返回一个WINSTATIONCLIENT结构体。
在这个结构体中,有一个WinStationClientFlags成员,它是一个位域,可以包含以下常量掩码中的任何一个:
  TS_PERF_DISABLE_NOTHING = $0;
  TS_PERF_DISABLE_WALLPAPER = $1;
  TS_PERF_DISABLE_FULLWINDOWDRAG = $2;
  TS_PERF_DISABLE_MENUANIMATIONS = $4;
  TS_PERF_DISABLE_THEMING = $8;
  TS_PERF_ENABLE_ENHANCED_GRAPHICS = $10;
  TS_PERF_DISABLE_CURSOR_SHADOW = $20;
  TS_PERF_DISABLE_CURSORSETTINGS = $40;
  TS_PERF_ENABLE_FONT_SMOOTHING= $80;
  TS_PERF_ENABLE_DESKTOP_COMPOSITION = $100;
  TS_PERF_DEFAULT_NONPERFCLIENT_SETTING = $40000000;
  TS_PERF_RESERVED1 = $80000000;

此结构还返回ColorDepth成员。

1

使用 SM_REMOTESESSION 系统度量来确定您的程序是否在 RDP 上运行。

这篇 OldNewThing 文章 包含更多信息。


请查看我对问题的更新。 - UnDiUdin

0

你好, 你可以使用WTSEnumerateSessions API来检查用户是否在远程桌面模式下运行。

var pSessionInfo: PWTS_SESSION_INFOW;
SessionInfo: WTS_SESSION_INFO;
SessionCount: Cardinal;
i: Integer;
begin
  try
    Result := -1;
    if WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, pSessionInfo, SessionCount) then
      begin
        SessionInfo := pSessionInfo^;
        for i := 0 to SessionCount - 1 do
          begin
            if SessionInfo.State = WTSActive then
              begin
                if Pos('rdp', LowerCase(SessionInfo.pWinStationName)) <> 0 then
                  ShowMessage('this is rdp');
              end;
            pSessionInfo := PWTS_SESSION_INFOW(Pointer(Integer(pSessionInfo) + SizeOf(WTS_SESSION_INFOW)));
            SessionInfo := pSessionInfo^;
          end;
      end;
  finally
    WTSFreeMemory(PSessionInfo);
  end;

希望这回答了你的问题。顺便说一下,Delphi没有WTSEnumerateSessions的导入,所以你必须手动导入它,或者下载一个Jwa库。该函数在JwaWtsApi32.pas中声明。

但是这个(如果我说错了请纠正)告诉我应用程序是在终端服务器还是本地机器上运行,对吗?如果我只想读取当前机器设置怎么办?我也可以将我的Windows 7机器优化为性能,所以在这种情况下,即使我不在远程桌面上,我也想禁用皮肤。 - UnDiUdin
你说得对,我误解了你的问题,抱歉。你遇到的问题不是关于Delphi的,而是关于WinAPI的。也许你应该发布一个带有适当标签的新问题,这样你就能得到答案了。 - Davita
我的问题标签已经涉及WinAPI了。不管怎样,按照您的建议,我会更改标题,明确包含WinAPI。 - UnDiUdin
不需要新问题。你只是误解了它,Davita。而且@User,我建议不要检查Windows是否针对性能进行了优化。如果它已经针对性能进行了优化,但用户仍然启用了主题,则您的程序应继续显示其主题。 - Rob Kennedy
好的,无论如何,我现在明白了GetDeviceCap返回的值是独立于rdp或正常会话使用的。所以我也可以重新命名问题,但由于现在已经找到了解决方案,这并不值得... - UnDiUdin
显示剩余2条评论

0
// returns the color bit depth (8, 16, 32, ....) on the machine
// note: it works also for rdp (it returns the color bit depth of
// the current session, not some default settings on the server)
function GetBitColorDepth: integer;
var
  DC: THandle;    // display context
begin
  DC := GetDC(HWND(nil));
  Result := GetDeviceCaps(DC, BITSPIXEL);
  ReleaseDC(HWND(nil), DC);
end;

我只是在想,如果颜色深度发生变化(例如当您重新连接到现有会话时),会发生什么。这似乎不是最好的解决方法。 - Remko
你提到的情况只能在下一次应用程序启动时处理。 - UnDiUdin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接