Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/49: Рейтинг темы: голосов - 49, средняя оценка - 4.88
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25

управление другим приложением

01.11.2010, 18:44. Показов 9998. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть flash приложение в окне браузера (допустим webBrowser на форме). Так вот... програмно нажать кнопку в этом приложении?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
01.11.2010, 18:44
Ответы с готовыми решениями:

Связь с другим приложением
Здравствуйте! Подскажите, пожалуйста, по следующему вопросу: Есть обычное приложение на C#. Через класс Process инициирую запуск...

Служба, которая следит за другим приложением
Добрый день ! Помогите советом. У меня есть приложение WinForms которое тянет данные из другой программы и должно постоянно работать....

Получить в своем приложении, ошибку выдаваемую другим приложением
Добрый день! Суть проблемы в следующем, есть 1 приложение, оно запускает другое через Precess.Start();, вызываемое предложение может...

15
0 / 0 / 0
Регистрация: 13.02.2010
Сообщений: 22
01.11.2010, 19:42
Цитата Сообщение от _man_ Посмотреть сообщение
Есть flash приложение в окне браузера (допустим webBrowser на форме). Так вот... програмно нажать кнопку в этом приложении?
так как в другом приложении браузер то на мой взлгяд это не возможно так как когда браузер формирует страницу он не создает кнопки и остальное как отдельные формы (то есть они не имеют Handle)
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
01.11.2010, 20:02  [ТС]
тогда другой вопрос. Пока искал по форуму, нашел вот такой код для програмного нажатия кнопок внутри другого окна.

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
    public static class NativeMethods
    {
        [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        static extern int SendMessage(IntPtr hWnd, int Msg, int wParam, int lParam);
 
        static int GetWParamFromButton(MouseButton btn)
        {
            switch (btn)
            {
                case MouseButton.Left: return 0x0001;
                case MouseButton.Middle: return 0x0010;
                case MouseButton.Right: return 0x0002;
                default: throw new Win32Exception("Невозможно преобразовать значение!");
            }
        }
        /// <summary>
        /// Эмуляция нажатия и отпускания кнопок мыши.
        /// </summary>
        /// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
        /// <param name="btn">Кнопка мыши.</param>
        /// <param name="x">Координата X (относительно экрана).</param>
        /// <param name="y">Координата  Y (относительно экрана).</param>
        public static void MouseClick(IntPtr hWnd, MouseButton btn, int x, int y)
        {
            int xyPoint = NativeMacros.MAKELONG(x, y);
            int wParam = GetWParamFromButton(btn);
 
            SendMessage(hWnd, (int)btn, wParam, xyPoint);
            SendMessage(hWnd, (int)btn + 1, wParam, xyPoint);
        }
        /// <summary>
        /// Эмуляция нажатия кнопок мыши.
        /// </summary>
        /// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
        /// <param name="btn">Кнопка мыши.</param>
        /// <param name="x">Координата X (относительно экрана).</param>
        /// <param name="y">Координата  Y (относительно экрана).</param>
        /// <returns>Возвращает результат работы функции SendMessage.</returns>
        public static int MouseDown(IntPtr hWnd, MouseButton btn, int x, int y)
        {
            int xyPoint = NativeMacros.MAKELONG(x, y);
            int wParam = GetWParamFromButton(btn);
 
            return SendMessage(hWnd, (int)btn, wParam, xyPoint);
        }
        /// <summary>
        /// Эмуляция отпускания кнопок мыши.
        /// </summary>
        /// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
        /// <param name="btn">Кнопка мыши.</param>
        /// <param name="x">Координата X (относительно экрана).</param>
        /// <param name="y">Координата  Y (относительно экрана).</param>
        /// <returns>Возвращает результат работы функции SendMessage.</returns>
        public static int MouseUp(IntPtr hWnd, MouseButton btn, int x, int y)
        {
            int xyPoint = NativeMacros.MAKELONG(x, y);
            int wParam = GetWParamFromButton(btn);
 
            return SendMessage(hWnd, (int)btn + 1, wParam, xyPoint);
        }
        /// <summary>
        /// Нажатие или отпускание определенной клавиши клавиатуры.
        /// </summary>
        /// <param name="hWnd">Дескриптор окна в которое будет послано сообщение.</param>
        /// <param name="keys">Клавиша.</param>
        /// <param name="up">FALSE если кнопка нажата, иначе TRUE.</param>
        /// <returns>Возвращает результат работы функции SendMessage.</returns>
        public static int KeyPress(IntPtr hWnd, Keys keys, bool up)
        {
            int WM_KEY = up ? 0x0101 /* WM_KEYUP */ : 0x0100 /* WM_KEYDOWN */;
 
            return SendMessage(hWnd, WM_KEY, (int)keys, 0);
        }
    }
 
    public struct NativeMacros
    {
        /// <summary>
        /// C++ макрос для GET_X_LPARAM.
        /// </summary>
        public static int GET_X_LPARAM(int x)
        {
            return x & 0xffff;
        }
        /// <summary>
        /// C++ макрос для GET_Y_LPARAM.
        /// </summary>
        public static int GET_Y_LPARAM(int x)
        {
            return (x >> 16) & 0xffff;
        }
        /// <summary>
        /// C++ макрос для MAKELONG.
        /// </summary>
        public static int MAKELONG(int x, int y)
        {
            return (x & 0xffff) | ((y & 0xffff) << 16);
        }
    }
 
    public enum MouseButton : int
    {
        Left = 0x201, // WM_LBUTTONDOWN
        Right = 0x204, // WM_RBUTTONDOWN
        Middle = 0x207 // WM_MBUTTONDOWN
    }
Попытался использовать этот класс в своем коде. Создал батон, при нажатии на который в браузере Opera должна нажиматься кнопка Меню (сверху слева).

C#
1
2
IntPtr wnd = FindWindow("OperaWindowClass", "Эксперсс-панель - Opera");
NativeMethods.MouseClick(wnd, MouseButton.Left, 2, 4);
Но в Опере ничего не происходит. В чем может быть проблема?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.11.2010, 21:19

Не по теме:

Всё таки надо было тогда писать комменты...


Во первых не факт что опера вообще обработает посланные ей сообщения.
Во 2х шанс что этот код заработает на флеш --> 0.
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
01.11.2010, 21:25  [ТС]
про комменты не понял смысл.
Мысль была друга, просто "вручную" узнать положение нужной мне кнопки на экране и в браузер програмно щелкнуть мышью в этой области, поэтому вроде как флеш тут и не будет задействован.
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.11.2010, 21:35
Не знаю на счет флеша, но на кнопку нажимает, бери координаты не относительно экрана [37, 15].

Не по теме:

Этот код я писал, и надо было добавить что работать он будет не всегда...


з.ы. На кнопки внутри html страниц тоже нажимает...
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
01.11.2010, 22:29  [ТС]
бери координаты не относительно экрана [37, 15].
а относительно чего тогда, как не экрана?) если брать как окна-то же самое

