1

Тема: AHK: хук для отслеживания появления/закрытия окон в системе

А есть ли возможность установить аналогичный этому хук, который бы отслеживал появление/закрытие окон в системе?

Нужно для скрипта, реализовывающего оконный фильтр (фильтрация окон по их WinTitle).

2

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Всех окон или только определённых? WinWait, WinWaitClose пробовали?

3

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Гм, как-то не додумался сделать всего-то в пару строк сделать убийство плохих окон:

GroupAdd, nastyWindows, Skype™ - Обновить ahk_class TUpgradeForm ahk_exe skype.exe
GroupAdd, nastyWindows, Skype™ - Ваше мнение о качестве связи ahk_class TCallQualityForm ahk_exe skype.exe
Loop
{
    WinWait, ahk_group nastyWindows
    WinClose
}

Спасибо, видимо, вопрос закрыт.

4 (изменено: DD, 2014-06-22 17:38:37)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Вместо постоянного цикла наверно лучше использовать пример отсюда: http://forum.script-coding.com/viewtopic.php?pid=64279
Там я выпытал объяснение разницы у нашего уважаемого creature.ws))

5

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Там идёт речь, вроде, не о показе и скрытии окон, а о их создании и активации, что не одно и то же. Окно может быть создано, но не показано. А иногда окно может быть показано, но не активировано.

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

6 (изменено: DD, 2014-06-22 18:42:49)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

На самом деле тот пример отслеживает события создания или активации определенных окон. В этом ключе я его с тех пор и гоняю.


OnWindowCreated("ahk_class Notepad", "Notepad_Created") ; первый параметр — window title в стандартном формате ahk, второй параметр — имя процедуры, которая должна выполнятся при создании окна с заданными первым параметром характеристиками

OnWindowActivated("ahk_class Notepad", "Notepad_Activated") ; первый параметр — window title в стандартном формате ahk, второй параметр — имя процедуры, которая должна выполнятся при активации окна с заданными первым параметром характеристиками

;!!return ; конец секции автовыполнения. не обязателен, но приемлем.

Notepad_Created(hWnd) ; эта процедура будет выполнятся при каждом создании окна
{
  SplashImage,, M C11 ZH0 ZW0 ZX1 ZY1 B1 CTffffff CW8B0000 FM11 FS6 WM600 WS400,, Окно СОЗДАНО`nТеоретически его можно закрыть)))
  Sleep, 2000
  SplashImage, OFF
/*
  ; КОД ДЛЯ ЗАКРЫТИЯ ОКНА
  ActiveWinID := WinExist("A")
  WinClose, ahk_id %ActiveWinID%
*/
}

Notepad_Activated(hWnd) ; активация
{
  SplashImage,, M C11 ZH0 ZW0 ZX1 ZY1 B1 CTffffff CW8B0000 FM11 FS6 WM600 WS400,, Окно АКТИВИРОВАНО`nТеоретически его можно закрыть)))
  Sleep, 2000
  SplashImage, OFF
/*
  ; КОД ДЛЯ ЗАКРЫТИЯ ОКНА
  ActiveWinID := WinExist("A")
  WinClose, ahk_id %ActiveWinID%
*/
}

OnWindowCreated(winTitle, procName = "", maxThreads = 1)
{
    global ShellHookActionList
 
    IsObject(ShellHookActionList) || ShellHookActionList := Object()
    IsObject(ShellHookActionList[1]) || ShellHookActionList[1] := Object()
 
    if procName
        ShellHookActionList[1][winTitle] := procName
    else
        return ShellHookActionList[1][winTitle]
 
    if !OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK")) {
        DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
        OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc", maxThreads)
    }
}
 
OnWindowActivated(winTitle, procName = "", maxThreads = 1)
{
    global ShellHookActionList
 
    IsObject(ShellHookActionList) || ShellHookActionList := Object()
    IsObject(ShellHookActionList[4]) || ShellHookActionList[4] := Object()
 
    if procName
        ShellHookActionList[4][winTitle] := procName
    else
        return ShellHookActionList[4][winTitle]
 
    if !OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK")) {
        DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
        OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc", maxThreads)
    }
}
 
ShellProc(wParam, lParam)
{
    global ShellHookActionList
 
    if ShellHookActionList.HasKey(wParam) {
        for winTitle, procName in ShellHookActionList[wParam] {
            WinGet, hWndList, List, %winTitle%
            loop %hWndList%
                continue
            until hWndList%A_Index% = lParam && found := true
 
            if (found)
                %procName%(lParam), found := false
        }
    }
    return
}


Только неудобно, что приходится для каждого окна прописывать свою функцию.

7

Re: AHK: хук для отслеживания появления/закрытия окон в системе

DD пишет:

На самом деле тот пример отслеживает события создания или активации определенных окон.

Ну, так а я о чём?
А вопрос-то был:

хук, который бы отслеживал появление/закрытие окон в системе?

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

8 (изменено: DD, 2014-06-22 19:00:53)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Ну появление окна он отслеживает. Кроме того, судя по содержанию третьего поста (на который, собственно, и отвечал), я так понял, что задача была именно "убийство плохих окон", которые вылазят по созданию или активации. Что этот пример и делает, но без цикла.

9

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Для каких-то случаев, конечно, подойдёт. Но если появившееся окно не будет только что создано, и не получит активности — не сработает.

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

10 (изменено: DD, 2014-06-22 19:19:17)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Я запустил скрипт, назначил окно браузера поверх всех окон и запустил Блокнот. Скрипт на создание среагировал. Т.е. видимо можно ему послать сообщение о закрытии, остановить процесс по PID или еще что-то...

11

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Да, сейчас проверил, действительно на появление окон реагирует как на создание. Я думал, создание — это только когда окно создаётся впервые. Значит, и правда подойдёт для всех случаев.

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

12 (изменено: serzh82saratov, 2014-06-24 02:39:04)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Помоему пример слишком избыточен. Цикл с ожиданием, ничем не плох в контексте отдельного скрипта, другое дело если ТС потом понадобится переместить это в другой скрипт, тогда этого должно быть достаточно:


GroupAdd, nastyWindows, Skype™ - Обновить ahk_class TUpgradeForm ahk_exe skype.exe
GroupAdd, nastyWindows, Skype™ - Ваше мнение о качестве связи ahk_class TCallQualityForm ahk_exe skype.exe
GroupAdd, nastyWindows, ahk_class Notepad ahk_exe notepad.exe
WinClose, ahk_group nastyWindows

OnExit, Exit
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")
Return

Exit: 
    DllCall("DeregisterShellHookWindow", "UInt", A_ScriptHwnd)
    ExitApp
    
ShellProc(nCode)  { 
    if (nCode = 1) {  ; HSHELL_WINDOWCREATED
        WinClose, ahk_group nastyWindows
    }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

13

Re: AHK: хук для отслеживания появления/закрытия окон в системе

serzh82saratov,
вообще, я вот что-то типа такого и ожидал. Спасибо.
QFT:

+ открыть спойлер
GroupAdd, nastyWindows, Skype™ - Обновить ahk_class TUpgradeForm ahk_exe skype.exe
GroupAdd, nastyWindows, Skype™ - Ваше мнение о качестве связи ahk_class TCallQualityForm ahk_exe skype.exe
GroupAdd, nastyWindows, ahk_class Notepad ahk_exe notepad.exe
WinClose, ahk_group nastyWindows

OnExit, Exit
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")
Return

Exit: 
    DllCall("DeregisterShellHookWindow", "UInt", A_ScriptHwnd)
    ExitApp
    
ShellProc(nCode)  { 
    if (nCode = 1) {  ; HSHELL_WINDOWCREATED
        WinClose, ahk_group nastyWindows
    }
}

14

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Да, для дела закрытия — самое то.
Тоже благодарствую.

15 (изменено: Drugoy, 2014-06-26 17:44:21)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

serzh82saratov пишет:

Помоему пример слишком избыточен. Цикл с ожиданием, ничем не плох в контексте отдельного скрипта, другое дело если ТС потом понадобится переместить это в другой скрипт, тогда этого должно быть достаточно:

оказалось работает немного медленно: у меня есть 2 плохих окошка, которые появляются так: когда одно закрывают - появляется другое.
Второе окно с вашим кодом стало раз через раз закрываться.
Добавление "SetBatchLines, -1" не помогло.

16

Re: AHK: хук для отслеживания появления/закрытия окон в системе

По идее Critical должен буферизировать.


ShellProc(nCode)  { 
    Critical
    if (nCode = 1) {  ; HSHELL_WINDOWCREATED
        WinClose, ahk_group nastyWindows
    }
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

17

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Интересно, почему на диалоговое окно (Открытие/Сохранение) скрипт Сержа не реагирует, хотя в Опере у меня его запускает отдельный процесс (QSaver.exe)? —

GroupAdd, nastyWindows, ahk_class #32770
WinClose, ahk_group nastyWindows

OnExit, Exit
DllCall("RegisterShellHookWindow", "UInt", A_ScriptHwnd)
OnMessage(DllCall("RegisterWindowMessage", "str", "SHELLHOOK"), "ShellProc")
Return

Exit: 
    DllCall("DeregisterShellHookWindow", "UInt", A_ScriptHwnd)
    ExitApp
    
ShellProc(nCode)  { 
    if (nCode = 1) {  ; HSHELL_WINDOWCREATED

    Soundplay *48  ;Exclamation

    }
}

18

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Вообще говоря, можно ли мониторить диалоговые окна по сообщениям?

19

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Может эта тема поможет: SetWinEventHook.

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

20

Re: AHK: хук для отслеживания появления/закрытия окон в системе

По сообщениям ни одного диалога не отловилось.

21 (изменено: serzh82saratov, 2015-02-28 00:39:42)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Да, мне тоже СМС (на телефон) не приходило.

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

22

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Учитывая содержание темы, я имел ввиду не SMS сообщения, а MMS))

23

Re: AHK: хук для отслеживания появления/закрытия окон в системе

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

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

24

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Имелся в виду к примеру этот код, настроенный под дочерние окна:

EVENT_OBJECT_DESTROY := 0x8001

SetWinEventHook(EVENT_OBJECT_DESTROY, EVENT_OBJECT_DESTROY, 0, RegisterCallback("HookProc", "F"), 0, 0, 0)

TargetWinId := WinExist("ahk_class #32770")  

   
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{  
    Global TargetWinId
    If (hwnd = TargetWinId)
        msgbox !!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook" , UInt, eventMin
                                    , UInt, eventMax
                                    , Ptr, hmodWinEventProc
                                    , Ptr, lpfnWinEventProc
                                    , UInt, idProcess
                                    , UInt, idThread
                                    , UInt, dwFlags)
}
return

и тот что приводил несколько повыше.

25

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Ну и как этот код "употребляется"?

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

26

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Ну мне кажется он должен "арканить" окно по указанному классу, чего не происходит. Наверняка диалоговые окна не считаются за окна, а как-то иначе проходят.

27

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Ну мне кажется он должен "арканить" окно по указанному классу, чего не происходит.

Нет, этот код не должен.

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

28

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Т. е., это не полный код? чего-то не хватает?

29

Re: AHK: хук для отслеживания появления/закрытия окон в системе

чего-то не хватает?

Смысла.

Класс надо проверять в процедуре, и зачем EVENT_OBJECT_DESTROY если требуется появление окна.

 
#Persistent 
EVENT := 0x0006 ; EVENT_SYSTEM_MENUPOPUPSTART
Global tclass := "#32768"

SetWinEventHook(EVENT, EVENT, 0, RegisterCallback("HookProc", "F"), 0, 0, 0) 

   
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{   
    WinGetClass, class, ahk_id %hwnd% 
    If (class = tclass)
        msgbox !!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook" , UInt, eventMin
                                    , UInt, eventMax
                                    , Ptr, hmodWinEventProc
                                    , Ptr, lpfnWinEventProc
                                    , UInt, idProcess
                                    , UInt, idThread
                                    , UInt, dwFlags)
}
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: хук для отслеживания появления/закрытия окон в системе

А почему не EVENT_OBJECT_CREATE?

31

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Ну оно вроде не реагирует на эти окна. Хотя возможно вместо EVENT_SYSTEM_MENUPOPUPSTART поможет EVENT_OBJECT_SHOW, вообщем тут надо самому экспериментировать.

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

32 (изменено: serzh82saratov, 2015-03-01 11:31:33)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Вообще говоря, можно ли мониторить диалоговые окна по сообщениям?

А скорее как раз EVENT_SYSTEM_DIALOGSTART = 0x0010. Так наверное и класс окна не нужен.

#Persistent 
EVENT := 0x0010 ; EVENT_SYSTEM_DIALOGSTART 

SetWinEventHook(EVENT, EVENT, 0, RegisterCallback("HookProc", "F"), 0, 0, 0) 
 
HookProc(hWinEventHook, event, hwnd, idObject, idChild, dwEventThread, dwmsEventTime)
{    
    ToolTip !!!!!!!!!!!!!!!!!!!!!!!!!!!!
}

SetWinEventHook(eventMin, eventMax, hmodWinEventProc, lpfnWinEventProc, idProcess, idThread, dwFlags)
{
   return DllCall("SetWinEventHook" , UInt, eventMin
                                    , UInt, eventMax
                                    , Ptr, hmodWinEventProc
                                    , Ptr, lpfnWinEventProc
                                    , UInt, idProcess
                                    , UInt, idThread
                                    , UInt, dwFlags)
}
return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33 (изменено: DD, 2015-03-01 15:23:55)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Серж, хотя ты и не видишь смысла, но всё-таки диалоговые окна из меню «Файл» не ловятся, а только отдельные. Возможен ли отлов диалоговых окон из меню «Файл»?
А за эти наработки конечно спасибо.

34

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Серж, хотя ты и не видишь смысла

В чём?

Возможен ли отлов диалоговых окон из меню «Файл»?

У меня "ловятся" кодом из 32 поста.

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

35 (изменено: DD, 2015-03-02 09:50:22)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

serzh82saratov пишет:

В чём?

Это у тебя надо спросить.

На XP SP2 код из 32 поста отлавливает "не дочерние" диалоговые окна, выводимые системой (об ошибках и т.д.), но те, что запускаются из программ — игнорирует. Потому и спрашивал.

36

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Это у тебя надо спросить.

О чём меня то спрашивать, если я уже ответил? Ты спросил в 28 посте чего не хватает в твоём коде, я тебе ответил что - смысла.

Потому и спрашивал.

Спрашивал не уточняя про XP SP2, на Win7 работает.

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

37

Re: AHK: хук для отслеживания появления/закрытия окон в системе

serzh82saratov пишет:

Ты спросил в 28 посте чего не хватает в твоём коде, я тебе ответил что - смысла.

А я на это сказал, что хотя ты смысла и не видишь, но код у меня не работает, а потому и смысл глубинный в вопросе был))) Теперь мы оба знаем, что где-то он может не работать и что в полную не работает на XP, в отличие от Win7, что весьма и весьма прискорбно.

38

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Товарищи, уже всё забыл. )
Вот так можно предотвратить закрытие своего окна, а как сделать тоже самое с окном другой программы?
Поискал в своих примерах, инжекты, хуки, ничего не помню. )

gui show, w333 h333
OnMessage(0x112, "WM_SYSCOMMAND")

WM_SYSCOMMAND(wp, lp) {
	static SC_CLOSE := 0xF060  
	if (wp = SC_CLOSE) {
		MsgBox, 4, % " ", Do you want to close the window?
		IfMsgBox, No
			Return 1 
		Gui, %A_Gui%: Destroy
	}
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

39

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Вот тут пришли к выводу, что не во всех приложениях срабатывает:
http://forum.script-coding.com/viewtopic.php?id=18014

40

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Ты мне льстишь. )
Как компилировать не подскажешь? Что за TDM-GCC-64.
И почему AUTOHOTKEY.dll  не катит, а нужна именно эта.

Malcev пишет:

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

41

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Тут скачать можно:
https://jmeubank.github.io/tdm-gcc/
Autohotkey.dll не подходит, так как для вызова SetWindowsHookEx нужна dll с хуком.

