Войти

Показать полную графическую версию : [решено] Поиск по названию открытого окна.


lecbit
28-03-2017, 20:38
Мне нужно что-бы при нахождении названия окна, закрывалась другая программа.
Вот сделал заготовку,но чёт не работает(

@echo off

set process1=skype.exe
set process2=File manager 2.0

:st
tasklist /FI "windowtitle eq %process2%" | find /I "%process2%"
If %errorlevel% NEQ 0 goto :st
taskkill /f /im %process1%

Iska
28-03-2017, 21:30
О каком именно:
File manager 2.0 »
идёт речь?

lecbit
28-03-2017, 21:51
О каком именно:
Цитата lecbit:
File manager 2.0 »
идёт речь? »
Это не важно Skype,file manager тут может стоять любая программа,мне главное суть понять.Она в том что-бы ожидалось открытие одной программы а определялась это по заголовку окна и далее закрывало другую программу.

Iska
28-03-2017, 22:10
@echo off
setlocal enableextensions enabledelayedexpansion

set sProcessName=notepad.exe
set sWindowTitle=Калькулятор

title Waiting for window [%sWindowTitle%]...

:Repeat
>nul timeout.exe /t 1
2>nul tasklist.exe /fi "windowtitle eq %sWindowTitle%" /v | find.exe /i "%sWindowTitle%" || goto :Repeat

2>nul taskkill.exe /fi "imagename eq %sProcessName%" /f

endlocal
exit /b 0

Для старых ОС вместо timeout.exe используйте ping.exe для организации паузы.

lecbit
28-03-2017, 22:28
Для старых ОС вместо timeout.exe используйте ping.exe для организации паузы. »
Я тут ещё вспомнил что у меня может быть пару "калькуляторов",можно ли это сделать для нескольких программ сразу?

Iska
28-03-2017, 23:12
lecbit, а какая разница сколько калькуляторов, если пакетный файл сработает на первом же. Или Вы имеете в виду разные заголовки окна?

Можно, но лучше перейти к средствам, которые для того непосредственно предназначены. Например, AutoIt. Там и возможностей по работе с окнами на пару порядков больше. Например:
#include <Array.au3>

AutoItSetOption("MustDeclareVars", 1)
AutoItSetOption("WinTitleMatchMode", 2)

Local $sProcessName = "notepad.exe"
Local $aWindowTitles[] = ["Калькулятор", "Таблица символов", "Paint", "Microsoft Word"]


WinWait("[REGEXPTITLE:(?:" & _ArrayToString($aWindowTitles) & ")]")
ProcessClose($sProcessName)

Exit(0)

lecbit
28-03-2017, 23:31
Например, AutoIt. »
Да,думаю так и сделаю,Спасибо!

lecbit
02-04-2017, 17:14
Iska
Как же прекрасно что вы мне подсказали AutoIT
Но у меня появилась новая идея и я не знаю как её реализовать.Теперь мне нужно что-бы можно было находить сразу по заголовку окна и названию процесса.Попытался закоректировать строчки
WinWait("[REGEXPTITLE:(?:" & _ArrayToString($aWindowTitles) & ")]")
ProcessWait ( "iexplore.exe" )
ProcessClose($sProcessName)
Но тогда закрывает только по процессу.

Iska
03-04-2017, 01:20
Теперь мне нужно что-бы можно было находить сразу по заголовку окна и названию процесса. »
Пример приведите.

lecbit
03-04-2017, 08:02
Пример приведите. »
Ну всё также только с добавлением процесса
#include <Array.au3>

AutoItSetOption("MustDeclareVars", 1)
AutoItSetOption("WinTitleMatchMode", 2)

Local $sProcessName = "notepad.exe"
Local $aWindowTitles[] = ["Калькулятор", "Таблица символов", "Paint", "Microsoft Word"]


WinWait("[REGEXPTITLE:(?:" & _ArrayToString($aWindowTitles) & ")]")
ProcessWait ( "iexplore.exe" )
ProcessClose($sProcessName)

Exit(0)

Iska
03-04-2017, 08:31
lecbit, Вы меня не понимаете. Меня не интересует код. Совсем. Меня интересует пример заголовка окна и названия процесса.

Например: "Если ((окно имеет частичный заголовок «Безымянный» или «Новый») и имя процесса «winword.exe») или (окно имеет частичный заголовок «Мой розовый пони» и (имя процесса «iexplore.exe» или имя процесса «chrome.exe» или имя процесса «firefox.exe»)), то надо сделать то-то и то-то.

lecbit
03-04-2017, 12:19
Iska, Опишу что нужно сделать.Если появляется процесс server.exe либо какой-то из перечисленных заголовков окна(BD,1C,word) то нужно закрыть процесс Imn.exe

Iska
03-04-2017, 15:49
#include <Array.au3>

AutoItSetOption("MustDeclareVars", 1)
AutoItSetOption("WinTitleMatchMode", 2)


Local $bFound = False

Local $sProcessName4Close = "server.exe"

Local $sProcessName4Exists = "Imn.exe"
Local $aWindowTitles4Exists[] = ["BD", "1C", "word"]

AdlibRegister("Check", 1000)

Do
Sleep(1000)
Until $bFound

ProcessClose($sProcessName4Close)

Exit(0)

Func Check()
If WinExists("[REGEXPTITLE:(?i:" & _ArrayToString($aWindowTitles4Exists) & ")]", "") Or ProcessExists($sProcessName4Exists) Then
$bFound = True
AdlibUnRegister("Check")
EndIf
EndFunc



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




© OSzone.net 2001-2012