プログラムを XP 互換モードで実行する必要があります。が XP 互換モードで実行されているかどうかを確認する方法が必要です。そうでない場合は、ユーザーに互換モードで実行するように伝えます。検索しましたが、答えが見つかりませんでした。これを試してみましthis.Text = System.Environment.OSVersion.VersionString;
たが、エミュレートされた XP ではなく、Microsoft Windows NT 6.1.7601 Service Pack 1 が返されます。
(編集)
さらに検索して dll をインポートしても、何も正しく動作せず、常に Microsoft Windows NT 6.1.7601 Service Pack 1 が返されます。そこで、レジストリを処理するためにロードされたコンソールを作成し、プログラムを実行しました。
using System;
using System.Security.Permissions;
using Microsoft.Win32;
[assembly: RegistryPermissionAttribute(SecurityAction.RequestMinimum, ViewAndModify = "HKEY_CURRENT_USER")]
class RegKey
{
static void Main()
{
int Major = Environment.OSVersion.Version.Major;
int Minor = Environment.OSVersion.Version.Minor;
if (Major == 5 && Minor == 1)
{
System.Diagnostics.Process.Start(System.IO.Directory.GetCurrentDirectory() + "\\MyApp.exe");
}
else if (Major > 5)
{
if (System.IO.File.Exists(System.IO.Directory.GetCurrentDirectory() + "\\MyApp.exe"))
{
RegistryKey Rkey = Registry.CurrentUser.CreateSubKey("SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\AppCompatFlags\\Layers");
//Creates Name And Value
Rkey.SetValue(System.IO.Directory.GetCurrentDirectory() + "\\MyApp.exe", "WINXPSP3");
//Starts App.
System.Diagnostics.Process.Start(System.IO.Directory.GetCurrentDirectory() + "\\MyApp.exe", "Load");
//Waites 500 milliseconds so my program can get the registry info
//(Not needed any more)
//System.Threading.Thread.Sleep(500);
//Deletes Name And Value
//(Handled by MyApp.exe to increase load time)
//Rkey.DeleteValue(System.IO.Directory.GetCurrentDirectory() + "\\MyApp.exe");
}
else
{
Console.WriteLine("File Not Found!!!");
Console.WriteLine("( MyApp.exe ) Must Be In Same Directory As The Loader.exe.");
Console.ReadLine();
}
}
}
}
この方法でレジストリを処理することで、私のプログラムは移植可能になり、何も指していないレジストリ エントリを防ぐことができます。私が探していた結果を得るためのより良い方法であると確信しています.
(編集2)
さらにチェックした結果、64ビットシステムでXP互換モードを実行するだけで済みました。32 ビット システムは、XP 互換モードで実行する必要はありません。プラットフォーム x86 でアプリをコンパイルしました。したがって、64ビットシステムがレジストリを読み取る方法と関係があるに違いありません.