Что нового

Одинаковые окна

sansantakan

Новичок
Сообщения
3
Репутация
0
Здравствуйте други! Помогите чайнику!

Задача: срипт должен мониторить открытие окон с одинаковым [CLASS:] и разными заголовками, например: автоматически на рабочем столе открываются окна с Class: Notepad и разными заголовками (a1 – Блокнот, a2 – Блокнот и т.д) если открывается окно с заголовком окна, которое уже открыто скрипт должен это окно закрыть, т.е. на рабочем столе не должно быть окон с одинаковыми заголовками.
 

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
взято отсюда

Код:
#include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)

Global $hForm, $aHndT[0][2]
Global $oDict = ObjCreate('Scripting.Dictionary')
$oDict.CompareMode = 1
HotKeySet('{ESC}', 'OnAutoItExit')
OnAutoItExitRegister('OnAutoItExit')
$hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), '_ShellHookProc')
_WinAPI_RegisterShellHookWindow($hForm)

While 1
    Sleep(100)
WEnd

Func _ShellHookProc($hWnd, $iMsg, $wParam, $lParam)
    Local $Title, $Array, $vValue
    Switch $hWnd
        Case $hForm
            Switch $wParam
                Case $HSHELL_WINDOWCREATED
                    $Title = WinGetTitle($lParam)
                    If IsString($Title) Then
                        If Not $oDict.Exists($Title) Then
                            $oDict.Add($Title, $lParam)
                        Else
                            WinKill($lParam)
                        EndIf
                    EndIf
                Case $HSHELL_WINDOWDESTROYED
                    $Array = $oDict.Keys()
                    For $hdata In $Array
                        $vValue = $oDict.Item($hdata)
                        If $vValue = $lParam Then $oDict.Remove($hdata)
                    Next
            EndSwitch
    EndSwitch
EndFunc   ;==>_ShellHookProc

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($hForm)
    Exit
EndFunc   ;==>OnAutoItExit
 
Последнее редактирование:
Автор
S

sansantakan

Новичок
Сообщения
3
Репутация
0
Спасибо за помощь, срипт отрабатывает одно закрытие и в ошибку.

==> The requested action with this object has failed.:

$oDict.Remove($Title)

$oDict^ ERROR

Я видимо за ночь умнее стал! Сам сделал по колхозному, но задача выполнена!
 

Вложения

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
нашел ошибку
исправил код в предыдущем комментарии
 
Последнее редактирование:
Автор
S

sansantakan

Новичок
Сообщения
3
Репутация
0
Спасибо!
Сообщение автоматически объединено:

нашел ошибку
исправил код в предыдущем комментарии
Спасибо! Скрипт полностью работает, но можно в него внести изменения чтобы закрывались окна конкретного класса, а то он закрывает все окна с одинаковыми заголовками.
 
Последнее редактирование:

joiner

Модератор
Локальный модератор
Сообщения
3 354
Репутация
581
попробуй этот вариант. вроде как работает

Код:
#include <WinAPIEx.au3>
Opt('MustDeclareVars', 1)

Global $hForm, $aHndT[0][2]
Global $oDict = ObjCreate('Scripting.Dictionary')
$oDict.CompareMode = 1
HotKeySet('{ESC}', 'OnAutoItExit')
OnAutoItExitRegister('OnAutoItExit')
$hForm = GUICreate('')
GUIRegisterMsg(_WinAPI_RegisterWindowMessage('SHELLHOOK'), '_ShellHookProc')
_WinAPI_RegisterShellHookWindow($hForm)

While 1
    Sleep(100)
WEnd

Func _ShellHookProc($hWnd, $iMsg, $wParam, $lParam)
    Local $Title, $Array, $vValue, $sClass, $aStSp, $sKey, $iFlAdd = 1
    Switch $hWnd
        Case $hForm
            Switch $wParam
                Case $HSHELL_WINDOWCREATED
                    $Title = WinGetTitle($lParam)
                    If IsString($Title) Then
                        $sClass = WinGetClassList($lParam)
                        $sKey = String($lParam)
                        $Array = $oDict.Keys()
                        For $hdata In $Array
                            $vValue = $oDict.Item($hdata)
                            $aStSp = StringSplit($vValue, '\')
                            If $aStSp[1] = $Title And $aStSp[2] = $sClass Then
                                WinKill($lParam)
                                $iFlAdd = 0
                                ExitLoop
                            EndIf
                        Next
                        If $iFlAdd Then $oDict.Add($sKey, $Title & '\' & $sClass)
                    EndIf
                Case $HSHELL_WINDOWDESTROYED
                    $sKey = String($lParam)
                    $oDict.Remove($sKey)
            EndSwitch
    EndSwitch
EndFunc   ;==>_ShellHookProc

Func OnAutoItExit()
    _WinAPI_DeregisterShellHookWindow($hForm)
    Exit
EndFunc   ;==>OnAutoItExit
 
Верх