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

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

Предисловие

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

Сопутствующее программное обеспечение

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

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

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

Трудности

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

Решение

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

Первая версия утилиты была написана для удержания курсора в клиентской области окна. Основной цикл его работы показан ниже:

/* вариант опроса */ 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»); >> еще < 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); > > >

Читайте также:  Что такое opengl warcraft 3

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

КАК ИГРАТЬ В WARCRAFT 3 или ЛЮБУЮ ДРУГУЮ ИГРУ В ОКНЕ

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

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.левый, mi.rcMonitor.верх, ми.rcMonitor.справа — ми.rcMonitor.левый, ми.rcMonitor.внизу — mi.rcMonitor.top, SWP_SHOWWINDOW)) return false; m_fullScreen = true; return true; >

Оптимизация

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

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; >

Читайте также:  Если варкрафт 3 не 1 26a

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

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); >

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

Послесловие

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

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

Запуск игры в оконном режиме, если она его не поддерживает

GRAVITSAPA.info - интересный блог

Игра в оконном режиме в некоторых играх очень полезно, особенно если у вас подключено 2 монитора. Во многих современных играх есть такая функция. Мало того, есть оконный режим без рамок. Но что делать, если игра не поддерживает это? Нет такой опции в настройках графики. Например, в Warcraft 3 вы не сможете играть в оконном режиме без некоторых дополнительных манипуляций. Есть рабочий способ:

  1. Нажмите щелкнуть правой кнопкой мыши на ярлыке игры а вы выбираете Свойства.
  2. Затем в поле «Объект» добавьте пробел в конце -оконный и нажать кнопку » Применить.».
  3. Запустите игру и нажмите в правом верхнем углу на центральную иконку прямоугольника, чтобы игра развернутая на весь экран, ready.

Еще один способ — кликнуть в игре Alt и Enter одновременно.

Но если оба этих варианта не работают, вы можете использовать D3DWindower. В нем нужно выбрать файл запуска игры, установить разрешение стартового окна и нажать кнопку Запустить программу.

Напишите комментарии, поделитесь этой статьей в социальных сетях. Поделитесь этой статьей в социальных сетях, нажав на соответствующую иконку ниже Спасибо!

Читайте также:  P в warcraft не могут ко мне

Другие статьи по теме:

  • Старый добрый 3D Pinball Space Cadet. Скачать бесплатно, играть и ностальгировать 🙂
  • Играем в легендарную Command and Conquer — Generals онлайн с модом Contra 009
  • Способ размещения пользовательской игры в Warcraft III на сервере Rubattle.net для любого
  • Список игр, в которые можно играть без клавиатуры
  • Причина ошибки 0x80041004, 0x80041006, 0x80041009

Оставить комментарий

Привет читатель! В нынешней ситуации доходы от рекламы уменьшились, вам придется оплачивать содержание сайта из своего кармана. Если вы получили здесь полезную информацию и вам не все равно, пожалуйста, помогите финансово. Вы можете заплатить $1 или больше. Спасибо!

Источник: gravitsapa.информация

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

» Как запустить Варкрафт в окне?» — Если вы задаетесь этим вопросом — эта инструкция для вас.
Существует несколько способов запустить Warcraft 3 в оконном режиме:

Вы можете скачать специальную программу, которая имеет функцию запуска нескольких копий Warcraft. К таким программам относятся Warrun или AWC (я считаю этот метод лучшим решением, так как эти программы могут пригодиться и в других ситуациях)

Вы также можете воспользоваться «дедовским» методом:
1) Создать ярлык для файла, который вы используете для запуска Warcraft 3. (щелкните правой кнопкой мыши на файле — создать ярлык)
2) Зайдите в свойства ярлыка. (правый клик на ярлыке — свойства)
3) Добавьте -window в строку «объект» (не забудьте поставить пробел в начале). Например, в моей строке написано: «D:Program filesWarcraft IIIFrozen Throne.exe»
После изменения должно быть написано: «D:Программные файлыWarcraft IIIFrozen Throne».exe»-window
Теперь, когда вы запускаете Warcraft с этого ярлыка, Warcraft 3 будет запускаться в окне

Существуют и другие способы запустить Warcraft в оконном режиме, используя другие, малоизвестные программы, но мы их рассматривать не будем, так как первый и второй способы прекрасно работают.

Чтобы получить ссылку на файл, подпишитесь на сообщество:

ДО УДАЛЕНИЯ! HOtS — это новая MOBA от Blizzard:

Материалы, похожие на работу «Warcraft 3 в оконном режиме — Как запустить в оконном режиме:

  • Ключи для Warcraft 3 — Reign of Chaos и Frozen throne cdkeys
  • Как разместить в Battle.net? — Стать хозяином в Warcraft 3
  • Варкрафт 3 в окне — Как запустить в оконном режиме
  • Реестр варкрафт 3 — как сделать запись в реестре
  • Warcraft 3 Battle Touriners.net

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