2012-03-15 3 views
0

У меня проблема с функцией API Window FindWindowEx, на самом деле я получаю дескриптор MainWindow процесса, но когда я пытаюсь получить дескриптор одной из его кнопок с помощью FindWindowEx, он не работает , Я проверил окно и его кнопки со шпионом ++, и все работает хорошо, даже дескриптор mainwindow, возвращенный моей программой, совпадает с одним из них 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 –

+0

вместо «Button» напишите класс кнопки из spy ++ – Reniuz

+0

Я вижу, что EnumChildWindows() позволяет сканировать все дочерние окна родительского окна, в моем случае я хочу получить дескриптор кнопки, которая находится в главном окне, чтобы автоматизировать действие on_click. –

ответ

0

, как говорит, г-н Ханс Passant, имя класса непредсказуемо, поэтому решение не задав имя класса в функции FindWindowEx так, чтобы получить все элементы управления обрабатывает в главном окне мы можем Применение:

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

и мы можем найти ручку кнопки «Suivant» в главном окне:

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

Спасибо за вашу помощь.

Смежные вопросы