0

C#コードでSetSystemTimeを機能させるのに苦労しています。SetSystemtimeはkernel32.dll関数です。P / invoke(相互運用)を使用して呼び出しています。SetSystemtimeはfalseを返し、エラーは「無効なパラメーター」です。以下のコードを投稿しました。GetSystemTimeは問題なく機能することを強調します。これをVistaとWindows7でテストしました。いくつかのニュースグループの投稿に基づいて、UACをオフにしました。変わりはない。私はこの問題を探しました。私はこのリンクを見つけました:http: //groups.google.com.tw/group/microsoft.public.dotnet.framework.interop/browse_thread/thread/805fa8603b00c267

問題は報告されていますが、解決策が見つからないようです。UACについても言及されていますが、これが問題かどうかはわかりません。また、この紳士は実際のWin32Errorを取得しないことに注意してください。

  1. 誰かが私のコードをXPで試すことができますか?
  2. 誰かが私が間違っていることとそれを修正する方法を教えてもらえますか?どういうわけかプログラムで権限設定を変更することが答えである場合は、例が必要です。ただし、UACをオフにすることでそれをカバーできると思いました。
  3. この特定の方法(SetSystemTime)を使用する必要はありません。何かをストレステストするために、「クロックドリフト」を導入しようとしています。別の方法があれば教えてください。率直に言って、システム時間を変更するために相互運用機能を使用する必要があることに驚いています。.NETメソッドがあると思いました。

助けやアイデアをありがとうございました。アンドリュー

コード:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace SystemTimeInteropTest
{
    class Program
    {
        #region ClockDriftSetup
        [StructLayout(LayoutKind.Sequential)]
        public struct SystemTime
        {
            [MarshalAs(UnmanagedType.U2)]
            public short Year;
            [MarshalAs(UnmanagedType.U2)]
            public short Month;
            [MarshalAs(UnmanagedType.U2)]
            public short DayOfWeek;
            [MarshalAs(UnmanagedType.U2)]
            public short Day;
            [MarshalAs(UnmanagedType.U2)]
            public short Hour;
            [MarshalAs(UnmanagedType.U2)]
            public short Minute;
            [MarshalAs(UnmanagedType.U2)]
            public short Second;
            [MarshalAs(UnmanagedType.U2)]
            public short Milliseconds;
        }

        [DllImport("kernel32.dll")]
        public static extern void GetLocalTime(
        out SystemTime systemTime);

        [DllImport("kernel32.dll")]
        public static extern void GetSystemTime(
        out SystemTime systemTime);

        [DllImport("kernel32.dll", SetLastError = true)]
        public static extern bool SetSystemTime(
        ref SystemTime systemTime);

        //[DllImport("kernel32.dll", SetLastError = true)]
        //public static extern bool SetLocalTime(
        //ref SystemTime systemTime);
        [System.Runtime.InteropServices.DllImportAttribute("kernel32.dll", EntryPoint = "SetLocalTime")]
        [return: System.Runtime.InteropServices.MarshalAsAttribute(System.Runtime.InteropServices.UnmanagedType.Bool)]
        public static extern bool SetLocalTime([InAttribute()] ref SystemTime lpSystemTime);



        #endregion ClockDriftSetup
        static void Main(string[] args)
        {
            try
            {
            SystemTime sysTime;
             GetSystemTime(out sysTime);
                sysTime.Milliseconds += (short)80;
                sysTime.Second += (short)3000;
                bool bResult = SetSystemTime(ref sysTime);

                if (bResult == false)
                    throw new System.ComponentModel.Win32Exception();
            }
            catch (Exception ex)
            {
                Console.WriteLine("Drift Error: " + ex.Message);
            }
        }
    }
}
4

2 に答える 2

6

時刻を設定する .Net メソッドがあります。デフォルトでは、C# で使用できないだけです。プロジェクトへの参照を追加する場合は、次のようMicrosoft.VisualBasicに記述できます。

Microsoft.VisualBasic.DateAndTime.TimeOfDay = DateTime.Now.AddSeconds(3000).AddMilliseconds(80);
于 2010-03-21T06:37:55.120 に答える
0

秒フィールドに 3000 を追加することはできません。0 から 60 までの秒数を指定する必要があります。秒、分、時間などのフィールドをすべて有効な範囲内になるように調整する必要があります。

編集 実際に最も簡単な方法は、SystemTimeToFileTimenumSeconds * 10000を呼び出して、返された値に追加し、 FileTimeToSystemTimeを呼び出して SystemTime に戻すことです。

于 2010-03-21T06:23:11.070 に答える