2011-06-15 205 views
1

我想獲得一些控件的窗口句柄來做一些東西(需要一個句柄)。這些控件位於不同的應用程序中。一些控件怎麼沒有窗口句柄?

奇怪的是,我發現很多控件沒有窗口句柄,就像Windows資源管理器中工具欄中的按鈕(?)一樣。只要嘗試獲取文件夾/搜索/(等)按鈕的句柄。它只是給我0.

所以..第一個問題:爲什麼有些控件沒有窗口句柄?他們心中不是所有的控制窗口嗎? (只是談論標準控件,就像我期望它們在Windows資源管理器中一樣,在窗格上沒有任何自定義繪圖等)。

這使我想到第二個問題:如何使用它們(如使用EnableWindow)無法得到他們的處理?

非常感謝您的任何意見!

EDIT(附加信息):

Windows資源管理器只是一個例子。我經常遇到這個問題 - 並且在另一個應用程序中(我真正感興趣的是專有應用程序)。我有「物理」控件(因爲我可以獲得這些控件的AutomationElement),但它們沒有窗口句柄。另外,我試圖發送一個消息(SendMessage)來獲取按鈕狀態,試圖找出它是否被推送(它是一個標準按鈕,似乎只通過該消息來展現該行爲 - 至少我已經看到了,而且按鈕的按下狀態可以持續比按鈕更長的時間,儘管Windows資源管理器按鈕顯示類似的行爲,就像按鈕式複選框一樣,儘管它們是(推)按鈕)。 SendMessage需要一個窗口句柄。

工具欄是否以某種方式改變其子元素的行爲?拿走他們的窗戶把手或類似的東西? (使用父處理/控制ID進行標識??)但是,那麼如何使用那些需要窗口句柄的控件的功能呢?

回答

7

如果他們沒有句柄,他們不是真正的控件,他們只是看起來像控件。

但當然,Windows資源管理器中的工具欄按鈕確實有有窗口句柄,它們是工具欄的一部分。使用toolbar manipulation functions與它們交互,而不是EnableWindow。或者,更好的是,使用記錄的API來執行搜索等操作。反向工程的Windows資源管理器有從來沒有結束,任何人,至少所有可憐的Windows殼牌團隊,揹負着一些向後兼容性的開發者誰認爲API是其他人的多年向後兼容性黑客。無論你做什麼,都有可能在下一個版本的Windows上崩潰。

+0

Thx爲您的答案! – 2011-06-15 15:23:47

+0

我試圖通用,然後給出一個具體的例子,它實際上與我想要做的事情無關 - 我的錯,對不起。在一個完全不同的應用程序中,我實際上有完全不同的按鈕,它們也沒有窗口句柄。或者是他們所屬工具欄的特定功能? 此外,我想要使用的功能是類似 int res = SendMessage(realHwnd,BM_GETSTATE,0,0); 找出按鈕是否被按下。 – 2011-06-15 15:39:12

+0

@安德里亞斯:是的,也是我的錯。我花了很長時間閱讀Raymond Chen的博客並回答了這裏的問題,這兩個問題可能讓我對嘗試對Windows進行反向工程的人感到痛心。至於其他應用的功能,很難說。有很多可能的情況。如果你有一個Visual Studio的副本,你應該有一個叫做Spy ++的小工具。用它來確定哪些控件實際上容納了這些按鈕。如果它確實是一個工具欄('ToolbarWindow32'或類似的東西),那麼你可以使用其中一個工具欄操作函數。 – 2011-06-15 15:40:47

3

您正在討論的控件正在使用ToolbarWindow32類。如果你想與他們交互,那麼你需要使用toolbar control APIs /消息。例如,要啓用您想要使用的按鈕TB_ENABLEBUTTON

0

您可以使用GDI,OpenGL或DirectX自行實施控件。試試Mozilla Firefox上的Window Detective,你會看到只有一個窗口。對話框中的控件不是Windows已知的窗口。