Закрыть окно при клике на экран вне определённого окна.

gbcdev96

Путник
VIP
Сообщения
58
Розыгрыши
0
Репутация
0
Реакции
1
Баллы
31
Привет, ребята, я пытаюсь написать код, чтобы закрыть окно при клике за его пределами. Не знаю, насколько это сложно, но я посмотрел события, и мне кажется, что эти подходят:

event OnLButtonDown( WindowHandle a_WindowHandle, int X, int Y );
event OnLButtonUp( WindowHandle a_WindowHandle, int X, int Y );
event OnLButtonDblClick( int X, int Y );

Так как я новичок в UC и не имею понятия, как отлаживать код, я использовал чат для вывода координат клика:

function OnLButtonDblClick(int X, int Y)
{
local Color Color;
local Rect rectWnd;

Color.R = byte(255);
Color.G = byte(255);
Color.B = byte(255);
Color.A = byte(255);

NormalChat = ChatWindowHandle(GetHandle("ChatWnd.NormalChat"));
NormalChat.AddString("x" $string(x), Color);
NormalChat.AddString("y" $string(y), Color);

xxGetWindowHandle("AutoPotionsWnd.configPotions").HideWindow();
}

function OnLButtonDown(WindowHandle a_WindowHandle, int X, int Y)
{
local UserInfo UserInfo;
local Color Color;
local Rect rectWnd;

Color.R = byte(255);
Color.G = byte(255);
Color.B = byte(255);
Color.A = byte(255);

NormalChat = ChatWindowHandle(GetHandle("ChatWnd.NormalChat"));
NormalChat.AddString("handle_name" $a_WindowHandle.GetWindowName(), Color);
NormalChat.AddString("x" $string(x), Color);
NormalChat.AddString("y" $string(y), Color);
}

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


 
throw the .u and lets find out
 
Привет, ребята, я пытаюсь написать код, чтобы закрыть окно при клике за его пределами. Не знаю, насколько это сложно, но я посмотрел события, и мне кажется, что эти подходят:



Так как я новичок в UC и не имею понятия, как отлаживать код, я использовал чат для вывода координат клика:



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


Это эсенс клиент или какой?
 
throw the .u and lets find out
Я не смог прикрепить, не позволяет .u. Я не знаю, разрешена ли загрузка на этом сайте, но я сделал это там. Мне нужно скрывать окно AutoPotions.configPotions, когда нажимаешь вне него.:
 
да чекай таймером фокус на этом окне и закрывай если фокус спал
 
ну я хз как там с интерлюдами, но на хф+ можно как то закостылить если уж прям оч хочется

Код:
function OnShow()
{       
    Me.SetTimer(1122, 100);
}

function OnTimer(int TimerID)
{   
    if (TimerID == 1122)
    {
        Me.KillTimer(1122);
        if (Me.IsFocused())
            Me.SetTimer(1122, 100);
        else
            Me.HideWindow();
    }
}
 
ну я хз как там с интерлюдами, но на хф+ можно как то закостылить если уж прям оч хочется

Код:
function OnShow()
{      
    Me.SetTimer(1122, 100);
}

function OnTimer(int TimerID)
{  
    if (TimerID == 1122)
    {
        Me.KillTimer(1122);
        if (Me.IsFocused())
            Me.SetTimer(1122, 100);
        else
            Me.HideWindow();
    }
}

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

Код:
function OnShow()
{      
    Me.SetTimer(1122, 100);
}

function OnTimer(int TimerID)
{  
    if (TimerID == 1122)
    {
        Me.KillTimer(1122);
        if (Me.IsFocused())
            Me.SetTimer(1122, 100);
        else
            Me.HideWindow();
    }
}
Я попробовал, но думаю, что это не сработает таким образом, не для этого сценария.
function OnClickButton(string a_params)
{
switch(a_params)
{
case "stngBtn":
sendChatMsg("set up focus on configpotions");
showfocutios("AutoPotionsWnd.configPotions");
_configPotions.SetTimer(1122, 1000);
// End:0x157
break;
// End:0x154
case "ApplyBtn":
xxGetWindowHandle("AutoPotionsWnd.configPotions").HideWindow();
updaterinfo();
break;
default:
break;
}
return;
}

Когда я нажимаю на кнопку stngBtn, я устанавливаю таймер:

function OnTimer(int a_params)
{
switch(a_params)
{
case 1122:
if (_configPotions.IsFocused()) {
sendChatMsg("on timer is focused");

_configPotions.SetTimer(1122, 1000);

return;
}

sendChatMsg("not is focused");

_configPotions.HideWindow();
_configPotions.KillTimer(1122);

break;
default:
break;
}
return;
}

Но возникнет проблема, потому что у меня есть тикер, который является дочерним элементом этого окна _configPotions, и при нажатии на него фокус будет потерян.
Вы знаете, есть ли какая-нибудь альтернатива? Я пробовал создать вспомогательную переменную в обработчике тикера, но это не сработает, потому что при нажатии на тикер окно теряет фокус.
 

Вложения

  • 1735597128125.webp
    1735597128125.webp
    18,4 КБ · Просмотры: 9
а зачем тебе это? бот-ферму настраиваешь?))
 
не знаю на сколько это работает на интерлюде. но на ХФ конекст меню закрывается так.
Код:
function OnMouseOut( WindowHandle a_WindowHandle )
{
  Me.SetTimer(3368, 1000);
 
}
function OnMouseOver( WindowHandle a_WindowHandle )
{

  Me.KillTimer(3368);
}
 
не знаю на сколько это работает на интерлюде. но на ХФ конекст меню закрывается так.
Код:
function OnMouseOut( WindowHandle a_WindowHandle )
{
  Me.SetTimer(3368, 1000);
 
}
function OnMouseOver( WindowHandle a_WindowHandle )
{

  Me.KillTimer(3368);
}

в IL таких подписей нет :/
 
а такое есть у вас на интерлюде?
Код:
function OnLButtonDown (WindowHandle a_WindowHandle, int X, int Y)
{    
    if (a_WindowHandle == Me) 
    {
        Me.HideWindow();
    }
}
 
C++:
function OnFocus(bool bFlag, bool bTransparency)
{
    if (!bFlag)
    {
        _configPotions.HideWindow();
    }
}
 
C++:
function OnFocus(bool bFlag, bool bTransparency)
{
}
Я не видел что бы это было реализовано в interlude
|
Я тоже пытался придумать, как отследить потерю фокуса, но у меня не получилось(
У кого-то еще есть идеи?
 
Назад
Сверху Снизу