касаткО
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
1

Нажатие кнопки в чужом приложении

27.10.2012, 14:41. Показов 7935. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте. Задался целью программно нажать на кнопку в чужой программе.
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Synthesis;
using System.Runtime.InteropServices;
 
namespace test
{
    public partial class Form1 : Form
    {
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 
        [DllImport("User32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        const int WM_LBUTTONDOWN = 0x0201;
        const int WM_LBUTTONUP = 0x0202;
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            try 
            {
                IntPtr progr = FindWindow("TForm1", "Form1");
                SetForegroundWindow(progr);
                IntPtr button = FindWindowEx(progr, IntPtr.Zero, "TButton", "Button1");
 
                if (button != IntPtr.Zero)
                {
                    SendMessage(button, WM_LBUTTONDOWN, 1, 0x0044078C);
                    SendMessage(button, WM_LBUTTONUP, 0, 0x0044078C);
                }
            }
            catch (Exception str)
            {
                MessageBox.Show(Convert.ToString(str));
            }
        }
    }
}
Но что то не нажимается кнопка. Дескриптор брал из Spy++.
Изменил немного код, но все равно не работает
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
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Speech.Synthesis;
using System.Runtime.InteropServices;
 
namespace test
{
    public partial class Form1 : Form
    {
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string className, string windowName);
 
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
        [DllImport("User32.dll")]
        public static extern bool SetForegroundWindow(IntPtr hWnd);
 
        public Form1()
        {
            InitializeComponent();
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            try 
            {
                IntPtr progr = FindWindow("TForm1", "Form1");
                SetForegroundWindow(progr);
                IntPtr button = FindWindowEx(progr, IntPtr.Zero, "TButton", "Button1");
 
                if (button != IntPtr.Zero)
                {
                   SendKeys.SendWait("Button1");
                 }
            }
            catch (Exception str)
            {
                MessageBox.Show(Convert.ToString(str));
            }
        }
    }
}
В чем может быть ошибка ?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.10.2012, 14:41
Ответы с готовыми решениями:

Вставка текста и нажатие на кнопку в чужом приложении
Всем доброго времени суток. Подскажите, как вставить текст в чужом приложении и нажать на нужную...

Нажатие кнопки в другом приложении
Привет всем! Объясните пожалуйста, как написать приложение, которое программно нажимает кнопку в...

Перехватить нажатие кнопки в другом приложении
Есть прога, написанная вроде на дельфях (остался только exe-шник), есть ли возможность перехватить...

Рисование в чужом полноэкранном приложении
Есть игра, запущенная на весь экран. Надо нарисовать некий текст в углу экрана, возможно ли это...

3
Почетный модератор
Эксперт .NET
8722 / 3674 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.10.2012, 15:23 2
Цитата Сообщение от Jetu Посмотреть сообщение
SendMessage(button, WM_LBUTTONDOWN, 1, 0x0044078C); SendMessage(button, WM_LBUTTONUP, 0, 0x0044078C);
Вы в область космоса кликать собрались? Зачем 0x0044078C ? Да и при WM_LBUTTONUP третий параметр 1 должен быть по хорошему...

Кликать можно так:
C#
1
    PostMessage(hWnd, BM_CLICK, IntPtr.Zero, IntPtr.Zero);
или так:
C#
1
2
    PostMessage(hWnd, WM_LBUTTONDOWN, 1, 0);
    PostMessage(hWnd, WM_LBUTTONUP, 1, 0);
Может не прокатить с кнопками в диалоговых окнах (см. Remarks для BM_CLICK).

SendKeys работает только с активным в данный момент окном, т.е. можно вызвать SetForegroundWindow для окна TForm1, установить фокус на нужную кнопку и вызвать SendKeys.

Добавлено через 12 минут
Забыл добавить, что за Button1 в SendKeys? Читаем секцию Remarks, Key:ENTER
1
касаткО
51 / 51 / 4
Регистрация: 01.10.2011
Сообщений: 227
27.10.2012, 15:26  [ТС] 3
Цитата Сообщение от SSTREGG Посмотреть сообщение
Вы в область космоса кликать собрались? Зачем 0x0044078C ? Да и при
Ну я нахожу нужное мне окно, делаю его активным, ищу, есть ли там элемент класса "Tbutton", если есть, то нажимаем кнопку дескриптор которой равен 0x0044078C
Спасибо за подсказку по SendKeys!
0
Почетный модератор
Эксперт .NET
8722 / 3674 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
27.10.2012, 15:31 4
Цитата Сообщение от Jetu Посмотреть сообщение
Ну я нахожу нужное мне окно, делаю его активным, ищу, есть ли там элемент класса "Tbutton", если есть, то нажимаем кнопку дескриптор которой равен 0x0044078C
Прочитайте описание сообщений WM_LBUTTONDOWN[UP], параметр lParam - это не дескриптор.
1
27.10.2012, 15:31
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2012, 15:31
Помогаю со студенческими работами здесь

Изменить раскладку клавиатуры в чужом приложении
Мне нужно изменить в чужом приложение раскладку клавиатуры на английскую. В гугле ничего полезного...

Программный клик мыши в чужом, свернутом приложении
Искал в интернете, но ничего подходящего не нашел. Нужно программно кликнуть ЛКМ в сторонней...

Нажатие на кнопку в чужом приложении
Всем доброго времени суток. Мне нужно нажать на кнопку в чужом приложении и вставить текст в поле....

Эмуляция нажатия клавиши в чужом приложении
Знаю что это можно сделать используя SendKeys.SendWait или PostMessage сделал и так и так...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

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