рдЖрдкрдХреЛ рдирдорд╕реНрдХрд╛рд░, рдкрд╛рдардХред рдореЗрд░рд╛ рдПрдХ рд╢реМрдХ рд╣реИ - рдпрд╣ рдЕрдЪреНрдЫрд╛ рдкреБрд░рд╛рдирд╛ Warcraft 3 рд╣реИред Habr├й рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЗрд╕ рдЕрджреНрднреБрдд рдЦреЗрд▓ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдкрд┐рдд рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рд╢реНрд░реГрдВрдЦрд▓рд╛ рдереАред рдореИрдВ рд╕рдореБрджрд╛рдп рдХреЗ рд╕рд╛рде рдПрдХ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд╕рд╛рдЭрд╛ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдЬреЛ рдореБрдЭреЗ рд╕реНрдЯреНрд░реАрдорд┐рдВрдЧ рдХрд░рддреЗ рд╕рдордп рдХрд╛рдо рдЖрдИред рд╕рднреА рдЗрдЪреНрдЫреБрдХ рдХреГрдкрдпрд╛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдкрд╛рд╕ рдЬрд╛рдПрдВред
рдкреНрд░рд╕реНрддрд╛рд╡рдирд╛
рдпрд╣ рд╕рдм рдЗрд╕ рддрдереНрдп рд╕реЗ рд╢реБрд░реВ рд╣реБрдЖ рдХрд┐ рдЪрд▓ рд░рд╣реА рдорд░рдореНрдордд рдХреА рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдкреНрддрд╛рд╣рд╛рдВрдд рдореЗрдВ рд╕реЗ рдПрдХ, рдореИрдВрдиреЗ Warcraft III рдХреА рдПрдХ рдзрд╛рд░рд╛ рджреЗрдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ред рдЗрд╕ рд╕рдордп рдкрд░реНрдпрд╛рдкреНрдд рд╕рд╛рдЗрдЯреЗрдВ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореЗрд░реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдПрдВ
www.goodgame.ru (рд╡рд┐рдЬреНрдЮрд╛рдкрди рдирд╣реАрдВ) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВред рдореБрдЭреЗ рдирд┐рд░рд╛рд╢рд╛ рд╣реБрдИ рдХрд┐ рдЙрд╕ рд╕рдордп рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рд╕рд╛рд░рд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдФрд░ рдлрд┐рд░ рд╡рд┐рдЪрд╛рд░ рдЙрддреНрдкрдиреНрди рд╣реБрдЖ - рдХреНрдпреЛрдВ рд▓рд╛рдареА рдЖрджрд┐ рд╕реЗ рдЕрдкрдиреА рдзрд╛рд░рд╛ рди рдмрдирд╛рдпреЗрдВред
рд╕рдВрдмрдВрдзрд┐рдд рд╕реЙрдлреНрдЯрд╡реЗрдпрд░
рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП, рдЕрдиреНрдп рдмрд╛рддреЛрдВ рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЖрдкрдХреЛ рд╕рд╛рдордЧреНрд░реА рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдлрд┐рд▓рд╣рд╛рд▓, рдЙрдирдореЗрдВ рд╕реЗ рджреЛ рдХреЛ рдкреНрд░рддрд┐рд╖реНрдард┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
xsplit рдФрд░
Openbroadcaster ред рдИрдорд╛рдирджрд╛рд░реА рд╕реЗ, рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдХрд╛ рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ред рдореБрдХреНрдд рд╕рдВрд╕реНрдХрд░рдг рдореЗрдВ, рдмреБрдирд┐рдпрд╛рджреА рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЙрдкрд▓рдмреНрдз рд╣реИред рд▓реЗрдХрд┐рди рдореВрд▓ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдирд┐рд╡рд╛рд░реНрдп рдкрдВрдЬреАрдХрд░рдг рд╕реЗ рдЧреБрдЬрд░рдирд╛ рд╣реЛрдЧрд╛ (рдпрд╣ рдирд╣реАрдВ рдХрд┐ рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реЛрдЧреА, рд▓реЗрдХрд┐рди ...)ред рдЬреАрдкреАрдПрд▓ рд▓рд╛рдЗрд╕реЗрдВрд╕ рдФрд░, рддрджрдиреБрд╕рд╛рд░, рд╕реНрд░реЛрдд рдХреЛрдб рдХреА рдЙрдкрд▓рдмреНрдзрддрд╛ рджреВрд╕рд░реЗ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд▓рд┐рдП рдЗрдЪреНрдЫреБрдХ рд╣реИред рдореИрдВ рдУрдкрдирдмреНрд░реЛрдбрдХреЗрд╕реНрдЯрд░ рдкрд░ рд░реБрдХ рдЧрдпрд╛ред
рдХрдард┐рдирд╛рдЗрдпреЛрдВ
рдУрдмреАрдПрд╕ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рдереАред рд▓реЗрдХрд┐рди рд░рдирд┐рдВрдЧ рдЧреЗрдо рдЕрдиреБрд╢рдВрд╕рд┐рдд рдЧреЗрдо рдХреИрдкреНрдЪрд░ рдореЛрдб рдореЗрдВ рдХрдмреНрдЬрд╛ рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рдерд╛ (рдпрд╣ рд╢рд╛рдпрдж рдЧреЗрдо рдХреЗ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рдбрд╛рдпрд░реЗрдХреНрдЯреЗрдХреНрд╕ рдХреЗ рдкреБрд░рд╛рдиреЗ рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЗ рдХрд╛рд░рдг рд╣реИ)ред рдЕрдиреНрдп рдХреИрдкреНрдЪрд░ рдореЛрдб рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреЗ рдмрд╛рдж, рд╣рдо рджреЛ рдХреЛ рдЦреЛрдЬрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗ рдЬреЛ рдЖрд╡рд╢реНрдпрдХ рд╡реНрдпрд╡рд╣рд╛рд░ рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВ - рдореЙрдирд┐рдЯрд░ рдХреИрдкреНрдЪрд░ рдФрд░ рд╡рд┐рдВрдбреЛ рдХреИрдкреНрдЪрд░ред
рдкрд╣рд▓рд╛ рдХрд╛рдлреА рдкреНрд░рднрд╛рд╡рд╢рд╛рд▓реА рдкреНрд░рджрд░реНрд╢рди рд╣реИред рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди рдорд╣рд╕реВрд╕ рд╣реЛрддрд╛ рд╣реИред рд▓реЗрдХрд┐рди рдпрд╣ "рдмреЙрдХреНрд╕ рд╕реЗ рдмрд╛рд╣рд░" рдирд╛рдордХ рдПрдХ рдХрд╛рд░реНрдпрд╢реАрд▓ рд╕рдВрд╕реНрдХрд░рдг рдерд╛ред
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди рдЕрд╕реБрд╡рд┐рдзрд╛ рдХрд╛ рдХрд╛рд░рдг рдмрдирд╛ - рдХрд░реНрд╕рд░ рд▓рдЧрд╛рддрд╛рд░ рдЦрд┐рдбрд╝рдХреА рд╕реЗ рдкрд░реЗ рдЪрд▓рд╛ рдЧрдпрд╛ред рд╕рд╛рдорд╛рдиреНрдп рддреМрд░ рдкрд░, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдЕрдЪреВрдХ рдерд╛ред
рдирд┐рд░реНрдгрдп
рджреВрд╕рд░рд╛ рд╡рд┐рдХрд▓реНрдк рдЪреБрдирд╛ рдЧрдпрд╛ рдерд╛ рдФрд░ рдКрдкрд░ рд╡рд░реНрдгрд┐рдд рдЕрд╕реБрд╡рд┐рдзрд╛ рдХреЛ рдЦрддреНрдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛ рд▓рд┐рдЦрдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред
рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, Warcraft III рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рдЪрд▓рддрд╛ рд╣реИред
рд╡рд┐рдВрдбреЛ рдореЛрдб рдореЗрдВ рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдиреНрдЪ рдХрдорд╛рдВрдб рдореЗрдВ "-рд╡рд┐рдВрдбреЛ" рд╕реНрд╡рд┐рдЪ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдпрд╣ рдЖрдкрдХреЛ рд╡рд┐рдВрдбреЛрдЬрд╝ рдХреИрдкреНрдЪрд░ рдореЛрдб рдореЗрдВ рдХреИрдкреНрдЪрд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрдЧрд╛ред
рд╡рд┐рдВрдбреЛ рдХреЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд╖реЗрддреНрд░ рдХреЗ рднреАрддрд░ рдХрд░реНрд╕рд░ рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдг рд▓рд┐рдЦрд╛ рдЧрдпрд╛ рдерд╛ред рдЙрд╕рдХреЗ рдХрд╛рдо рдХрд╛ рдореБрдЦреНрдп рдЪрдХреНрд░ рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
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); } } }
рдпрд╣ рдХреНрд▓рд┐рдкрд╣реИрд▓реНрдкрд░ рд╣реЗрд▓реНрдкрд░ рдХреНрд▓рд╛рд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реНрд╕рд░ рд░рд┐рдЯреЗрдВрд╢рди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдлреБрд▓рд╕реНрдХреНрд░реАрди рд╡рд░реНрдЧ рдХреЛ рдкреВрд░реНрдг-рд╕реНрдХреНрд░реАрди рдореЛрдб рдореЗрдВ рд╕рдВрдХреНрд░рдордг рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдФрд░ рдЗрд╕рд╕реЗ рдкреБрдирд░реНрд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд░рддрд╛ рд╣реИред рд▓реВрдк рд╣реА 500 рдПрдордПрд╕ рдХреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рдХреНрд░рд┐рдп рд╡рд┐рдВрдбреЛ рдкреЛрд▓рд┐рдВрдЧ рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред рдореБрдЭреЗ рдпрд╣ рдХреНрд╖рдг рдмрд┐рд▓рдХреБрд▓ рдкрд╕рдВрдж рдирд╣реАрдВ рдЖрдпрд╛, рд▓реЗрдХрд┐рди рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдореБрдЭреЗ рдкреВрд░реА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдереА, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рдЕрдиреБрдХреВрд▓рди рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ, рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╡рд┐рд╢рд▓рд┐рд╕реНрдЯ рддреБрд░рдВрдд рджрд┐рдЦрд╛рдИ рджреА:
- рдХреНрд▓рд┐рдк рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреНрд╖реЗрддреНрд░ рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдХреНрд▓рд┐рдХ (рдорддрджрд╛рди рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдкрдХрдбрд╝) рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдмрд╛рд╣рд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рддрд╛рдХрд┐ рдЦрд┐рдбрд╝рдХреА рдХреЛ рдЦреАрдВрдЪрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛ;
- рдЦреЗрд▓ рдХреЗ рджреМрд░рд╛рди рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рд╕реЗ рдирд╛рд░рд╛рдЬ (рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдЕрдЧрд░ рдпрд╣ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ)ред рдкрд╣рд▓рд╛ рд╡рд┐рдЪрд╛рд░ рдЗрд╕реЗ рдкреНрд░реЛрдЧреНрд░рд╛рдореЗрдЯрд┐рдХ рд░реВрдк рд╕реЗ рдЫрд┐рдкрд╛рдиреЗ рдХрд╛ рдерд╛ред рд▓реЗрдХрд┐рди рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЧреЗрдо рд╕реЗ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдХреЗ рдХреНрд╖рдгреЛрдВ рдХреЛ рдЯреНрд░реИрдХ рдХрд░рдирд╛ рдФрд░ рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдХреЛ рд╡рд╛рдкрд╕ рджрд┐рдЦрд╛рдирд╛ рдЖрд╡рд╢реНрдпрдХ рд╣реЛрдЧрд╛ред рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдЯрд╛рд╕реНрдХрдмрд╛рд░ рдХреЗ рдмрд┐рдирд╛ рдЫреЛрдбрд╝рдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдмрдврд╝ рдЧрдпрд╛ред рдЗрд╕рд▓рд┐рдП, рдореИрдВрдиреЗ рдЧреЗрдо рд╡рд┐рдВрдбреЛ рдХреЛ рдореЙрдирд┐рдЯрд░ рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд╕рд╛рдЗрдЬрд╝ рдореЗрдВ рдмрджрд▓рдХрд░ рдлреБрд▓рд╕реНрдХреНрд░реАрди рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХрд░рдиреЗ рдХрд╛ рдирд┐рд░реНрдгрдп рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдпрд╣ рд╡рд┐рдВрдбреЛ рдЕрд╕рд╛рдЗрди рдХреА рдЧрдИ рд╣реИ:
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, &mi)) return false; if (!GetWindowRect(m_hwnd, &m_origWindowRect)) { SecureZeroMemory(&m_origWindowRect, sizeof(m_origWindowRect)); 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;
рдФрд░ рдХрд╛рд░реНрдп рдХрд╛ рдореБрдЦреНрдп рдЪрдХреНрд░ рдирд┐рдореНрди рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдШрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛:
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 рдкрд░ рдЕрдкрд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред