2

XP、または少なくとも Windows Vista である程度の下位互換性を維持したいアプリを作成しています。

明確にするために編集:以下の最初のコードスニペットが行うことをXPで実行できるようにする必要があります。「関数が USER32.DLL で利用できないことを考えると、XP で実行する最善の方法を知っている人はいますか?」

Windows 7 での最初のプロトタイプ コードは、CreateProcess を呼び出して、windows 7 で展開されているdisplayswitch.exe を起動するだけでした。

慣れていない場合は、Windows キーと文字 P を押すと呼び出される便利な小さなユーティリティです。詳細については、こちらを参照してください

これで十分でしたが、その後、現在の状態 (内部と外部、または拡張とクローンなど) を感知する必要があったため、Windows 7 (8 を想定) でうまく機能する winapi ソリューションをコーディングしました。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