XP、または少なくとも Windows Vista である程度の下位互換性を維持したいアプリを作成しています。
明確にするために編集:以下の最初のコードスニペットが行うことをXPで実行できるようにする必要があります。「関数が USER32.DLL で利用できないことを考えると、XP で実行する最善の方法を知っている人はいますか?」
Windows 7 での最初のプロトタイプ コードは、CreateProcess を呼び出して、windows 7 で展開されているdisplayswitch.exe を起動するだけでした。
慣れていない場合は、Windows キーと文字 P を押すと呼び出される便利な小さなユーティリティです。詳細については、こちらを参照してください。
これで十分でしたが、その後、現在の状態 (内部と外部、または拡張とクローンなど) を感知する必要があったため、Windows 7 (8 を想定) でうまく機能する winapi ソリューションをコーディングしました。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 でコーディングしていますが、ソリューションをそのように提示する必要はありません。それがどのように行われるかを見るか、適切な手順の説明を読んで、自分で実装するだけでとても満足しています。
(質問のように見えず、問題を混乱させたため、完全なリストを削除しました)