在Delphi中使用ChangeDisplaySettingsEx设置为主显示器

我试图使用ChangeDisplaySettingsEx在Delphi 7设置一个特定的显示器作为主。 在Windows.pas,它被定义为

function ChangeDisplaySettingsEx(lpszDeviceName: PChar; var lpDevMode: TDeviceMode; wnd: HWND; dwFlags: DWORD; lParam: Pointer): Longint; stdcall;

在MSDN,对于ChangeDisplaySettingsEx文档具有以下注释LPDEVMODE:“如果LPDEVMODE NULL,则所有的在注册表当前值将用于显示设置”。

我的目标是改变主监视器的系统上有两个积极的显示器,而无需改变任何东西 - 分辨率,位深度等等,都应该保持不变。 好像路过LPDEVMODE为空(无)是提供完成此方法。

然而,LPDEVMODE被定义为一个压缩记录类型(TDeviceMode),而不是一个指针类型,在Delphi的Windows.pas。 显然,德尔福界面的Windows API进行翻译使用的Windows API的'幕后'的指针。

我打过电话是这样的:

var alldevs : array[0..maxdev] of TDisplayDevice; lpDevMode : pointer; begin lpDevMode := nil; lparam := nil; my_hwnd := nil; {... snip....} with alldevs[NewPri] do ChangeDisplaySettingsEx(devicename,TDeviceMode(lpDevMode),my_hwnd,CDS_SET_PRIMARY,lparam);

这让我对“TDeviceMode(LPDEVMODE)”无效的类型转换错误。 我怎么能传递一个空指针ChangeDisplaySettingsEx? 还是有更好的方法来做到这一点?

--------------解决方案-------------

你可以试试

ChangeDisplaySettingsEx(devicename, PDeviceMode(0)^, my_hwnd, CDS_SET_PRIMARY,
lparam);

它至少编译德尔福2009年。我不能,虽然测试它。

编辑:

根据网上的稀缺信息(这是最详细的我能找到)更改主显示器不是一个简单的过程,所以你可能会丢失一路走来的一个步骤。 我有两个显示器,但无法更改主设备可言,甚至没有与控制面板 - 看起来像双头显示卡驱动程序不允许它。 因此,以下未测试,但也许它会帮助你:

为了建立一个新的主画面中,您必须从(0,0)位置,首先移动当前的主显示器了。 这是比较麻烦比它需要的,因为德尔福Windows.pas文件中有一个不完整的TDeviceMode类型。 它被给定为

_devicemodeA = record
dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;
...
dmOrientation: SHORT;
dmPaperSize: SHORT;
dmPaperLength: SHORT;
dmPaperWidth: SHORT;
dmScale: SHORT;
dmCopies: SHORT;
dmDefaultSource: SHORT;
dmPrintQuality: SHORT;
dmColor: SHORT;
...
end;

当它应该改为是

_devicemodeA = record
dmDeviceName: array[0..CCHDEVICENAME - 1] of AnsiChar;
...
case boolean of
FALSE: (
dmOrientation: SHORT;
dmPaperSize: SHORT;
dmPaperLength: SHORT;
dmPaperWidth: SHORT;
dmScale: SHORT;
dmCopies: SHORT;
dmDefaultSource: SHORT;
dmPrintQuality: SHORT;
);
TRUE: (
dmPosition: TPoint;
dmDisplayOrientation: DWORD;
dmDisplayFixedOutput: DWORD;
);
dmColor: SHORT;
...
end;

您应该添加固定的记录类型,以你的源代码,因为你需要dmPosition调整显示器的来源。 它应该是这样的:

// get current display settings
EnumDisplaySettings(PChar(AOldPrimaryDevice), ENUM_REGISTRY_SETTINGS, DevMode1);
EnumDisplaySettings(PChar(ANewPrimaryDevice), ENUM_REGISTRY_SETTINGS, DevMode2);

// move old primary display to new position
DevMode1.dmFields := DM_POSITION;
DevMode1.dmPosition.x := DevMode2.dmPelsWidth;
DevMode1.dmPosition.y := 0;
Win32Check(ChangeDisplaySettingsEx(PChar(AOldPrimaryDevice), DevMode1, 0,
CDS_UPDATEREGISTRY or CDS_NORESET, nil)):

// move old secondary display to (0, 0) and make the primary display
DevMode2.dmFields := DM_POSITION;
DevMode2.dmPosition.x := 0;
DevMode2.dmPosition.y := 0;
Win32Check(ChangeDisplaySettingsEx(PChar(ANewPrimaryDevice), DevMode2, 0,
CDS_SET_PRIMARY or CDS_UPDATEREGISTRY or CDS_NORESET or DM_DISPLAYFLAGS, nil)):

// magic ???
Win32Check(ChangeDisplaySettingsEx(nil, PDeviceMode(0)^, 0, 0, nil));

我还没有证实此事,但是有一个在MSDN论坛,涵盖这一点,包括C ++代码后。 “主”显示器是一个在位置0,0,所以你需要重新排列显示器的位置,要做到这一点。

这是浏览互联网各地的许多C ++和Delphi的帖子后,我发现。

  • 不想宣布与工会的新选项TMyDevMode类型丢失的字段
  • 利用现有的TDevMode类型,但设置缺少的字段与移动()的存储器复制命令和32位签名的临时变量
  • 从0,0 POS摆脱当前的主桌面,不适用变更尚未
  • 设置新的当前主桌面到0,0与CDS_SET_PRIMARY标志,不适用变更尚未
  • XY位置和宽度,高度应不重叠,但似乎Win7的可以自己解决一些问题
  • 调用ChangeDisplaySettingsEx与空参数应用所有未决更改

设置dmPosition.x和dmPosition.y值,使用内存偏移:

var dm: TDevMode;
var tempx, tempy: Integer;
Move(tempx, dm.dmOrientation, sizeOf(tempx));
Move(tempy, dm.dmPaperLength, sizeOf(tempy));

获取dmPosition.x和dmPosition.y值,使用内存偏移:

var dm: TDevMode;
var tempx, tempy: Integer;
Move(dm.dmOrientation, tempx, sizeOf(tempx));
Move(dm.dmPaperLength, tempy, sizeOf(tempy));

设定从display1主桌面DISPLAY2实例。 进行更改,然后应用所有挂起的更改:

flags := CDS_UPDATEREGISTRY or CDS_NORESET;
ChangeDisplaySettingsEx('\\.\DISPLAY1', devMode1, 0, flags, nil);
flags := CDS_UPDATEREGISTRY or CDS_SET_PRIMARY or CDS_NORESET;
ChangeDisplaySettingsEx('\\.\DISPLAY2', devMode2, 0, flags, nil);
ChangeDisplaySettingsEx(nil, PDeviceMode(0)^, 0, 0, nil);

分类:视窗 时间:2015-03-14 人气:0
本文关键词: 窗户,德尔福
分享到:

相关文章

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.406 (s). 10 q(s)