В интернете нашел код на языке C++, который позволяет делать окна постоянно активными, то есть предотвращает их переход в спящий режим (или, проще говоря, их “зависание” при переключении между окнами).
Так как я разрабатываю в среде Lazarus, которая базируется на языке Pascal, я решился представить этот код, в надежде, что он окажется полезным для вас!
Чтобы избежать необходимости внедрения DLL, мы задаем имя файла entry.dll и размещаем его в папке /system с игрой, после чего игра автоматически загружает нашу библиотеку, и это — все!
Пример на Lazarus/Delphi (Нет подсветки синтаксиса Pascal)
Тот код, что нашел в интернете C++
Так как я разрабатываю в среде Lazarus, которая базируется на языке Pascal, я решился представить этот код, в надежде, что он окажется полезным для вас!
Чтобы избежать необходимости внедрения DLL, мы задаем имя файла entry.dll и размещаем его в папке /system с игрой, после чего игра автоматически загружает нашу библиотеку, и это — все!
Пример на Lazarus/Delphi (Нет подсветки синтаксиса Pascal)
JavaScript:
library entry;
{$mode objfpc}{$H+}
uses
Windows;
// Функция-заглушка для замены оригинальной функции Sleep
function SleepStub: Integer; cdecl;
begin
Result := 50; // Возвращаем 50 в качестве заглушки для функции Sleep
end;
// Объявление процедуры, отключающей "ленивый" режим сна
procedure DisableLazyMode; forward;
// Процедура для отключения режима "ленивого" сна в библиотеке "core.dll"
procedure DisableLazyMode;
var
LazyMode: PBYTE; // Указатель на адрес функции "appSleep" в памяти
OldProtect: DWORD; // Старое состояние защиты памяти
begin
// Получаем указатель на функцию "appSleep" в уже загруженной библиотеке "core.dll"
LazyMode := GetProcAddress(GetModuleHandle('core.dll'), '?appSleep@@YAXM@Z');
if Assigned(LazyMode) then // Проверяем, найдена ли функция "appSleep"
begin
if VirtualProtect(LazyMode, 5, PAGE_READWRITE, @OldProtect) then // Меняем защиту памяти
begin
LazyMode^ := $E9; // Заменяем первый байт вызова функции на безусловный переход
PInteger(LazyMode + 1)^ := Integer(@SleepStub) - Integer(LazyMode + 5); // Устанавливаем адрес заглушки в вызове
VirtualProtect(LazyMode, 5, OldProtect, @OldProtect); // Восстанавливаем защиту памяти
end;
end;
end;
begin// Точка входа в библиотеку
DisableLazyMode; // Вызываем процедуру для отключения "ленивого" режима сна
end.
Тот код, что нашел в интернете C++
C++:
#include <Windows.h>
extern "C" void __declspec(dllexport) __stdcall function1()
{
}
int __cdecl SleepStub()
{
return 50;
}
void WINAPI DisableLazyMode()
{
HINSTANCE HСore = LoadLibraryA("core.dll");
if (HСore){
BYTE* LazyMode = (BYTE*)GetProcAddress(HСore, "?appSleep@@YAXM@Z");
if (!LazyMode)
return;
ULONG oldProtect;
if (!VirtualProtect(LazyMode, 5, PAGE_READWRITE, &oldProtect))
return;
*LazyMode = 0xE9;
*(int*)(LazyMode + 1) = (BYTE*)SleepStub - (LazyMode + 5);
VirtualProtect(LazyMode, 5, oldProtect, &oldProtect);
}
}
BOOL WINAPI DllMain(HINSTANCE hinst, DWORD reason, LPVOID lpReserved)
{
if (reason == DLL_PROCESS_ATTACH)
{
DisableLazyMode();
}
return 1;
}