1 (изменено: Samotek, 2023-11-30 13:54:17)

Тема: AHK: при закрытии чужого окна минимизировать его

Как сделать так, чтобы при закрытии последнего окна FireFox, оно не закрывалось, а минимизировалось?

2

Re: AHK: при закрытии чужого окна минимизировать его

Думаю, простого способа нет. Нужно динамически отслеживать положение на экране окна FF и его кнопки "Закрыть", и перед кликом проверять координаты. В FF этот элемент управления нестандартный, поэтому придётся использовать IAccessible или IUIAutomation интерфейсы.

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

3 (изменено: Samotek, 2023-11-30 16:20:04)

Re: AHK: при закрытии чужого окна минимизировать его

teadrinker
Спасибо, понятно. ((

4

Re: AHK: при закрытии чужого окна минимизировать его

Я бы для данной задачи использовал WH_CBT хук.
https://www.autohotkey.com/boards/viewtopic.php?t=94344

5

Re: AHK: при закрытии чужого окна минимизировать его

Так придётся же dll на C++ писать? Хотя, возможно, ChatGpt такое может осилить. Потом чем-то компилировать нужно.

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

6

Re: AHK: при закрытии чужого окна минимизировать его

Наверно проще через поиск картинки отслеживать одну единственную вкладку.

Win11x64, AHK v1.1.37.01 (Unicode 64-bit), AHK v2.0.17| AHK-Wiki | Переменные и выражения | RegEx101

7 (изменено: serzh82saratov, 2023-12-01 19:41:26)

Re: AHK: при закрытии чужого окна минимизировать его

teadrinker пишет:

Так придётся же dll на C++ писать? Хотя, возможно, ChatGpt такое может осилить. Потом чем-то компилировать нужно.

Зачем писать, можно анк длл инжектить. Я как то пробовал, хук на закрытие окна работал.
И скрипту висеть не надо, запустил заинжектил закрылся.
Пардон, на открытие его пробовал, надо было предотвращать появление окон. Но думаю разницы никакой, хук тот же.

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

8

Re: AHK: при закрытии чужого окна минимизировать его

Этак придётся в каждое открываемое окно инжектить. По-моему, проще уж мой первый вариант реализовать.

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

9

Re: AHK: при закрытии чужого окна минимизировать его

Без инжекта конечно правильней. А вот что проще, у каждого по своему.)

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

10

Re: AHK: при закрытии чужого окна минимизировать его

Я инжект рассматриваю, как самый крайний вариант, когда других нет, так как он потенциально может нарушить работоспособность программы. Да и с антивирусом придётся договариваться.

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

11

Re: AHK: при закрытии чужого окна минимизировать его

Вот кстати про этот хук и DLL для него разговоры уже давно, но пока никто не похвастался.

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

12

Re: AHK: при закрытии чужого окна минимизировать его

Я как-то вроде пробовал, запряг ChatGPT, но в итоге как-то с проблемами работало. Могу позже ещё раз попробовать.

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

13

Re: AHK: при закрытии чужого окна минимизировать его

Думаю, самым простым (но некрасивым) будет решение поверх кнопки [X] целевого окна каким-то образом прикрепить свою кнопку [X], которая уже будет делать то, что нам нужно.

14

Re: AHK: при закрытии чужого окна минимизировать его

Malcev пишет:

Я бы для данной задачи использовал WH_CBT хук.

Попробовал WH_CBT. С блокнотом работает так:

#include <Windows.h>

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_SYSCOMMAND && wParam == SC_CLOSE)
    {
        HWND hWnd = GetForegroundWindow();
        char className[256];
        GetClassNameA(hWnd, className, 256);

        if (strcmp(className, "Notepad") == 0)
        {
            bool hasOtherWindows = false;
            HWND hWndOther = FindWindowA("Notepad", NULL);
            while (hWndOther != NULL)
            {
                if (hWndOther != hWnd)
                {
                    hasOtherWindows = true;
                    break;
                }
                hWndOther = FindWindowExA(NULL, hWndOther, "Notepad", NULL);
            }

            if (!hasOtherWindows)
            {
                ShowWindow(hWnd, SW_MINIMIZE);
                return 1;
            }
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

И так:

#include <Windows.h>

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
    if (nCode == HCBT_DESTROYWND)
    {
        HWND hWnd = (HWND)wParam;
        char className[256];
        GetClassNameA(hWnd, className, 256);
        
        if (strcmp(className, "Notepad") == 0)
        {
            bool hasOtherWindows = false;
            HWND hWndOther = FindWindowA("Notepad", NULL);
            while (hWndOther != NULL)
            {
                if (hWndOther != hWnd)
                {
                    hasOtherWindows = true;
                    break;
                }
                hWndOther = FindWindowExA(NULL, hWndOther, "Notepad", NULL);
            }

            if (!hasOtherWindows)
            {
                ShowWindow(hWnd, SW_MINIMIZE);
                return 1;
            }
        }
    }

    return CallNextHookEx(NULL, nCode, wParam, lParam);
}

С FF ни один из этих вариантов не работает. HCBT_SYSCOMMAND вообще не перехватывает, а HCBT_DESTROYWND отлавливает, сначала вроде минимизируется, но потом исчезает.

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

15

Re: AHK: при закрытии чужого окна минимизировать его

Там разве нельзя указать, что только для окон своего процесса, чтобы сделать немного универсальнее. Или с реестра читать свои настройки.
И с инжектом не пробовал?

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

16

Re: AHK: при закрытии чужого окна минимизировать его

serzh82saratov пишет:

только для окон своего процесса

Для какого — своего? Мы же окно чужого процесса отлавливаем. Когда для своего, dll не нужно писать.
С инжектом не пробовал.

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

17

Re: AHK: при закрытии чужого окна минимизировать его

Да, попутал, она же в процессе ахк выполняется.

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

18 (изменено: Malcev, 2023-12-03 06:53:54)

Re: AHK: при закрытии чужого окна минимизировать его

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

19

Re: AHK: при закрытии чужого окна минимизировать его

Да, тоже так думаю.

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

20

Re: AHK: при закрытии чужого окна минимизировать его

Хотя HCBT_SYSCOMMAND у меня пресекается, возможно надо через uia запускать.

#include <Windows.h>

extern "C" __declspec(dllexport) LRESULT CALLBACK CBTProc(
	_In_ int    nCode,
	_In_ WPARAM wParam,
	_In_ LPARAM lParam
)
{
	if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);

	switch(nCode)
	{
		case HCBT_DESTROYWND:
		case HCBT_SYSCOMMAND:
			return 1; // Prevent
	}
	return 0;
}

Компилирую через:

C:\TDM-GCC-64\bin\gcc -c source.cpp
C:\TDM-GCC-64\bin\gcc -shared -o mydll.dll source.o

21

Re: AHK: при закрытии чужого окна минимизировать его

У меня один раз перехватило сворачивание, и больше с FF не работало.

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

22

Re: AHK: при закрытии чужого окна минимизировать его

У меня всегда перехватывает HCBT_MINMAX.
Пробуй запускать через UIA.

23

Re: AHK: при закрытии чужого окна минимизировать его

Запускал, у меня нет разницы.

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

24

Re: AHK: при закрытии чужого окна минимизировать его

Со стандартными окнами работает, без UIA.

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

25 (изменено: Malcev, 2023-12-03 18:20:59)

Re: AHK: при закрытии чужого окна минимизировать его

Возможно у броузеров дополнительная защита стоит, так как с хромом и фаерфоксом у меня стало срабатывать только после запуска через uia.

26

Re: AHK: при закрытии чужого окна минимизировать его

Попробовал ещё с Edge, минимизацию перехватывает, после закрытия крашится.

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

27

Re: AHK: при закрытии чужого окна минимизировать его

Спасибо, большое, всем откликнувшимся, но для меня это слишком сложно. Но, если бы кто-то реализовал такое да еще для окна любого приложения, то можно было бы написать что-то вроде Minimize(Close) To Tray. Хотя мне было бы достаточно для Firefox.