Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
1

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

30.12.2014, 22:59. Показов 3413. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
C#
1
2
3
4
5
6
7
8
9
10
11
12
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 родительского окна ей подаётся корректный. В чём проблема?

Пожалуйста, не нужно отсылать меня в похожие темы, я неоднократно натыкался на них в гугле, в них авторам предложено пройти точно также по другим темам, в третьих темах тоже самое и так до бесконечности.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.12.2014, 22:59
Ответы с готовыми решениями:

Нажать на кнопку в стороннем приложении, используя WinAPI
Здравствуйте в кратце Нужно на c# и winapi реализовать данное сообщение "WM_PARENTNOTIFY...

Имитация нажатия на кнопки в стороннем приложении
Во общем ситуация такая, есть установщик, в нём кнопка старт, после нажатия на нее появляется...

Прочитать и изменить текст в стороннем приложении
Привет! Нужно получить выделенный текст в активном поле ввода активного окна и в зависимости от...

Имитация нажатия ПКМ в стороннем приложении
Привет, понимаю что тема обсуждалась миллион раз, но я уже перерыл все что нашел и никак не дойдет...

4
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
30.12.2014, 23:27 2
Цитата Сообщение от landgen Посмотреть сообщение
хотя на вход hwnd родительского окна ей подаётся корректный.
А сами ноль туда подаёте зачем-то.
Цитата Сообщение от landgen Посмотреть сообщение
if(hwnd == 0)
Вот из описания FindWindowEx (hwndParent - первый параметр функции)
Если hwndParent - ПУСТО (NULL), функция использует окно рабочего стола как родительское окно. Функция ищет среди окон, которые являются дочерними окнами рабочего стола.
Где логика?

Добавлено через 1 минуту
Хорошо бы ссылку на codeproject
0
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
30.12.2014, 23:50  [ТС] 3
Это строка из цикла, который проверяет, получилось ли hwnd и если не получилось, предлагает запустить приложение. В нашем случае можно предположить, что hwnd всегда получается. Строку удалил.
Кодпрожект: http://www.codeproject.com/KB/... romCS.aspx

P.S. А нет, уже нельзя редактировать. В общем, представьте что hwnd получился (а он получается, я проверял) и этой строки с if нет

Добавлено через 5 минут
Короче, получилось через EnumWindows получить хэндлы окон и добавить их в список. Теперь надо как-то получить хэндлы кнопок через EnumChildWindows, можно пример? Вот код формы:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
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);
        }
 
    }
0
873 / 771 / 173
Регистрация: 11.01.2012
Сообщений: 1,942
31.12.2014, 00:21 4
Цитата Сообщение от landgen Посмотреть сообщение
можно пример?
Поиск всех окон процесса
Узнать все дискрипторы объектов которые неходятся в окне
0
1 / 1 / 1
Регистрация: 20.03.2013
Сообщений: 77
31.12.2014, 00:36  [ТС] 5
Безумно сложно. Но спасибо, всё равно. Можно считать, что решено.
0
31.12.2014, 00:36
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.12.2014, 00:36
Помогаю со студенческими работами здесь

Нажатие кнопок в стороннем приложении (игре)
Приложение должно способом имуляции нажимать на кнопки в игре, но данные способ не работает, тоесть...

Установить некоторые флажки в стороннем приложении
Доброго времени суток, на повестке дня встал вопрос по управлению чужой программой. И так я пишу...

Как нажать на пункт в списке в стороннем приложении?
Запускаю стороннее приложение. Через WinApi получаю доступ к нему. В нем есть список с одинаковыми...

Кликнуть кнопку на веб-странице, не зная её name/id
собственно сабж.Код кнопки: &lt;button type=&quot;button&quot;&gt;Далее&lt;/button&gt;


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru