» Перечисляем окна в системе

K.A.V.
www.oszone.net
22.02.2010
Автор: K.A.V.
Последнее обновление: 09.08.2012

На этой страничке я расскажу вам, как перечислить все запущенные окна в системе, с определением заголовков и классов этих окон
И ещё я представлю вашему вниманию код, с помощью которого можно определить, существует ли окно с необходимой фразой в заголовке

Для наглядности я воспользуюсь командой FileOpen, чтобы записать в текстовый файл результат поиска окон

Пример кода с записью результата в текстовый файл

FileOpen $R0 "$EXEDIR\kav_temp.txt" w
; Создаём текстовый файл, в него будем записывать результат

; Начинаем поиск окон
StrCpy $0 $HWNDPARENT
GetNewWindow:
strcpy $1 $0
FindWindow $0 "" "" "" $1
StrCmp $0 "0" endSearch 0
System::Call "user32::GetWindowText(ir0,t.r2,i${NSIS_MAX_STRLEN})"
System::Call "user32::GetClassName(ir0,t.r3,i${NSIS_MAX_STRLEN})"

StrCmp $2 "" GetNewWindow 0
; Если имя окна пустое - ищем следующее окно (можете удалить данную строку, чтобы записать результат даже классов окон без заголовков)

FileWrite $R0 "$2 [$3]$\r$\n"
; Записываем результат в файл

; Здесь вы можете выполнить любой код
$2 - заголовок найденного окна
$3 - класс найденного окна

goto GetNewWindow
endSearch:

FileClose $R0
; Закрываем текстовый файл


Пример кода, который записывает все найденные окна в INI файл

Delete "$EXEDIR\TEST.ini"

StrCpy $4 0 ; Здесь будем хранить порядковый номер при найденном окне
StrCpy $0 $HWNDPARENT

GetNewWindow:
strcpy $1 $0
FindWindow $0 "" "" "" $1
StrCmp $0 "0" endSearch 0
System::Call "user32::GetWindowText(ir0,t.r2,i${NSIS_MAX_STRLEN})"
System::Call "user32::GetClassName(ir0,t.r3,i${NSIS_MAX_STRLEN})"

StrCmp $2 "" GetNewWindow 0 ; Нам не нужны окна, у которых нет заголовка
IntOp $4 $4 + 1 ; Нашли окно с НЕ пустым заголовком, плюсуем

; Здесь вы можете выполнить любой код
$2 - заголовок найденного окна
$3 - класс найденного окна
$4 - порядковый номер найденного окна в нашей функции

WriteINIStr "$EXEDIR\TEST.ini" "EnumWindows (Заголовок = Класс)" "$2" "$3"

WriteINIStr "$EXEDIR\TEST.ini" "EnumWindows (Порядковый номер = Заголовок)" "$4" "$2"

WriteINIStr "$EXEDIR\TEST.ini" "EnumWindows (Порядковый номер = Класс)" "$4" "$3"

goto GetNewWindow
endSearch:


Ищем нужное нам окно по фразе в заголовке

Ищем окна, в заголовке которого присутствет текст AkelPad
Для этого кода, необходим инклудинг библиотеки:
!include "StrFunc.nsh"
${StrRep}
Delete "$EXEDIR\TEST.ini"

StrCpy $4 0
StrCpy $0 $HWNDPARENT

GetNewWindow:
strcpy $1 $0
FindWindow $0 "" "" "" $1
StrCmp $0 "0" endSearch 0
System::Call "user32::GetWindowText(ir0,t.r2,i${NSIS_MAX_STRLEN})"
System::Call "user32::GetClassName(ir0,t.r3,i${NSIS_MAX_STRLEN})"

StrCmp $2 "" GetNewWindow 0

StrCpy $5 $2
StrLen $6 $2
${StrRep} $5 $2 "AkelPad" ""
StrLen $7 $5
StrCmp $6 $7 GetNewWindow 0

IntOp $4 $4 + 1

WriteINIStr "$EXEDIR\TEST.ini" "EnumWindows (Заголовок = Класс)" "$2" "$3"

WriteINIStr "$EXEDIR\TEST.ini" "EnumWindows (Порядковый номер = Заголовок)" "$4" "$2"

WriteINIStr "$EXEDIR\TEST.ini" "EnumWindows (Порядковый номер = Класс)" "$4" "$3"

goto GetNewWindow
endSearch: