2011-05-18 24 views
2

我建立在C++的應用程序,使用Windows掛鉤來控制第三方程序。我正在製作的程序是一個教程程序,展示如何使用這些第三方程序。我可以找到想要掛接的第三方程序的進程ID,然後我可以查詢此進程ID以查找要用作Windows API函數SetWindowsHookEx的參數的線程ID列表。不過,我擔心的是,從正在運行的進程中的線程ID列表中,我將掛鉤到可能隨時完成的線程。理想情況下,我想掛鉤運行主要GUI的線程,這很可能是最長的活動線程之一(即使它不是教程程序設計爲與GUI一起工作的最長的活動線程,它仍然是理想的)。如果第三方應用程序有多個GUI,那麼我想找到主GUI的線程ID。C++從線程ID列表中找到GUI線程

所以我的問題是,從線程ID,我從查詢進程id得到的名單是有辦法找到任何主界面ID或其他合適的線程將被激活,直到程序已經退出?顯然,我選擇的線程ID需要有一個事件隊列,這樣我就可以掛鉤了。

回答

3

如何找到應用程序的主窗口,然後用GetWindowThreadProcessId來獲得該線程ID?

如果您還不知道主窗口,可以嘗試使用FindWindow()(如果您知道窗口名稱和類名稱)或EnumWindows()枚舉桌面上的所有頂層窗口來查找它,以及檢查它們是否屬於目標進程(再次使用GetWindowThreadProcessId,並與進程ID進行比較)。

主窗口通常爲一用一WS_CAPTION樣式位(多個)集合。還應該檢查窗口是否可見(IsWindowVisible)以避免隱藏的工作窗口(通常屬於工作線程)。還可以檢查WS_POPUP和WS_EX_TOOLWINDOW樣式以過濾掉頂層浮動窗口和對話窗口 - 儘管它們通常歸主GUI線程所有。

,因爲它希望有一個應用程序可以有許多「主窗口」和GUI線程;通常只有一個 - 但是沒有什麼能阻止開發人員創建多個線程,每個線程都有自己的主要頂級窗口和消息循環。如果你需要處理這種情況,你最好的辦法可能是鉤住看起來擁有交互式UI的所有線程。

+0

感謝您的回覆。我如何知道窗口是否設置了ws_caption? – Clive 2011-05-18 09:34:26

+0

在寫作之前務必閱讀StackOverflow,特別是在提問時。 [被要求在2010年4月回答特定問題(http://stackoverflow.com/questions/2679680/getting-window-style) – JdeBP 2011-05-18 09:54:02

+0

雖然WinAPI的genrally確實允許多線程GUI,大多數GUI框架將限制你一個反正用戶交互的線程。誰最近用純WinAPI寫作? – 2013-06-01 23:35:24

1

確定,一個線程是否爲GUI線程的最簡單和最可靠的方法是調用GetGUIThreadInfo

如果指定的主題不[...]有一個輸入隊列,該函數將失敗。

其中,有一個輸入隊列區分GUI線程和普通線程。