繁体   English   中英

如何在NSIS中获取Java Swing应用程序的窗口句柄?

[英]How does one get the window handle of a Java Swing app in NSIS?

我正在使用NSIS为基于Swing的Java应用程序创建更新安装程序。 我需要知道该应用程序是否已经在运行,如果正在运行,则中止安装。 在这里问了这个问题 ,但实际上归结为通过窗口标题来识别应用程序。

NSIS具有将窗口句柄作为强制参数的FindWindow函数。 现在,我的问题是:如果您没有Spy ++或WinSpy ++,并且被出色的公司IT阻止下载其他工具,那么如何查找Swing应用程序的窗口句柄? Java应用程序是否具有标准的窗口句柄名称?

您可以使用NSIS枚举窗口,系统插件自述文件包含一个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互斥锁或其他命名的内核对象并检查这些对象。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM