2010-05-31 280 views
7

我想在我的過程中的子窗口上獲得一個窗口句柄,唯一的信息是窗口類名稱。有沒有我可以使用的win32函數?我正在從C#做這個。從窗口類名稱獲取窗口句柄

更詳細一點:這是一個Visual Studio插件,用C#編寫。所以我的過程是視覺工作室,它有很多窗口。其中之一有一個窗口類「VsTipWindow」。我不知道那個窗口的直接父窗口,我擁有的是類名。有沒有什麼辦法可以讓我從窗戶把手中解脫出來?

回答

0

首先應該注意,窗口和窗口類之間沒有1對1的關係,多個窗口可以使用同一個類。

我想你唯一的選擇是從頂級Visual Studio窗口(或窗口層次結構中更高的一些其他窗口,如果你知道一個是VsTipWindow窗口的祖父)開始調用EnumChildWindows在回調函數中EnumChildWindows將調用GetClassName並將該字符串與VsTipWindow進行比較,直到找到該窗口。

既然你談到了未知的父母,我假設你是在一個子窗口之後,但是如果這個窗口是一個頂級窗口,你需要使用EnumWindows(你應該使用GetWindowThreadProcessId來確保你得到正確的處理後也找到與類名的窗口)

(我相信.NET有做同樣的事情,本機API函數,或者你必須PInvoke的)

+1

謝謝,那就是訣竅。雖然要清楚地說明「EnumChildWindows recursivly」,但實際上只需使用頂級窗口句柄調用它一次,EnumChildWindows函數本身就已經執行了遞歸。 – 2010-06-01 06:33:14

2

FindWindow是您想要的Win32調用(或FindWindowEx,如果有多個具有該特定類名的窗口,並且FindWindow沒有返回您正在查找的窗口)。

+0

我只注意到你的問題'findwindow'標籤得到一個窗口的句柄 - 好猜測。 :) – MusiGenesis 2010-05-31 13:53:19

+0

FindWindow只能找到頂級窗口,FindWindowEx就是你的真正意思,但它更安全地調用枚舉函數,所以你不會錯過任何窗口 – Anders 2010-05-31 13:57:36

+0

@Anders:已經添加了FindWindowEx鏈接。在大多數情況下,FindWindow返回你想要的窗口。所有人最安全的做法是首先不要混淆Windows類名。 – MusiGenesis 2010-05-31 14:01:16

0

一個Win32窗口類是控件的通用實現,窗口的句柄是控件的實例。所以你將有多個窗口句柄和相同的窗口類(例如:EDIT)。嚴格來說,窗口類是指向窗口過程的指針。 (甚至MFC)的框架傾向於爲所有窗口控件共享幾個窗口類,然後它們將調度到適當的控件(即它們具有單個通用窗口過程)。這對於像Visual Studio或Office這樣的大型應用程序也是一樣的。

因此,這很難通過它的窗口類來檢測特定的窗口。但是,您可以枚舉具有FindWindow的特定窗口類的所有窗口,您還將獲得可幫助您的窗口文本。使用GetWindowThreadProcessId您可以檢測窗口是否屬於Visual Studio。

+0

好的。但在這種特殊情況下,我知道每次只有一個活動窗口使用特定的窗口類,所以這不是問題。我可能應該在這個問題中說明:) – 2010-05-31 15:35:54

1

只是更多的信息.​​.
也許是有用的知道,你可以從一個點
WindowFromPoint
http://msdn.microsoft.com/en-us/library/ms633558(VS.85).aspx

+1

WindowFromPoint不適用於此,除非您建議用戶必須在特定時間或事件中將光標指向此窗口! – Anders 2010-05-31 19:17:24

+1

@Anders,VsTipWindow是一種ToolTipWindow。當鼠標移到另一個窗口時,Tooltipwindows具有可見的性質,而當鼠標離開窗口時,它將消失。但WindowFromPoint與鼠標點本身無關。它提供了每個任意點的窗口句柄。如果它在這裏適用不是問題,請閱讀我的前三個單詞。我只是想提供另一個想法,以防Einars的第一個想法不起作用。我們甚至不知道他要做什麼 – OlimilOops 2010-05-31 21:10:51