42

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Положил в папку C:\TDM-GCC-64\bin\gcc файл source.cpp с С++.
Как обычно не прокатило. (

C:\windows\system32>C:\TDM-GCC-64\bin\gcc -c source.cpp
gcc: ю°шсър: source.cpp: No such file or directory
gcc: ЇрЄры№эр  ю°шсър: эх чрфрэ√ тїюфэ√х Їрщы√
компиляция прервана.

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

43

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Cmd надо запускать из папки, где лежит gcc.

44

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Что то получилось!
Блокнот как вкопаный. )

if !hwnd := WinExist("ahk_exe notepad.exe")
	abort("no open notepads found")

if !hCBTDll := DllCall("LoadLibrary", "Str", "mydll.dll", "Ptr")
	abort("LoadLibrary failed with " A_LastError)

if !hCBTProc := DllCall("GetProcAddress", "Ptr", hCBTDll, "AStr", "CBTProc", "Ptr")
	abort("GetProcAddress failed with " A_LastError)

threadId := DllCall("GetWindowThreadProcessId", "Ptr", hwnd, "Ptr", 0, "UInt")

if !hHook := DllCall("SetWindowsHookEx", "Int", WH_CBT := 5, "Ptr", hCBTProc, "Ptr", hCBTDll, "UInt", threadId, "Ptr")
	abort("SetWindowsHookEx failed with " A_LastError)

MsgBox ur notepad is now unminimizable

Esc::
	DllCall("UnhookWindowsHookEx", "Ptr", hHook)
	MsgBox ur notepad is once again minimizable
	ExitApp
return

abort(msg) {
	MsgBox % msg "`n`n`nExiting"
	ExitApp
}

Я так понял битность длл, анк и процесса окна должны совпадать?
И как сделать длл под 32 бита?

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

45

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Думаю, что запускать из: C:\TDM-GCC-32\bin.

46

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Такой нет, надо с установкой разбираться.

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

47

Re: AHK: хук для отслеживания появления/закрытия окон в системе

А есть варианты этот хук (dll) связать со скриптом?
Передать параметры какие сообщения надо отслеживать, получать уведомления в анк какое сообщение было и какое окно.

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

48

Re: AHK: хук для отслеживания появления/закрытия окон в системе

serzh82saratov пишет:

Передать параметры какие сообщения надо отслеживать

Сомневаюсь.

serzh82saratov пишет:

получать уведомления в анк какое сообщение было и какое окно.

Можно попробовать через postmessage.

49

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Malcev пишет:

Можно попробовать через postmessage.

Ну такое пробовать только бывалым, вроде тебя.
И как понял post не подразумевает синхронность.

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

50

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Поспрашивай у чат гпт как отправлять оконные сообщения из c++.
На счет синхронности не совсем понял, что ты имеешь в виду?

51

Re: AHK: хук для отслеживания появления/закрытия окон в системе

PostMessage не ждёт ответа, и код выполняется дальше, SendMessage ждёт, то есть работает синхронно.
Ну это не суть наверное, если получится PostMessage, значит SendMessage тоже.

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

52

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Malcev пишет:

Думаю, что запускать из: C:\TDM-GCC-32\bin.

Ничего не получается, скачал уже отдельно i686-13.2.0-release-posix-dwarf-msvcrt-rt_v11-rev0.7z отсюда:
https://github.com/niXman/mingw-builds- … s/releases

Папку mingw32 из архива положил в C:\TDM-GCC-64, в папке bin создал папку gcc, закинул в неё source.cpp и cmd.exe.
Сmd из неё выдаёт DNS-сервер не является полномочным, также как и ранее из уже установленной ранее x86_64-w64-mingw32.

Malcev пишет:

Думаю, что запускать из: C:\TDM-GCC-32\bin.

У меня была x86_64-w64-mingw32, а не TDM-GCC-32.


Запустил cmd от админа из C:\WINDOWS\system32.
Ввёл  cd C:\TDM-GCC-64\mingw32\bin\gcc.
Ввёл C:\TDM-GCC-64\mingw32\bin\gcc -c source.cpp -o source32.o, source32.o создалось.
Ввёл C:\TDM-GCC-64\mingw32\bin\gcc -m32 -shared -o mydll32.dll source32.o, mydll32.dll создалось.
На х32 анк с этой dll ошибка LoadLibrary failed with 126, также как если х64 dll грузить на х32 анк. На х64 анк ошибка LoadLibrary failed with 193 если что.
Рабочая х64 dll весит 98кб, эта х32 37кб.

