2011-12-09 58 views
0

我正在使用NSIS爲基於Swing的Java應用程序創建更新安裝程序。我需要知道應用程序是否已在運行,如果是,請中止安裝。我問了這個here,但它主要歸結爲通過它的窗口標題來識別應用程序。如何獲得NSIS中Java Swing應用程序的窗口句柄?

NSIS有一個FindWindow函數,它將窗口句柄作爲強制參數。 現在對於我的問題:鑑於您沒有Spy ++或WinSpy ++,並且被精彩的公司IT阻止下載其他工具,您如何找到Swing應用程序的窗口句柄? Java應用程序是否有標準的窗口句柄名稱?

+0

FindWindow函數需要窗口類名稱和/或窗口標題,如果找到與窗口類/標題匹配的窗口,它會返回一個窗口句柄... – Anders

回答

1

您可以使用NSIS來枚舉窗口,System插件自述文件有一個EnumChildWindows example,它非常接近枚舉頂級窗口所需的代碼。

!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互斥體或其他命名的內核對象,並檢查這些...

+0

謝謝,這完全符合法案:) – Rex

相關問題