Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22

Имитация кликов мышки в нескольких приложениях

18.07.2012, 17:39. Показов 8669. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!!!

Есть несколько окон(от 2х до 4х) в которых запущено одно и тоже приложение (игра, ворд, огнелис не важно). Нужно одновременно выполнять в них имитацию кликов мышки по координатам этих приложений!
После гугления нашел несколько статей, но во всех показывается как работать только с одним свёрнутым окном, а как это будет выглядеть для нескольких окон, и будет ли свободны движения мыши на основном экране!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
18.07.2012, 17:39
Ответы с готовыми решениями:

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

Имитация нажатия клавиш и кликов глобально
можно ли средствами NET сэмулировать события мыши и клавиатуры вообще а не только для формы. например OnMouseClick для рабочего стола?

Имитация кликов мышки в игре
Суть вот в чем...хочу написать программу которая бы имитировала нажатие мышки... Я играю в Дьябло 2. После прохождения второй сложности...

15
 Аватар для nio
6050 / 3460 / 336
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
18.07.2012, 18:06
det20002000, имея хендлы окон перебираешь их в цикле и имитируешь нужные клики. Либо для каждого хендла, запускаешь отдельный поток для имитации.
Цитата Сообщение от det20002000 Посмотреть сообщение
будет ли свободны движения мыши на основном экране
а это зависит от используемого приложения и мощности твоего компа. Немногие аппараты выдержат активное поведение нескольких десятков приложений
1
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
18.07.2012, 18:29  [ТС]
т.е. можно создать массив из hwd, или вручную их перечислять типа
hwnd1
{}
...
hwndi-ое
{}

и в каждом цикле передавать действия мыши!

Добавлено через 16 минут
и ещё вопрос! Как сделать скрин-шот содержимого свёрнутого окна! и каким образом отследить изменить изменение цвета пикселя в свёрнутом приложении!
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
19.07.2012, 00:51
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
public static Bitmap GetWindowBMP(IntPtr hwnd)
        {
            IntPtr windowDC = user32.GetWindowDC(hwnd);
            RECT wndRect = new RECT();
            RECT cltRect = new RECT();
            user32.GetWindowRect(hwnd, ref wndRect);
            user32.GetClientRect(hwnd, out cltRect);
            POINT point = new POINT(cltRect.Location.X, cltRect.Location.X);
            user32.ClientToScreen(hwnd, out point);
            IntPtr hDC = gdi32.CreateCompatibleDC(windowDC);
            IntPtr hObject = gdi32.CreateCompatibleBitmap(windowDC, wndRect.Width, wndRect.Height);
            IntPtr ptr4 = gdi32.SelectObject(hDC, hObject);
            user32.PrintWindow(hwnd, hDC, 0);
            IntPtr ptr5 = gdi32.CreateCompatibleDC(windowDC);
            IntPtr ptr6 = gdi32.CreateCompatibleBitmap(windowDC, cltRect.Width, cltRect.Height);
            IntPtr ptr7 = gdi32.SelectObject(ptr5, ptr6);
            gdi32.BitBlt(ptr5, 0, 0, cltRect.Width, cltRect.Height, hDC, point.X - wndRect.Location.X, point.Y - wndRect.Location.Y, TernaryRasterOperations.SRCCOPY);
            Bitmap bmp = Bitmap.FromHbitmap(ptr6);
            gdi32.SelectObject(hDC, ptr4);
            gdi32.SelectObject(ptr5, ptr7);
            gdi32.DeleteDC(hDC);
            gdi32.DeleteDC(ptr5);
            gdi32.DeleteObject(hObject);
            gdi32.DeleteObject(ptr6);
            user32.ReleaseDC(hwnd, windowDC);
            return bmp;
- скрин не зависимо от фокуса и статуса окна. Но, для фулл скрин режимов Direct3D будет черный снимок - нужно делать иньекцию и фоткать средствами DirectX
P/S gdi32,user32 - это мои классы импорта API-шных функций.
2
28 / 28 / 11
Регистрация: 08.08.2011
Сообщений: 1,173
19.07.2012, 11:27
Для имитации кликов мышки, нажатий клавиатуры очень советую AutoIt.
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
20.07.2012, 10:31  [ТС]
Использовал! Но как он будет себя вести в свёрнутых окнах, т.е. возможна ли привязка его к конкретному процессу, или тогда лучше использовать его библиотеку в проекте!
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
20.07.2012, 14:06
Даже если послать сообщение клика на конкретное свернутое окно, то какие будут координаты клика ? - свернутое окно имеет размеры иконки.
Ну а в общем:
PostMessaage - WM_LBUTTONDOWN,WM_LBUTTONUP
lparam,wparam - координаты клика.
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
20.07.2012, 15:11  [ТС]
Угумс, буду пробовать)
0
68 / 60 / 18
Регистрация: 03.12.2010
Сообщений: 365
21.07.2012, 15:55
а может есть у кого готовый код автокликера хотябы для одного окна?

а то мне очень срочно нужен)))) для одной игры))) чтобы я не кликал мышкой, а за меня это делала прога)))))
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
21.07.2012, 16:53  [ТС]
AutoIT в помосчь! Там есть утилитка, которая сама тебе скрипт пишет, потом загоняешь его в бесконечный цикл и усё))
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
21.07.2012, 17:01
какая я игра то хоть ?
C#
1
2
3
4
5
6
            POINT ClientLeftTop;
            user32.ClientToScreen(hwnd, out ClientLeftTop);
            user32.SetCursorPos(ClientLeftTop.X + X, ClientLeftTop.Y + Y);
            user32.mouse_event((uint)WinApi.Enums.MouseEventFlags.LEFTDOWN, 0, 0, 0, 0);
            System.Threading.Thread.Sleep(Delay);
            user32.mouse_event((uint)WinApi.Enums.MouseEventFlags.LEFTUP, 0, 0, 0, 0);
0
106 / 18 / 5
Регистрация: 03.04.2012
Сообщений: 219
23.07.2012, 13:37
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
[DllImport("User32.dll")]
        static extern void mouse_event(int dwFlags, int dx, int dy, int dwData, int dwExtraInfo); // Для перемещения мыши
 
        [Flags]
        public enum MouseEventFlags // Флаги для манипуляции мышью
        {
            LEFTDOWN = 0x00000002,
            LEFTUP = 0x00000004,
            MIDDLEDOWN = 0x00000020,
            MIDDLEUP = 0x00000040,
            MOVE = 0x00000001,
            ABSOLUTE = 0x00008000,
            RIGHTDOWN = 0x00000008,
            RIGHTUP = 0x00000010
        };
 
