我正在编写一个应用程序我想在某种程度上在XP上或者至少在windows vista上向后兼容。
编辑清晰度:我需要能够执行下面的第一个代码片段,但是在XP中。 “有没有人知道在XP下使用的最佳方法,因为USER32.DLL中没有这些功能。”
我在Windows 7上的初始原型代码刚刚调用CreateProcess来启动displaywitch.exe,它与Windows 7一起部署。
如果您不熟悉它,它是一个方便的小实用工具,当您按下Windows键和字母P时可以调用它。您可以阅读more about it here。
虽然这是足够的,但我随后需要感知当前状态(例如内部与外部或扩展与克隆),所以我现在编写了一个在Windows 7上运行良好的winapi解决方案(我假设8)。它涉及在User32.DLL
中调用SetDisplayConfig和QueryDisplayConfig它的相关部分在这里(减去许多很多结构,我必须用原始klingon的pascal代码手工制作)。
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中编码,但解决方案没有必要这样呈现。我很高兴看到它是如何完成的,或阅读适当步骤的描述,并自己实现。
(删除了完整列表,因为它混淆了问题,因为它看起来不像是一个问题)