2010-10-22 68 views
10

我使用User32.dll中的FindWindow方法來查找窗口並獲取句柄,但是是否可以從句柄獲取窗體控件?並用它像一個普通的形式?例如:從HWND到控制

int myhwnd = FindWindow(null, "MyWindow"); 
form myform = SomeMagic.GetFormFromHandle(myhwnd); 
myform.Visible = false; 

還是我必須繼續使用user32.dll中的方法來發送消息到窗口?

回答

14

如果它是一個託管窗口(您使用System.Windows.Forms創建它,並且它已從System.Windows.Forms.Control繼承),則可以獲得參照控制對象

Control.FromHandle(myIntPtr); 

然後,您只需獲得控件的父級,直到獲取表單。

如果不是,則無法獲取Control對象,但您可以執行的操作是創建NativeWindow,並使用AssignHandle將IntPtr句柄分配給該對象。這至少會給你一些訪問WndProc和類似的東西,但就是這樣。

1

在Win32窗口句柄周圍包裝Form類非常困難。微軟沒有提供完整的實施方案。所以,您必須使用Native函數才能與給定句柄進行通信。

2

你試過Control.FromHandle()?表格是(繼承自)控件。如果你點擊一個嵌套控件,你必須通過它的父母搜索,直到你點擊你的表單。

這裏假設實際上有一個Form的地方,並且您剛剛使用user32方法找到它的HWND