попытался с Блокнотом провернуть, по типу того что курсор переместился бы в другую часть текста-тоже не получилось. Мне кажется проблема в дескрипторе окна, да? Есть идеи какие нибудь как исправить?
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.11.2010, 22:33
Цитата Сообщение от _man_ Посмотреть сообщение
а относительно чего тогда, как не экрана?
Относительно элемента, хендл которого ты используешь. У textbox'а в Notepad'е хендл отличается от основного окна, что бы его найти надо использовать FindWindowEx либо EnumChildWindows.

В этом минус данного метода, потому-что, что бы послать сообщение, надо знать точный адрес получателя
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
01.11.2010, 23:19  [ТС]
а какие еще варианты есть??))
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
01.11.2010, 23:55
Можно попробовать SendInput, там не требуется хендл.

Добавлено через 11 минут
... но требуется активное окно.
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
02.11.2010, 01:09  [ТС]
все-таки переборол я эти хендлеры окна) нашел программу Window Scanner (http://um-razum.ru/WindowScanner.zip), она при наведении на любое окно показывает имя окна, имя класса и дескриптор. Посмотрел дескриптор блокнота и его имя окна и написал вот такой код
C#
1
NativeMethods.MouseClick((IntPtr) 394540, MouseButton.Left, 50, 50);
Где 394540 - дескриптор окна блокнота.
Всё работает теперь. Спасибо за помощь)

Добавлено через 23 минуты
Рано обрадовался... Браузеры не хотят реагировать на посылаемые сообщения. В чем подвох? с блокнотом работает, а с Оперой, ИЕ, Хромом не хочет...
0
Почетный модератор
Эксперт .NET
 Аватар для NickoTin
8726 / 3678 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.11.2010, 01:20
Цитата Сообщение от _man_ Посмотреть сообщение
нашел программу Window Scanner
Стандартно с Visual Studio идет Spy++ для этого дела
Цитата Сообщение от _man_ Посмотреть сообщение
Браузеры не хотят реагировать на посылаемые сообщения
В том то и дело, это браузеры. Все элементы находящиеся в них (там где отображается страница) не являются окнами.

Но (!) если использовать MouseClick для нажатия на ссылку, когда появляется страница о том что сайт не доступен, то сообщение проходит (оно в любом случае проходит) и браузер его обрабатывает и пытается заново загрузить страницу (Opera по крайней мере).
0
45 / 45 / 5
Регистрация: 04.01.2010
Сообщений: 337
02.11.2010, 07:30
если найдёте рабочее решение то мне то же интересно ) хотелось бы сделать бота для фермера )
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
02.11.2010, 14:39  [ТС]
получилось отправить сообщение браузеру только если кинуть на форму webBrower и уже ему посылать... только почему когда окно свернуто форма не принимает сообщения? А если развернуть-все снова работает.
0
90 / 89 / 13
Регистрация: 28.09.2010
Сообщений: 262
02.11.2010, 18:34
Не проще ли изучить протокол обмена и создать бота на WebRequest?
0
2 / 2 / 1
Регистрация: 04.08.2010
Сообщений: 25
02.11.2010, 21:08  [ТС]
вооот это уже интересно) можно конкретно ссылочку куда копать, просто по запросу "протокол обмена" можно много чего левого найти
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
02.11.2010, 21:08
Помогаю со студенческими работами здесь

Управление приложением на Flash
Здравствуйте. Есть игра на Flash. Возможно ли хоть как-то имитировать ходы в этой игре с помощью C#? Заранее благодарен.

Управление приложением другого ПК
Доброго времени суток! На одном компе у меня лежит программа (сделанная мною на C#). Мне надо как-то открыть эту программу с другого...

Управление приложением через VBA
Здравствуйте! Имеется приложение на C#, VS2010. Существует ли способ добавить в него поддержку VBA, чтобы при помощи макросов управлять...

Управление приложением через веб-форму
В общем есть у меня одна программа на C# (WinForms), которая висит на сервере и выполняет определенные действия. Появилась необходимость...

Отслеживание изменений в БД сделанных другим приложением
Существует подключение к базе данных firebird. На форме находится dataGridView. Пользователь может изменять данные. Запущено...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru