You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Delphi 2010中如何单独控制收银机副显示屏的开关?

单独控制副显示屏的Delphi 2010实现方案

你用HWND_BROADCAST发送WM_SYSCOMMAND会关闭所有显示器,因为这个消息是广播给系统所有窗口的,主副屏都会响应。要单独控制副屏,得用Windows多显示器API定位目标显示器,再针对性修改它的状态。

核心思路

通过枚举系统中的显示器,识别出副屏设备,再调用ChangeDisplaySettingsEx或SetDisplayConfig来启用/禁用该设备,而非广播消息。

Delphi 2010代码示例

下面的代码会枚举第二个显示器(默认副屏)并切换它的启用状态:

uses
  Windows, SysUtils;

procedure ToggleSecondaryMonitor(const Enable: Boolean);
var
  DisplayDevice: TDisplayDevice;
  DevMode: TDeviceMode;
begin
  ZeroMemory(@DisplayDevice, SizeOf(TDisplayDevice));
  DisplayDevice.cb := SizeOf(TDisplayDevice);

  // 枚举第二个显示器(索引0为主屏,1为副屏;多屏场景需按需调整索引)
  if EnumDisplayDevices(nil, 1, DisplayDevice, 0) then
  begin
    ZeroMemory(@DevMode, SizeOf(TDeviceMode));
    DevMode.dmSize := SizeOf(TDeviceMode);

    // 配置设备模式:控制显示器激活状态
    DevMode.dmFields := DM_DISPLAYFLAGS;
    if Enable then
      DevMode.dmDisplayFlags := DevMode.dmDisplayFlags or DISPLAY_DEVICE_ACTIVE
    else
      DevMode.dmDisplayFlags := DevMode.dmDisplayFlags and not DISPLAY_DEVICE_ACTIVE;

    // 应用设置并刷新
    ChangeDisplaySettingsEx(DisplayDevice.DeviceName, @DevMode, 0, CDS_UPDATEREGISTRY or CDS_NORESET, nil);
    ChangeDisplaySettingsEx(nil, nil, 0, CDS_RESET, nil);
  end;
end;

注意事项

  • 若系统有多个副屏,需调整EnumDisplayDevices的第二个参数(索引值),或通过DisplayDevice.StateFlags判断是否为副屏(DISPLAY_DEVICE_MIRRORING_DRIVER是镜像屏,DISPLAY_DEVICE_ATTACHED_TO_DESKTOP是已连接的桌面屏)。
  • 操作显示器状态需要管理员权限,否则可能执行失败。
  • 对于Windows Vista及以上系统,也可以使用更灵活的SetDisplayConfig函数,支持更复杂的多显示器布局调整。

内容的提问来源于stack exchange,提问作者Mefodiy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.18 06:13:24