2

我正在编写一个应用程序,我希望在 XP 上向后兼容,或者至少在 windows vista 上向后兼容。

编辑清楚:我需要能够做下面的第一个代码片段所做的事情,但在 XP 中。“鉴于 USER32.DLL 中没有这些功能,有人知道在 XP 下采用的最佳方法吗?”

我在 windows 7 上的初始原型代码只是调用了 CreateProcess 来启动 displayswitch.exe,它与 windows 7 一起部署。

如果您不熟悉它,它是一个方便的小实用程序,当您按下 windows 键和字母 P 时会调用它。您可以在此处阅读有关它的更多信息。

虽然这已经足够了,但我随后需要感知当前状态(例如内部与外部或扩展与克隆),所以我现在编写了一个在 windows 7 上运行良好的 winapi 解决方案(我假设是 8)。它涉及在 User32.DLL 中调用SetDisplayConfigQueryDisplayConfig

它的相关部分在这里(减去我必须用原始克林贡语的帕斯卡代码手工制作的许多结构)。

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 中编码,但没有必要这样呈现解决方案。我很高兴看到它是如何完成的,或者阅读适当步骤的描述,然后自己实现它。

(删除了完整列表,因为它看起来不像一个问题,因此混淆了问题)

4

0 回答 0