我正在编写一个应用程序,我希望在 XP 上向后兼容,或者至少在 windows vista 上向后兼容。
编辑清楚:我需要能够做下面的第一个代码片段所做的事情,但在 XP 中。“鉴于 USER32.DLL 中没有这些功能,有人知道在 XP 下采用的最佳方法吗?”
我在 windows 7 上的初始原型代码只是调用了 CreateProcess 来启动 displayswitch.exe,它与 windows 7 一起部署。
如果您不熟悉它,它是一个方便的小实用程序,当您按下 windows 键和字母 P 时会调用它。您可以在此处阅读有关它的更多信息。
虽然这已经足够了,但我随后需要感知当前状态(例如内部与外部或扩展与克隆),所以我现在编写了一个在 windows 7 上运行良好的 winapi 解决方案(我假设是 8)。它涉及在 User32.DLL 中调用SetDisplayConfig和QueryDisplayConfig
它的相关部分在这里(减去我必须用原始克林贡语的帕斯卡代码手工制作的许多结构)。
function getTopology : DISPLAYCONFIG_TOPOLOGY_ID ;
var NumPathArrayElements,
NumModeInfoArrayElements : UINT32;
var PathArrayElements_Size,
ModeInfoArrayElements_Size : UINT32;
error : Longint;
paths : PDISPLAYCONFIG_PATH_INFO_array;
info : PDISPLAYCONFIG_MODE_INFO_array;
begin
NumModeInfoArrayElements := 0;
Result := DISPLAYCONFIG_TOPOLOGY_EXTERNAL;
inc(result);
error := GetDisplayConfigBufferSizes(QDC_DATABASE_CURRENT,NumPathArrayElements,NumModeInfoArrayElements);
case error of
ERROR_SUCCESS :
begin
PathArrayElements_Size := sizeof(DISPLAYCONFIG_PATH_INFO) * NumPathArrayElements ;
ModeInfoArrayElements_Size := sizeof(DISPLAYCONFIG_MODE_INFO) * NumModeInfoArrayElements;
GetMem(paths,PathArrayElements_Size);
try
GetMem(info,ModeInfoArrayElements_Size );
try
error := QueryDisplayConfig(QDC_DATABASE_CURRENT,NumPathArrayElements, paths,NumModeInfoArrayElements, info,result);
case error of
ERROR_SUCCESS :;
else
Result := DISPLAYCONFIG_TOPOLOGY_EXTERNAL;
inc(result);
end;
finally
FreeMem(info,ModeInfoArrayElements_Size );
end;
finally
FreeMem(paths,PathArrayElements_Size);
end;
end;
end;
end;
function setTopology ( top : DISPLAYCONFIG_TOPOLOGY_ID) : boolean;
var flags : dword;
begin
result := false;
flags := DecodeDISPLAYCONFIG_TOPOLOGY_ID_SDC(top);
if flags <> 0 then
begin
result := SetDisplayConfig(0,nil,0,nil,SDC_APPLY or flags) = ERROR_SUCCESS;
end;
end;
由于这些功能在 XP 中不存在(据我所知),我正在寻找一种在 XP 中实现类似功能的稳定方法。虽然我在 Delphi 中编码,但没有必要这样呈现解决方案。我很高兴看到它是如何完成的,或者阅读适当步骤的描述,然后自己实现它。
(删除了完整列表,因为它看起来不像一个问题,因此混淆了问题)