Как получить дескриптор окна приложения Java Swing в NSIS? - PullRequest
0 голосов
/ 09 декабря 2011

Я использую NSIS для создания установщика обновлений для Java-приложения на основе Swing.Мне нужно знать, запущено ли приложение, и прервать установку, если это так.Я спросил это здесь , но это, по сути, сводится к идентификации приложения по заголовку окна.

NSIS имеет функцию FindWindow, которая принимает дескриптор окна в качестве обязательного параметра.Теперь на мой вопрос: как узнать дескриптор окна приложения Swing, учитывая, что у вас нет Spy ++ или WinSpy ++ и вы заблокированы замечательными корпоративными ИТ-специалистами для загрузки дополнительных инструментов?У приложений Java есть стандартное имя дескриптора окна?

1 Ответ

1 голос
/ 09 декабря 2011

Вы можете использовать NSIS для перечисления окон, readme для системного плагина имеет пример EnumChildWindows , который очень близок к коду, необходимому для перечисления окон верхнего уровня.

!include LogicLib.nsh
showinstdetails show
section

System::Get "(i.r1) iss"
Pop $R0
System::Call "user32::EnumWindows(k R0,i) i.s"
loop:
    Pop $0
    StrCmp $0 "callback1" 0 done
    System::Call "user32::IsWindowVisible(ir1)i.r2"
    ${If} $2 <> 0
        System::Call "user32::GetWindowText(ir1,t.r2,i${NSIS_MAX_STRLEN})"
        System::Call "user32::GetClassName(ir1,t.r3,i${NSIS_MAX_STRLEN})"
        IntFmt $1 "0x%X" $1
        DetailPrint "$1 - [$3] $2"
    ${EndIf}
    Push 1 # callback's return value
    System::Call "$R0"
    Goto loop
done:
System::Free $R0

sectionend

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

...