Cursor.Position = new Point(X, Y); // Перемещаем курсор
mouse_event((int)(MouseEventFlags.RIGHTDOWN), Cursor.Position.X, Cursor.Position.Y, 0, 0); // Кликаем 
mouse_event((int)(MouseEventFlags.RIGHTUP), Cursor.Position.X, Cursor.Position.Y, 0, 0); // Отпускаем
P.S. Почему то не хочет кликать сразу в координатах которые я передаю, а при переводе кликает...
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
25.07.2012, 16:59  [ТС]
Игра EveOnline)))
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
30.07.2012, 15:21  [ТС]
Дошло дело до написания кода, а вот как обращаться к свёрнутому окну, не могу найти?! ХЭЛП!
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
06.08.2012, 10:33  [ТС]
Такой вот код, вроде всё нормально, но не нажимает по координатам(((

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
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;
using System.Runtime.InteropServices;
 
 
namespace WindowsFormsApplication3
{
    public partial class Form1 : Form
    {
        
        private Button button1 = new Button();
 
        public Form1()
        {
            button1.Location = new Point(10, 10);
            button1.TabIndex = 0;
            button1.Text = "Click to automate Calculator";
            button1.AutoSize = true;
            button1.Click += new EventHandler(button1_Click);
 
            this.DoubleClick += new EventHandler(Form1_DoubleClick);
            this.Controls.Add(button1);
        }
 
 
        [Flags]
        public enum WindowMessages : uint
        {
            WM_MOUSEMOVE = 0x200,
            WM_LBUTTONDOWN = 0x201,
            WM_RBUTTONDOWN = 0x204,
            WM_MBUTTONDOWN = 0x207,
            WM_LBUTTONUP = 0x202,
            WM_RBUTTONUP = 0x205,
            WM_MBUTTONUP = 0x208,
            WM_LBUTTONDBLCLK = 0x203,
            WM_RBUTTONDBLCLK = 0x206,
            WM_MBUTTONDBLCLK = 0x209,
            WM_MOUSEWHEEL = 0x020A,
            WM_KEYDOWN = 0x100,
            WM_KEYUP = 0x101,
            WM_SYSKEYDOWN = 0x104,
            WM_SYSKEYUP = 0x105,
        }
 
        // 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);
 
        [DllImport("user32.dll")]
        public static extern IntPtr SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
 
        // Send a series of key presses to the Calculator application.
        private void button1_Click(object sender, EventArgs e)
        {
            // Get a handle to the Calculator application. The window class
            // and window name were obtained using the Spy++ tool.
            IntPtr calculatorHandle = FindWindow("SciCalc","Калькулятор");
 
            // Verify that Calculator is a running process.
            if (calculatorHandle == IntPtr.Zero)
            {
                MessageBox.Show("Calculator is not running.");
                return;
            }
 
            // Make Calculator the foreground application and send it 
            // a set of calculations.
            //SetForegroundWindow(calculatorHandle);
            //SendKeys.SendWait("111");
            //SendKeys.SendWait("*");
            //SendKeys.SendWait("11");
            //SendKeys.SendWait("=");
            SendMessage(calculatorHandle, (uint) WindowMessages.WM_LBUTTONDOWN, 685, 264);
            SendMessage(calculatorHandle, (uint) WindowMessages.WM_LBUTTONUP, 685, 264);
 
        }
 
        // Send a key to the button when the user double-clicks anywhere 
        // on the form.
        private void Form1_DoubleClick(object sender, EventArgs e)
        {
            // Send the enter key to the button, which raises the click 
            // event for the button. This works because the tab stop of 
            // the button is 0.
            SendKeys.Send("{ENTER}");
        }
        }
}
В чём может быть загвоздка?
685 и 264 это координаты кнопки "5" на калькуляторе!

Добавлено через 21 час 38 минут
Может быть я не правильно sendMessage объявляю! Подскажите плз!
0
0 / 0 / 0
Регистрация: 22.03.2012
Сообщений: 22
10.08.2012, 20:22  [ТС]
апну тему! До сих пор вишу в воздухе(
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
10.08.2012, 20:22
Помогаю со студенческими работами здесь

Имитация кликов многокнопочной мыши
Подобные темы поднимались неоднократно. Но все-таки. Мои познания в программировании смешны и ограничиваются использованием нескольких...

Имитация работы мышки
Собственно, я не могу никак понять как имитировать работу мыши. Допустим задача такая: есть кнопка, с известными координатами, и нужно...

Имитация кликов, button
Доброго времени суток. Как сделать имитация примерно 10 кликов при нажатии на button. Пояснение: Когда нажимают (кликают) на button То...

Имитация кликов мыши в системе
(ищу для автоматизации действий в фоне) имитация нажатий клавиш работает наура, для теста простое окно с кнопкой на всю форму (msgbox...

Перемещение курсора мыши и имитация кликов
Всем привет. Вот что я хочу: При включении программы мышь переместилась на определённую точку монитора и кликала туда каждые минуты 3...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru