用于windows的displaySwitch.exe代码替换(pre windows 7)

时间:2013-04-03 05:47:16

标签: delphi winapi windows-7 windows-xp delphi-7

我正在编写一个应用程序我想在某种程度上在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

中调用SetDisplayConfigQueryDisplayConfig

它的相关部分在这里(减去许多很多结构,我必须用原始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中编码,但解决方案没有必要这样呈现。我很高兴看到它是如何完成的,或阅读适当步骤的描述,并自己实现。

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

0 个答案:

没有答案