1

Тема: AHK: Ждать пока у программы появится крестик для закрытия

Задача - дождаться пока загрузится программа.
Когда она загрузится появляется в правом углу крестик для закрытия.
Как этот момент определить?
Через Aсс не получается.

Loop
    If ExistAccDescription(WinExist("A"), "Closes the window")  
        MsgBox
    return 

ExistAccDescription(winid, Desc)
{
    if !IsObject(AccObj := Acc_ObjectFromWindow(winid))
        Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccDescription(AccObj, Desc) ? 1 : 0
}    

FindAccDescription(AccObj, Desc)
{    
    try if (AccObj.accDescription(0) = Desc)  
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccDescription(v, Desc)  
            Return 1
}  

2

Re: AHK: Ждать пока у программы появится крестик для закрытия

Возможно SetWinEventHook, и возможно EVENT_OBJECT_CREATE.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

3

Re: AHK: Ждать пока у программы появится крестик для закрытия

А почему через AccDescription не получается?

4 (изменено: Malcev, 2014-06-11 20:30:46)

Re: AHK: Ждать пока у программы появится крестик для закрытия

Вот такой код не работает:

f11::

Loop
    If ExistAccName(WinExist("A"), "Close")  
        MsgBox
    return 

ExistAccName(winid, Desc)
{
    if !IsObject(AccObj := Acc_ObjectFromWindow(winid))
        Return 0 ;  "Не удалось получить IAccessible"  
    Return FindAccName(AccObj, Desc) ? 1 : 0
}    

FindAccName(AccObj, Desc)
{    
    try if (AccObj.accName(0) = Desc)  
        Return 1

    for k, v in Acc_Children(AccObj)
        if FindAccName(v, Desc)  
            Return 1
}  

А такой работает (при навидении мышкой на крестик выскакивает msgbox):

loop
{
   Acc :=    Acc_ObjectFromPoint(child) 
   if   (Acc.accName(child)="Close")
      msgbox
}

Что изменить в первом, чтобы при нахождении крестика в активном окне выдавался msgbox?

5 (изменено: Malcev, 2014-06-11 22:50:16)

Re: AHK: Ждать пока у программы появится крестик для закрытия

Решил таким кодом:

hWnd:=WinExist("A")
hSysMenu:=DllCall("GetSystemMenu","Int",hWnd,"Int",FALSE)
if hSysMenu != 0
   msgbox

И все-таки мне непонятно, почему Acc не находит?