Делаем простое удержание курсора в окне Warcraft 3

Приветствую тебя, читатель. У меня есть хобби — это старый добрый Warcraft 3. На хабре уже был цикл статей, посвященный этой замечательной игре. Хочу поделиться с комьюнити одной утилитой, пригодившейся мне при проведении стримов. Всех заинтересовавшихся прошу пройти под кат.

Предисловие

Все началось с того, что в один из выходных на фоне непрекращающегося ремонта я решил посмотреть стрим по Warcraft III. Площадок на данный момент достаточно, но мои предпочтения относятся к сайту www.goodgame.ru (не реклама). Был разочарован, что ничего интересного на тот момент не транслировалось. И тогда возникла мысль — почему бы не сделать свой стрим с блэкджэком и т.д.

Сопутствующее ПО

Для проведения трансляции, кроме всего прочего, потребуется приложение для захвата контента. На данный момент можно выделить два из них: xsplit и openbroadcaster. Честно скажу, первым не пользовался. В бесплатной версии доступен базовый функционал.

Как запустить WarCraft 3 в оконном режиме

Но для скачивания базовой версии придется пройти обязательную регистрацию (не то что бы это было проблемой, но. ). Ко второму варианту склонила лицензия GPL и соответственно доступность исходного кода. На openbroadcaster я и остановился.

Трудности

С установкой и настройкой OBS проблем не возникло. Но запущенная игра никак не хотела захватываться в рекомендованном режиме Game capture (вероятно это связано с использованием старой версии directx при разработке игры). Поигравшись с другими режимами захвата, удалось найти два, которые обеспечивали необходимое поведение — Monitor capture и Window capture.
Первый достаточно сильно аффектит перформанс. Ощущается во время игры. Но это был рабочий вариант, что называется «из коробки».
Второй вариант приводил к дискомфорту в процессе игры — курсор постоянно выходил за границы окна. В общем, было абсолютно неиграбельно.

Решение

Был выбран второй вариант и принято решение написать утилиту для устранения описанного выше дискомфорта.
Изначально Warcraft III запускается в полноэкраном режиме.
Для запуска в оконном режиме необходимо использовать ключ «-window» в команде запуска приложения, это как раз позволит выполнить захват в режиме Windows capture.

Для удержания курсора в рамках клиентской области окна была написана первая версия утилиты. Основной цикл ее работы приведен ниже:

/* polling version */ void Controller::RunPollingLoop() < while (true) < HWND activeWindow = GetForegroundWindow(); HWND requiredWindow = FindRequiredWindow(m_className, m_winTitle, 5); if (requiredWindow == NULL) throw std::runtime_error(«Required window not found»); m_fullScreen.Init(requiredWindow); m_clipHelper.Init(requiredWindow); if (activeWindow == requiredWindow) < if (m_clipHelper.IsClipped() || !CursorInClientArea(requiredWindow)) < Sleep(g_SleepTimeOut); continue; >if (m_fullScreen.Enter()) < DEBUG_TRACE(«EnterFullscreen success»); m_clipHelper.Clip(); DEBUG_TRACE(«Clip»); >else < DEBUG_TRACE(«EnterFullscreen failed»); >> else < if (m_clipHelper.IsClipped()) < if (m_fullScreen.Leave()) < DEBUG_TRACE(«LeaveFullscreen success»); >else < DEBUG_TRACE(«LeaveFullscreen failed»); >m_clipHelper.UnClip(); DEBUG_TRACE(«UnClip»); > Sleep(g_SleepTimeOut); > > >

Здесь используется вспомогательный класс ClipHelper для управления процессом удержания курсора и класс FullScreen для управления процессом перехода в полноэкранный режим и восстановления из него. Сам цикл реализует алгоритм поллинга активного окна с таймаутом в 500 мс. Этот момент мне не понравился сразу, но для движения дальше требовалось проверить всю концепцию, а потом заняться оптимизацией.

как запустить warcraft 3 в окне

В процессе использования утилиты сразу возникли следующие хотелки:
— Clip проводить только в случае клика (удержания для поллинг версии) по клиентской области, чтобы иметь возможность перетаскивать окно;
— раздражал вид taskbar во время игры (актуально, если она зафиксирована). Первой мыслью было скрыть ее программно. Но в таком случае необходимо было бы отслеживать моменты выхода пользователя из игры и показывать taskbar обратно. Повышался риск оставить пользователя без панели задач. Поэтому реализацию fullscreen я решил сделать изменением размеров игрового окна до размеров разрешения монитора, за которым это окно закреплено:

Читайте также:  Как установить озвучку в warcraft 3

bool FullScreen::Enter() < if (m_fullScreen) return true; assert(m_hwnd); if (m_hwnd == NULL) return false; HMONITOR hmon = MonitorFromWindow(m_hwnd, MONITOR_DEFAULTTONEAREST); MONITORINFO mi = < sizeof(mi) >; if (!GetMonitorInfo(hmon, if (!GetWindowRect(m_hwnd, SecureZeroMemory( return false; >if (!SetWindowPos(m_hwnd, HWND_TOPMOST, mi.rcMonitor.left, mi.rcMonitor.top, mi.rcMonitor.right — mi.rcMonitor.left, mi.rcMonitor.bottom — mi.rcMonitor.top, SWP_SHOWWINDOW)) return false; m_fullScreen = true; return true; >

Оптимизация

Во второй версии утилиты поллинг активного окна был заменен хуком сообщений WM_ACTIVATE и WM_LBUTTONDOWN. Для этого я использовал два типа хуков: WH_CALLWNDPROC и WH_MOUSE. Суть в том, что мы отслеживаем требуемые события игрового окна и уведомляем нашу утилиту через окно-сервер. Хук вешался только для процесса игры. Таким образом, игра должна быть запущена до утилиты:

BOOL SetWinHook(HWND hWnd, DWORD threadId) < if (g_hWndSrv != NULL) return FALSE; //already hooked g_hCallWndHook = SetWindowsHookEx(WH_CALLWNDPROC, (HOOKPROC)CallWndHookProc, g_hInst, threadId); if (g_hCallWndHook != NULL) < g_hMouseHook = SetWindowsHookEx(WH_MOUSE, (HOOKPROC)MouseHookProc, g_hInst, threadId); if (g_hMouseHook != NULL) < g_hWndSrv = hWnd; return TRUE; >ClearWinHook(); > return FALSE; >

А основной цикл работы свелся к следующей процедуре:

LRESULT CALLBACK Controller::MainWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) < if (uMsg == WM_ACTIVATE) < switch (wParam) < case WA_ACTIVE: DEBUG_TRACE(«WA_ACTIVE»); gs_ActivateClip = true; break; case WA_CLICKACTIVE: DEBUG_TRACE(«WA_CLICKACTIVE»); gs_ActivateClip = true; break; case WA_INACTIVE: DEBUG_TRACE(«WA_INACTIVE»); gs_ActivateClip = false; if (g_ControllerPtr->ClipCursorHelper().IsClipped()) < if (g_ControllerPtr->FullScreenHelper().Leave()) < DEBUG_TRACE(«LeaveFullscreen success»); >else < DEBUG_TRACE(«LeaveFullscreen failed»); >g_ControllerPtr->ClipCursorHelper().UnClip(); DEBUG_TRACE(«UnClip»); > break; > return 0; > else if (uMsg == WM_LBUTTONDOWN) < DEBUG_TRACE(«WM_LBUTTONDOWN»); if (!gs_ActivateClip) return 0; if (g_ControllerPtr->ClipCursorHelper().IsClipped()) return 0; if (g_ControllerPtr->FullScreenHelper().Enter()) < DEBUG_TRACE(«EnterFullscreen success»); g_ControllerPtr->ClipCursorHelper().Clip(); DEBUG_TRACE(«Clip»); > else < DEBUG_TRACE(«EnterFullscreen failed»); >return 0; > return DefWindowProc(hwnd, uMsg, wParam, lParam); >

Используемые вспомогательные классы те же, что и в первой версии. Данная функция является оконной процедурой окна-сервера утилиты. Для захвата курсора и перехода в полный экран необходимо активировать окно и кликнуть левой кнопкой по клиентской области. Когда окно перестает быть активным, то оно восстанавливается до исходных размеров и положения, а курсор больше не удерживается в нем.

Послесловие

Была разработана утилита, призванная сделать процесс стрима любимой игры более комфортным, чем предлагаемый рабочий вариант «из коробки». Буду рад, если кто-то почерпнет для себя что-то интересное. Весь исходный код залит на github WinClipCursor.

Источник: habr.com

Нужно через гарену открыть варкрафт 3 в окне

У меня такая проблема. Мне нужно поиграть в варкрафт 3, но чтоб он был не на весь экран, а как окошко (сверху строчка с крестиком, уменьшить (увеличить) и т.д.). Но нужно так сделать через гарену.

Tobi123

7826 / 10000

Ответ

В параметры запуска -window

Загруженные файлы

Мне нравится 0

Просмотров: 2 231

  • Все типы комментариев
  • Обычный комментарий
  • Рецензия на публикацию
  • Заказ на работу
  • Выполнение заказа
  • Новости проекта!
  • Вышла новая версия!
  • Заявка на участие

Голосов: 0

Не в сети 99 дней

7826 / 10000

Блог
Проекты :

Tobi123 — 8 лет назад

Голосов: 0

В параметры запуска -window

Загруженные файлы

Голосов: 0

Не в сети 3 года

Тень — 8 лет назад

Голосов: 0

Tobi123, спс. А то забыл напрочь всё. И везде только намекают на проги.
Кстати а ты не знаешь что за проблема. У меня иногда когда закрываю варик становится черный экран или пишет на черном фону недопустимы (или типо того) формат. Проблема появилась недавно.
Вроде нечего не устанавливал такого.

Читайте также:  Как изменить курсор в варкрафте

Источник: xgm.guru

Как запустить игру в оконном режиме

Компьютерные игры, приложения умеют работать в полноэкранном режиме и в окне. В зависимости от задач иногда необходимо запустить игру в оконном режиме. Например, пользователь параллельно работает с другой программой и часто приходится сворачивать приложение. Или на работе, чтобы скрыть от руководства тот факт, что в коротких перерывах мы запускаем любимую игру. Далее в статье вы найдёте все способы поиграть в окне.

Горячие клавиши Windows для оконного режима

Режим окна также приходится использовать тем, кто любит старые игры. Как известно, раньше они создавались для экранов с маленьким разрешением . И сегодня запустив её на весь экран, игра выглядит довольно скверно. Но если свернуть окно с игрой до меньших размеров, то картинка становится приемлемой. В ОС Windows есть горячие клавиши, которые отвечают за сворачивания экрана с любым приложением в окно — ALT+ENTER .

Клавиши оконного режима

Попробуйте запустить игру в обычном режиме, а затем нажать сочетание этих кнопок. Этот способ может помочь с устаревшими играми. Новые игры не поддаются этой команде. И в них необходимо искать другие решения, чтобы запустить в окне. Если после попытки игру не удалось свернуть, попробуйте открыть её графические настройки . Вам нужно отыскать настройку « Запуск в окне » или « Запуск в оконном режиме ». И при их наличии поставьте галочки или активируйте соответствующим образом эти пункты.

Во многими любимом CS:GO вы можете в настройках изменить способ запуска игры на открытие в окне:

  1. Запустите игру и выберите кнопку « Настройки »;Настройки CS:GO
  2. В небольшом меню нажмите « Настройки видео »;Настройки видео
  3. В следующем окне выберите строку « Режим отображения » и установите значение « В окне »;

Параметр Режим отображения

Выберите пункт «В окне» в строке «Режим отображения»

Каким образом запустить игру в окошке при помощи настройки ярлыка

Некоторые игры также можно запустить, установив нужный параметр в ярлыке. При этом можно использовать и тот, что находится на рабочем столе, и ярлык, который расположен в папке с игрой.

Выполните следующие действия:

  1. Необходимо нажать на него ПКМ и выбрать строку « Свойства »;Свойства ярлыка
  2. Затем нам понадобиться строка под названием « Объект »;Настройки объекта
  3. Продолжите строку через пробел. Напишите слово « -windows » и обязательно вначале без пробела поставьте дефис;Параметр -window
  4. Теперь сохраняем эти настройки. Сначала нажимаем « Применить », затем кнопку « Ок ».

Далее при помощи ярлыка попробуйте открыть игру, параметры которой вы только что изменили. Она должна появится в редактируемом окошке.

Игра в окне

Если это не так, откройте снова параметры ярлыка и проверьте, возможно вы допустили ошибку.

Ошибка в слове -window

Или не поставили дефис перед добавленным словом. В некоторых играх достаточно написать дефис и первую букву слова « -w ».

Короткий параметр запуска игры

Иногда нужно писать только « -win ». Поэтому стоит поэкспериментировать с этим параметром.

Использование настроек

Многие современные игры при установке на компьютер «выбрасывают» на рабочий стол не один, а два ярлыка. Один — для запуска игры, второй — для открытия окна с настройками параметров игры.

Ярлыки с настройками

Для достижения поставленной цели, используйте второй ярлык:

  1. Запустите ярлык;Пункт Настройки
  2. Выберите при необходимости настройки экрана ;
  3. Необходимо разместить флажок на чек-боксе « Запуск в окне ». Или выберите это значение из появляющегося блока.Оконный режим

Закройте окно настроек и запустите игру. Если пункта с оконным режимом в настройках нет, попробуйте использовать параметры ярлыка для этого. Инструкция описана выше. Уже достаточно известная игра World Of Tanks умеет также запускаться в окне. Настройки для этого нужно использовать в запущенной игре.

Читайте также:  Warcraft ii tides of darkness системные требования

Вы также можете спросить у знатоков на форумах и соответствующих ресурсах (например, ответы mail.ru), можно ли запустить конкретную игру в окне.

Программа для создания оконного режима в играх

Для того, чтобы открыть любое приложение на вашем ПК в оконном режиме, существует полезная утилита — GameCompanion . Официальный сайт находится по адресу: https://www.nexusmods.com/newvegas/mods/42956.

NexusMods

Чтобы скачать её, необходимо зарегистрироваться или авторизоваться на сайте, если у вас уже есть учётная запись. Утилита позволяет запускать игру в псевдо-оконном режиме. Перенимая все возможности стандартного окна Windows. А это значит, что у нас появляется больше функций для работы с окном игры.

Также утилита делает окно доступным для создания скриншотов игры. Позволяет управлять громкостью, а также выбирать гамма режимы.

После загрузки архива с программой, его нужно распаковать:

  1. Распакуйте архив в определённое место, чтобы вы знали, где находятся файлы программы после распаковки;Скриншот распаковки архива
  2. Далее среди этих распакованных файлов найдите « Set-Up GameCompanion » и нажмите по нему 2 раза курсором мыши;
  3. Выберите « Install », после чего программа начнёт устанавливаться. На рабочем столе появится иконка, которую нужно запустить;Иконка программы
  4. В окне программы нужно выбрать вкладку « Game ». Откроется список игр , которые программа поддерживает по умолчанию. Даже если вашей игры в списке нет, вам необходимо вписать сюда название экзешного файла , который её запускает. Например, «Fallout3.exe»;Вкладка Games
  5. Вкладка « HotKeys » также содержит полезную информацию — комбинации клавиш для управления программой. Вы можете их изменить при необходимости.Вкладка Hotkeys

Теперь закройте компаньон и запустите игру, которую вы добавили в список программы. Она должна быть запущена в оконной опции. Если это не так, попробуйте использовать горячие клавиши из соответствующей вкладки программы ( CTRL+ENTER по умолчанию).

Редактирование конфигурационного файла

Запустить игру в окне может помочь конфигурационный файл, который есть практически в любом приложении. Часто эти файлы спрятаны настройками « Скрытие файлов и папок ». Поэтому пользователи не всегда могут их найти в папке с игрой. Эти файлы имеют расширение « .ini ».

Чтобы увидеть скрытые файлы в папке с игрой, следуйте дальнейшим указаниям в инструкции:

Пункт Панель управления

  1. Откройте панель управления любым способом;
  2. Найдите пункт « Параметры папок ». Если этот пункт найти не удаётся, попробуйте изменить отображение пунктов панели управления или воспользуйтесь поисковой строкой;

Настройка значков

Выберите другое расположение пунктов панели управления

Раздел Вид

  • Выберите вкладку « Вид » и найдите параметр « Скрыть файлы и папки ». Установите здесь значение « Показывать скрытые файлы… ».
  • Теперь можно приступать к поиску конфигурационного файла .ini. Необходимо открыть папку с игрой и производить поиск в ней. У вас есть возможность также воспользоваться поисковой строкой. Введите расширение, и файлы с окончанием .ini покажутся в результатах.

    Найденные файлы ini

    Нужные нам обычно имеют название игры и данное расширение. Открывается он обычным двойным щелчком мыши. После чего внутри него необходимо отыскать настройки с названиями « Full Screen » (полный экран), « Size » (размер) и установить необходимые нам параметры.

    Параметры экрана

    В конфигурационных файлах установлены значения.

    ПараметрОписание
    1 Включен
    0 Выключен
    Size W Значение ширины
    Size H Значение высоты

    После примененных настроек их нужно сохранить. Эта процедура схожа с обычным сохранением текстового или графического файла. Нажмите кнопку «File» или «Файл» и пункт «Сохранить как…». Выберите папку для этого. Затем запустите игру, которая должна открыться в оконном режиме после установленных параметров.

    Источник: sdelaicomp.ru