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
相关产品推荐
相关产品推荐

