Консультация № 26634
20.09.2005, 19:42
0.00 руб.
0 5 5
Уважаемые Эксперты скажите можно ли как то остановить, заморозить выполнение
какой то программы, а точнее игры...то есть мне нужно при определенных условиях
игрок не смог продолжить играть...
И можно ли не закрывая, не сворачивая игру, написать прямо в середине экрана
какое нибудь сообщение...?

Обсуждение

Неизвестный
20.09.2005, 19:50
общий
это ответ
Здравствуйте, Dadaev Zaur!
Не могу ответить на вопрос - не хватает данных:
кто должен заморозить выполнение программы? сама программа или внешний процесс?
что вы используете для вывода изображения? Рисуете прямо на форме или с использованием графических компонентов? Прменяется ли directx, opengl, ext?
Неизвестный
20.09.2005, 19:57
общий
это ответ
Здравствуйте, Dadaev Zaur!
Не совсем понял что нужно в первом случае, а во втором все просто - получи контекст устройства вывода (можешь найти хэндл игры и GetDC(hgame: HWND):HDC - взхять контекст), потом, функций для вывода информации на контекст довольно много, поробуй самую простую TextOut(HDC - контекст, X - горизонтальная координата начала рисования текста, Y - тоже но по вертикали, STR - строка, которую нужно вывести, NUM - количество символов встроке, которые будут выведены).
p.s. извиняюсь если чтото неправильно или непонятно - вмремени сейчас мало у меня
давно
Мастер-Эксперт
425
4118
20.09.2005, 20:25
общий
это ответ
Здравствуйте, Dadaev Zaur!
1) Заморозить выполнение изнутри или снаружи игры? Если изнутри, то можно, например, применить функцию Sleep(mseks), где mseks - количество милисекунд, на которые замирает программа.
Можно просто перестать обновлять экран, т.е. повесить на экран статическую картинку. Игрок, при этом, явно не сможет продолжать играть. :)
Или, например, WaitForInputIdle(Handle, mseks) - программа замирает, пока пользователь не задействовал какое-либо ус-во ввода или не имтекло время ожидания.
2) Можно. В каждой игре это есть. Реализация будет зависеть от того, с помощью каких средств написана игра - DirectX, OpenGL, GDI. У каждого используются свои функции вывода текста.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Неизвестный
20.09.2005, 21:08
общий
это ответ
<i>Здравствуйте, <b>Dadaev Zaur</b>!</i>
Чтобы "заморозить" игру, можно сделать так:
1. Установить минимальный приоритет процессу (игре).
2. Отловить функцию таймера (GetTickCount и SetTimer) и, как бы, с помощью перехвата (Hook) передавать туда одно и тоже число (а SetTimer и вовсе заблокировать до нужного момента).
3. Отловить (с помощью Hook) какую-нибудь WinAPI функцию, которую программа часто вызывает и зациклить эту функцию до какого-либо момента

По поводу надписей поверх игры:
все зависит от игры - в некоторых играх это возможно, а в некоторых нет (игра все равно будет перерисовываться поверх Вашего сообщения).
Неизвестный
21.09.2005, 00:43
общий
это ответ
Здравствуйте, Dadaev Zaur!
можно. но не очень просто. надо затормозить все потоки данного процесса (OpenThread, SuspendThread). чтобы получить идентификаторы всех потоков, следует воспользоваться функцией CreateToolhelp32Snapshot.

написать можно (GetDC (0); TextOut (0, ...)), но игра при следущем фрейме все затрет. если же ты предварительно остановил ее вышеприведенным методом, то надпись останется.
Форма ответа