Кликнуть на кнопку в стороннем приложении - C#

Узнай цену своей работы

Формулировка задачи:

int hwnd=0;
IntPtr hwndChild=IntPtr.Zero;
 
//Get a handle for the Calculator Application main window
hwnd=FindWindow(null,"Calculator");
if(hwnd == 0)
            
//Get a handle for the "1" button
hwndChild = FindWindowEx((IntPtr)hwnd,IntPtr.Zero,"Button","1");
              
//send BN_CLICKED message
SendMessage((int)hwndChild,BN_CLICKED,0,IntPtr.Zero);
Cкачал с codeproject'а пример использования винапи для доступа к контролам в других приложениях. Ошибка происходит при попытке вычислить hwnd дочернего контрола: функция FindWindowEx всегда возвращает 0, хотя на вход hwnd родительского окна ей подаётся корректный. В чём проблема?

Пожалуйста, не нужно отсылать меня в похожие темы, я неоднократно натыкался на них в гугле, в них авторам предложено пройти точно также по другим темам, в третьих темах тоже самое и так до бесконечности.

Решение задачи: «Кликнуть на кнопку в стороннем приложении»

textual
Листинг программы
public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowText(IntPtr hWnd, StringBuilder lpString, int nMaxCount);
 
        // Get a handle to an application window.
        [DllImport("USER32.DLL", CharSet = CharSet.Unicode)]
        public static extern IntPtr FindWindow(string lpClassName,
            string lpWindowName);
 
        // Activate an application window.
        [DllImport("USER32.DLL")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool EnumWindows(EnumWindowsProc lpEnumFunc, IntPtr lParam);
 
        [DllImport("user32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool IsWindowVisible(IntPtr hWnd);
 
        [DllImport("user32.dll", SetLastError = true)]
        static extern int GetWindowTextLength(IntPtr hWnd);
 
        List<IntPtr> ListHandles = new List<IntPtr>();
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            EnumWindows((hWnd, lParam) =>
            {
                if ((IsWindowVisible(hWnd) && GetWindowTextLength(hWnd) != 0) && GetWindowText(hWnd).StartsWith("Calculator"))
                {
                    ListHandles.Add(hWnd);
                    listBox1.Items.Add(hWnd.ToString());
                }
                return true;
            }, IntPtr.Zero);
 
        }
 
        string GetWindowText(IntPtr hWnd)
        {
            int len = GetWindowTextLength(hWnd) + 1;
            StringBuilder sb = new StringBuilder(len);
            len = GetWindowText(hWnd, sb, len);
            return sb.ToString(0, len);
        }
 
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.909 из 5
Похожие ответы