110,545
社区成员
发帖
与我相关
我的任务
分享
public static double SpeedUp = 1.0;
public static int StoredRealTime = 0;
public static int StoredFakeTime = 0;
public LocalHook QueryPerformanceCounterHook = null;
private bool SetSpeedUp(double NewSpeedUp)
{
SpeedUp = NewSpeedUp;
if (QueryPerformanceCounterHook == null)
{
QueryPerformanceCounterHook = LocalHook.Create(LocalHook.GetProcAddress("kernel32.dll", "QueryPerformanceCounter"), new QueryPerformanceCounterDelegate(QueryPerformanceCounterEx), this);
QueryPerformanceCounterHook.ThreadACL.SetExclusiveACL(new Int32[0]);
}
}
static bool QueryPerformanceCounterEx(out long FakeTime)
{
bool result;
long RealTime = 0;
int TickCount = timeGetTime();
result = QueryPerformanceCounter(out RealTime);
if (StoredRealTime == 0) // Initialize
{
StoredRealTime = RealTime;
StoredFakeTime = TickCount;
}
FakeTime = StoredFakeTime + (long)((RealTime - StoredRealTime) * SpeedUp);
StoredRealTime = RealTime;
StoredFakeTime = FakeTime;
return result;
}
[DllImport("Winmm.dll")]
static extern int timeGetTime();
[UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Auto, SetLastError = true)]
delegate bool QueryPerformanceCounterDelegate(out long lpPerformanceCount);
[DllImport("kernel32.dll")]
static extern bool QueryPerformanceCounter(out long lpPerformanceCount);