2012-04-10 121 views
2

我的任務是找到前臺窗口(使用GetForegroundWindow API完成),然後我必須預先填充包含前臺窗口的所有子窗口(使用EnumChildWindows API完成)的列表。現在,我需要檢測鼠標光標是在哪個子窗口,即我需要找出哪個子窗口(可能是一個按鈕或前景窗口中的文本框)是活動的。 是否有一些使用我可以獲取已被點擊的ChildWindows句柄的API? 即使我只獲得焦點所在的ChildWindow(活動前景窗口的名稱)的名稱,對我而言也是足夠的。 在此先感謝。檢測前臺窗口的哪個子窗口已被點擊?

+0

你爲什麼要與其他應用程序的窗口搞亂?如果這用於測試自動化,則可以使用System.Windows.Automation命名空間。 – 2012-04-10 09:21:20

+0

這不是測試自動化....它需要很長時間來解釋我的應用程序打算做什麼,但我會盡快給你介紹,我必須預先填充活動應用程序中的子窗口列表,跟蹤用戶的動作(點擊),並通過引用使用EnumChildWindows所做的查找來指導他下一步該做什麼,因此我需要確切知道哪個子窗口具有焦點。你可以請給我一些指示,以瞭解如何使用System.Windows.Automation來完成....提前致謝! – Ajit 2012-04-10 11:48:24

+0

哦,這是針對計算機培訓的。 System.Windows.Automation可能仍然有用。您可以閱讀文檔以加快速度;我不打算在評論中教你。 – 2012-04-10 13:44:11

回答

3
 InPtr hwnd = GetForegroundWindow(); 

     public static void GetAppActiveWindow(IntPtr hwnd) 
    { 
     uint remoteThreadId = GetWindowThreadProcessId(hwnd, IntPtr.Zero); 
     uint currentThreadId = GetCurrentThreadId(); 
     //AttachTrheadInput is needed so we can get the handle of a focused window in another app 
     AttachThreadInput(remoteThreadId, currentThreadId, true); 
     //Get the handle of a focused window 
     IntPtr focussed = GetFocus(); 

     StringBuilder activechild = new StringBuilder(256); 
     GetWindowText(focussed, activechild, 256); 
     string textchld = activechild.ToString(); 
     if (textchld.Length > 0) 
     { 
      Console.WriteLine("The active Child window is " + textchld + " ."); 

     } 
     //Now detach since we got the focused handle 
     AttachThreadInput(remoteThreadId, currentThreadId, false); 
    } 

這是它終於解決了這個問題:)