2012-03-29 64 views
0

我有一個安裝應用程序,如果用戶單擊兩次相同的安裝程序,它們將彈出消息「Another setup instance already running」。在該消息上單擊確定後,我想將焦點放回已運行的現有安裝窗口。我現在有以下代碼:GetWindowThreadProcessId無法找到我的窗口句柄,即使它的進程ID存在於窗口

if("setup.exe" == CString(buffer)) 
EnumWindows(EnumWindowsProc,(LPARAM)processID); 


BOOL CALLBACK EnumWindowsProc(HWND windowHandle,LPARAM lParam) 
{ 
DWORD searchedProcessId = (DWORD)lParam; 
DWORD windowProcessId = 0; 

GetWindowThreadProcessId(windowHandle,&windowProcessId); 

if(searchedProcessId == windowProcessId) 
{ 
     //Set focus when detects the right window. 
     SetForegroundWindow(windowHandle); 
     return FALSE; 
} 
return TRUE; 
} 

上述代碼的工作,如果我留在上安裝嚮導中的第一屏幕/步驟(安裝屏蔽)。

當我移動到安裝嚮導的下一個屏幕時,此聚焦邏輯不再起作用。在調試時,我發現函數GetWindowThreadProcessId找不到與searchedProcessId匹配的任何windowProcessID。我還確認了以下幾點:

  • 無論我在第一或第二個安裝屏幕上,searchProcessId值都保持不變。
  • 我確認我看到searchProcessID值存在,當我在窗口任務管理器中查看。

我對GetWindowThreadProcessId念起來看看下面的註釋:「的返回值是創建窗口的線程的標識。」在我自己的解釋中,這是因爲嚮導的第二步/屏幕是由其自己的線程生成的?

我試圖玩弄EnumChildWindow()函數,但沒有幫助。如果任何人能夠指出我試圖讓這個工作正確的方向,我會非常難過。

回答

1

我會使用Spy++隨Visual Studio或類似的系統監視工具向您顯示所有窗口/線程,以便您可以嘗試確認安裝嚮導正在執行的操作。機會是EnumWindows()工作得很好,這是你的代碼或你的假設如何工作的問題。