Может что то в коде С++ про битность надо прописывать?
source.cpp

#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;
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

53 (изменено: serzh82saratov, 2024-03-02 14:48:34)

Re: AHK: хук для отслеживания появления/закрытия окон в системе

serzh82saratov пишет:

На х32 анк с этой dll ошибка LoadLibrary failed with 126

Поправка, запускал анк из блокнота через RUN, кликом из проводника ошибка GetProcAddress failed with 127.
Забыл о проблеме рабочей папки для некоторых команд.
То есть обе выдают LoadLibrary failed with 193 при запуске с не своей битностью. Значит х32 всё таки грузится, но не может получить CBTProc.
DLL приложил.

+ код анк
if !hwnd := WinExist("ahk_exe notepad.exe")
	abort("no open notepads found")

if !hCBTDll := DllCall("LoadLibrary", "Str", "mydll.dll", "Ptr")
	abort("LoadLibrary failed with " A_LastError)

if !hCBTProc := DllCall("GetProcAddress", "Ptr", hCBTDll, "AStr", "CBTProc", "Ptr")
	abort("GetProcAddress failed with " A_LastError)

threadId := DllCall("GetWindowThreadProcessId", "Ptr", hwnd, "Ptr", 0, "UInt")

if !hHook := DllCall("SetWindowsHookEx", "Int", WH_CBT := 5, "Ptr", hCBTProc, "Ptr", hCBTDll, "UInt", threadId, "Ptr")
	abort("SetWindowsHookEx failed with " A_LastError)

MsgBox ur notepad is now unminimizable

Esc::
	DllCall("UnhookWindowsHookEx", "Ptr", hHook)
	MsgBox ur notepad is once again minimizable
	ExitApp
return

abort(msg) {
	MsgBox % msg "`n`n`nExiting"
	ExitApp
}
Post's attachments

mydll32.zip 11.52 kb, 1 downloads since 2024-03-02 

You don't have the permssions to download the attachments of this post.
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

54

Re: AHK: хук для отслеживания появления/закрытия окон в системе

У компа буду нескоро, но я бы первым делом проверил через какой-нибудь dll viewer какие функции в твоей dll присутствуют.

55

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Malcev пишет:

проверил через какой-нибудь dll viewer какие функции в твоей dll присутствуют

CBTProc 0x00000003601213a0 0x000013a0

CBTProc@12 0x631c14b0 0x000014b0

У х32 в конце @12.

Ваш код должен компилироваться под 32-битную архитектуру, однако для этого вам понадобятся некоторые исправления. Когда вы пишете код под 32-битную архитектуру в системе Windows, операция __declspec(dllexport) обычно не требуется. Вам нужно также включить библиотеку User32.lib.

Жпт так переделал под х32, видимо User32 не подключается, ещё советы давал, по всякому пробовал, но не выходит.

#include <Windows.h>

// Убираем __declspec(dllexport) для 32-битной архитектуры
LRESULT CALLBACK CBTProc(
    int nCode,
    WPARAM wParam,
    LPARAM lParam
)
{
    if (nCode < 0) return CallNextHookEx(nullptr, nCode, wParam, lParam);

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

// Пример использования функции SetWindowsHookEx для установки хука
void SetupHook()
{
    // Для компиляции вам нужно будет включить библиотеку User32.lib при вызове компилятора (например, через опцию -luser32)
    HHOOK hHook = SetWindowsHookEx(WH_CBT, CBTProc, nullptr, GetCurrentThreadId());
    // ... Другой код ...
    UnhookWindowsHookEx(hHook);
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

56

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Если бы были ошибки, то компилятор бы ругался.
Пробуй получать адрес для CBTProc@12.

57

Re: AHK: хук для отслеживания появления/закрытия окон в системе

Malcev пишет:

Пробуй получать адрес для CBTProc@12

Ё моё, очевидно же, жпт только запутает больше, работает!

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