1

Тема: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Доброго времени суток . Есть программа которая при нажатии на кнопку закрыть (крестик) не закрывается а сворачивается в трей. Как сделать так что бы при нажатии на кнопку закрыть (крестик) программа закрывалась, а не сворачивалась в трей.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

2 (изменено: svoboden, 2017-02-03 14:05:59)

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

В настройках программы, видимо, что-то нажал. Что за программа? Или командой Process, вырубай программу,
например:

Process, Close, notepad.exe

3

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Были темы о подмене действий при нажатии на крестик. Стоит только поискать.

4

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Уважаемый ypppu извините но я ненашёл подобных тем на нашем форуме (может быть плохо искал),если не трудно дайте ссылку на одну из этих тем.

OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

5

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Есть такая тема в Коллекции. В ней имеется код

DllCall( "GetSystemMenu", "Uint", hWnd, "int", True ) ; восстанавливаем системное меню

У меня есть программа, в которой изначально крестик не закрывает программу. Пробовал в ней восстановить системное меню - не помогло. Может быть у Вас получится.

6

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Ну я из из предоставленной темы ничего непонял. Вот даю папаметры приложения.


Title - OscareditorForm
Class - ahk_class TMainForm 
ProcessName - ahk_exe OscarEditor.exe
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

7

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

WinGet, hWnd, ID, ahk_class TMainForm ahk_exe OscarEditor.exe ; получаем хэндл OscarEditor
hSysMenu := DllCall( "GetSystemMenu", "Uint", hWnd, "int", False ) ; получаем хэндл системного меню
DllCall( "GetSystemMenu", "Uint", hWnd, "int", True ) ; восстанавливаем системное меню

8

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

У меня так с блокнотом работает (при нажатии на крестик минимизирует окно):

#IfWinActive ahk_class Notepad
LButton::
Click Down
IfWinNotActive ahk_class Notepad
{
   KeyWait LButton
   Click Up
}
return

LButton Up::
CoordMode, Mouse, Screen
MouseGetPos, x, y
SendMessage, 0x84,, (x & 0xFFFF) | (y & 0xFFFF) << 16  ; WM_NCHITTEST
if (ErrorLevel = 20) ; close button
   WinMinimize, A
Click Up
return
#IfWinActive

9 (изменено: Ядрён, 2016-12-29 01:25:14)

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Оба скрипта не работают . Я не понимаю как можно сделать ожидание нажатия на кнопку (X) .
Если только при помощи команды.

MouseGetPos

Но как я непойму ,попав на координаты кнопки внутри окна послдать нужную команду.

WinClose или Process, Close
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).

10 (изменено: Malcev, 2016-12-29 03:32:05)

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

#IfWinActive OscareditorForm
LButton::
Click Down
IfWinNotActive OscareditorForm
{
   KeyWait LButton
   Click Up
}
return

LButton Up::
CoordMode, Mouse, Screen
MouseGetPos, x, y
SendMessage, 0x84,, (x & 0xFFFF) | (y & 0xFFFF) << 16  ; WM_NCHITTEST
if (ErrorLevel = 20) ; close button
{
   WinGet, pid, pid, A
   Process, Close, %pid%
   NoTrayOrphans()     ; очистить трей от иконок закрытых приложений
}
Click Up
return
#IfWinActive


NoTrayOrphans()
{
    TrayInfo := TrayIcons("ahk_class Shell_TrayWnd", "ToolbarWindow32" . GetTrayBar())  
        . TrayIcons("ahk_class NotifyIconOverflowWindow", "ToolbarWindow321")
 
    Loop, Parse, TrayInfo, `n
    {  
        PID := StrX(A_Loopfield, "| PID: ", " |") 
        If !PID
            RemoveTrayIcon(StrX(A_Loopfield, "| hWnd: ", " |"), StrX(A_Loopfield, "| uID: ", " |"))   
    }
}

TrayIcons(traywindow, control)  
{
    DetectHiddenWindows, On
    WinGet, pidTaskbar, PID, %traywindow%
    hProc := DllCall("OpenProcess", "Uint", 0x38, "int", 0, "Uint", pidTaskbar)
    pProc := DllCall("VirtualAllocEx", "Uint", hProc, "Uint", 0, "Uint", 32, "Uint", 0x1000, "Uint", 0x4)
    SendMessage, 0x418, 0, 0, %control%, %traywindow%
    Loop, %ErrorLevel%
    {
        SendMessage, 0x417, A_Index - 1, pProc, %control%, %traywindow%
        VarSetCapacity(btn, 32, 0), VarSetCapacity(nfo, 32, 0)
        DllCall("ReadProcessMemory", "Uint", hProc, "Uint", pProc, "Uint", &btn, "Uint", 32, "Uint", 0)
        iBitmap := NumGet(btn, 0)
        idn := NumGet(btn, 4)
        Statyle := NumGet(btn, 8)
        If dwData := NumGet(btn, 12)
            iString := NumGet(btn, 16)
        Else
        {
            dwData := NumGet(btn, 16, "int64")
            iString := NumGet(btn, 24, "int64")
        }
        DllCall("ReadProcessMemory", "Uint", hProc, "Uint", dwData, "Uint", &nfo, "Uint", 32, "Uint", 0)
        If NumGet(btn,12)
        {
            hWnd := NumGet(nfo, 0)
            uID := NumGet(nfo, 4)
            nMsg := NumGet(nfo, 8)
            hIcon := NumGet(nfo, 20)
        }
        Else
        {
            hWnd := NumGet(nfo, 0, "int64")
            uID := NumGet(nfo, 8)
            nMsg := NumGet(nfo, 12)
            hIcon := NumGet(nfo, 24)
        }
        WinGet, pid, PID, ahk_id %hWnd%
        WinGet, sProcess, ProcessName, ahk_id %hWnd%
        WinGetClass, sClass, ahk_id %hWnd% 
        VarSetCapacity(sTooltip, 128)
        VarSetCapacity(wTooltip, 128*2)
        DllCall("ReadProcessMemory", "Uint", hProc, "Uint", iString, "Uint", &wTooltip, "Uint", 128*2, "Uint", 0)
        DllCall("WideCharToMultiByte", "Uint", 0, "Uint", 0, "str", wTooltip, "int", -1, "str", sTooltip, "int", 128, "Uint", 0, "Uint", 0)
        sTrayIcons .= "| Pid: " pid " | uID: " uID " | hWnd: " hWnd " |`n" 
    }
    DllCall("VirtualFreeEx", "Uint", hProc, "Uint", pProc, "Uint", 0, "Uint", 0x8000)
    DllCall("CloseHandle", "Uint", hProc)
    Return sTrayIcons
}

GetTrayBar()
{
    ControlGet, hParent, hWnd,, TrayNotifyWnd1, ahk_class Shell_TrayWnd
    ControlGet, hChild, hWnd,, ToolbarWindow321, ahk_id %hParent%
    Loop
    {
        ControlGet, hWnd, hWnd,, ToolbarWindow32%A_Index%, ahk_class Shell_TrayWnd
        If (hWnd == hChild)
            idxTB := A_Index
        If !hWnd || (hWnd == hChild)
            Break
    }
    Return idxTB
}

StrX(H, BS = "", ES = "", Tr = 1, ByRef OS = 1)
{
    Return (SP := InStr(H, BS, 0, OS)) && (L := InStr(H, ES, 0, SP + StrLen(BS))) && (OS := L + StrLen(ES)) ? SubStr(H, SP := Tr ? SP + StrLen(BS) : SP, (Tr ? L : L + StrLen(ES)) -SP) : ""
}

RemoveTrayIcon(hWnd, uID, nMsg = 0, hIcon = 0, nRemove = 2)
{
    NumPut(VarSetCapacity(ni,444,0), ni)
    NumPut(hWnd, ni, 4)
    NumPut(uID, ni, 8)
    NumPut(1|2|4, ni, 12)
    NumPut(nMsg, ni, 16)
    NumPut(hIcon, ni, 20)
    Return DllCall("shell32\Shell_NotifyIconA", "Uint", nRemove, "Uint", &ni)
}

11

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Можно так попробовать. Запускайте программу таким скриптом:

ExePath := "OscarEditor.exe"  ; здесь прописать полный путь к исполнимому файлу

Run, % ExePath,,, PID
WinWait, ahk_id %PID%
WinWaitClose
Process, Close, OscarEditor.exe

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

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

12

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

teadrinker, у тебя ошибка. Правильно так:

ExePath := "OscarEditor.exe"  ; здесь прописать полный путь к исполнимому файлу

Run, % ExePath,,, PID
WinWait, ahk_pid %PID%
WinWaitClose
Process, Close, %PID%

13

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Почему ошибка? Там может быть название процесса.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

14

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Может, но у тебя стоит ожидание хендла:

WinWait, ahk_id %PID%

15

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Ну да, твой вариант логичнее, но мой сработает тоже, ошибки нет.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

16 (изменено: Malcev, 2016-12-29 05:49:41)

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Как же он сработает, когда хендл у окна будет другой?

After the Run command retrieves a PID, any windows to be created by the process might not exist yet. To wait for at least one window to be created, use WinWait ahk_pid %OutputVarPID%.

А у тебя:

WinWait, ahk_id %PID%

https://autohotkey.com/docs/commands/Run.htm

17

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

А, я не понял о чём ты, тогда да, опечатка. Но ещё логичнее так будет:

ExePath := "OscarEditor.exe"  ; здесь прописать полный путь к исполнимому файлу

Run, % ExePath
WinWait, OscareditorForm ahk_class TMainForm
WinWaitClose
Process, Close, OscarEditor.exe
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

18 (изменено: Malcev, 2016-12-29 06:10:28)

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Если открытых приложений и процессов может быть одновременно несколько, по типу как у блокнота - тогда этот вариант может не подойти.

19 (изменено: Ядрён, 2016-12-29 06:15:38)

Re: AHK: Закрыть окно программы которое сворачивается в трей при закрытии

Всем огромное спасибо за участие. Подошёл скрипт от teadrinker , вам отдельное спасибо .
Блин и как же я сам не догадался , всё гениальное просто.

WinWaitClose
OS: Win11x64, AutoHotkey v1.1.25.01 (Unicode 64-bit).