2012-03-15 105 views
0

我有一個API窗口函數FindWindowEx的問題,實際上我獲得了進程的MainWindow的句柄,但是當我嘗試使用FindWindowEx檢索其中一個按鈕的句柄時,它沒有運行。 我用spy ++驗證了窗口及其按鈕,並且一切運行良好,即使我的程序返回的主窗口的句柄與spy ++的相匹配。我已經測試了由「Marshal.GetLastWin32Error()」返回的錯誤代碼, 我總是得到錯誤1008.我搜索了很多處理我的問題的舊帖子,但是我沒有找到任何解決方案。這裏是我的代碼:FindWindowEx沒有運行

DllImport("user32.dll" , CharSet = CharSet.Auto)] 
    public static extern IntPtr FindWindowEx(IntPtr parentHandle, IntPtr childAfter, string className, string windowTitle); 
// .... 
IntPtr hwnd = proc.MainWindowHandle; 
     string str = proc.MainWindowTitle; 
     Console.WriteLine("Main window Title : " + str); 
     Console.WriteLine("Main window Handle : " + hwnd.ToString()); 
     //Get a handle for the "suivant" button 
     IntPtr hwndChild = FindWindowEx((IntPtr)hwnd, IntPtr.Zero, "Button", "suivant"); 
     int error = Marshal.GetLastWin32Error() ; 
+1

Winforms中按鈕的類名不是「Button」。易於在Spy ++中查看。你不能使用FindWindowEx,類名是不可預知的。你需要EnumChildWindows()。並看看white.codeplex.com – 2012-03-15 15:18:14

+0

,而不是「按鈕」從間諜++編寫的按鈕類 – Reniuz 2012-03-15 15:38:05

+0

我看到,EnumChildWindows()允許掃描父窗口的所有子窗口,在我的情況下,我想獲得句柄爲了使on_click動作自動化,在主窗口中的按鈕。 – 2012-03-15 15:53:56

回答

0

如先生漢斯帕桑特說,類名是不可預測的,所以解決的辦法是在FindWindowEx功能不specifing類的名稱,以便獲得所有控件處理在主窗口我們可以使用方法:

do { 
      IntPtr hwndchild = FindWindowEx(hwndparent, hwndchild , null, null) ; 
     }while(hwndchild != IntPtr.Zero); 

,我們可以找到「suivant」按鈕,在主窗口句柄:

IntPtr hwndchild = FindWindowEx(hwnd, hwndchild , null, "suivant") ; 

謝謝您的幫助。