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

Клик мышью через SendMessage

03.11.2014, 09:04. Показов 17039. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Дайте, пожалуйста, пример кода для эмуляции клика мышью через Send(Post)Message на C#. Точнее никак не пойму, как передавать координаты куда кликать.
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.11.2014, 09:04
Ответы с готовыми решениями:

Можно ли через SendMessage отправить клик по координатам?
Например, я знаю координаты элемента, в котором находятся кнопки, у которых нет хендла. Поэтому можно ли нажать на 20 пикселей ниже...

Клик мышью без перемещения курсора
В общем нужно кликнуть мышью по определенным координатам окна(если важно то это флэш приложение) так чтобы курсор при этом не двигался.

Dropfiles через Sendmessage и Postmessage
Есть код , кидающий на стороннюю программу файлик через событие wm_dropfiles функцией Sendmessage. Хотелось бы заменить на Postmessage, ...

6
 Аватар для NekoKira
62 / 49 / 37
Регистрация: 08.07.2012
Сообщений: 181
04.11.2014, 08:42
Передать координаты так:
C#
1
Cursor.Position = new System.Drawing.Point(10, 10);  // 10, 10 = X, Y
1
1 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 14
06.11.2014, 03:49  [ТС]
Эххх... Так у меня сейчас сделано, правда через mouse_event. Но суть та же - получается эмулировать клик только по окну, которое полностью находится на экране. А если хочется кликать по частично скрытому окну...?
0
 Аватар для NekoKira
62 / 49 / 37
Регистрация: 08.07.2012
Сообщений: 181
06.11.2014, 07:00
Тут помочь не могу...
Может опишите свою идею и попробуем найти другой выход?
В какой программе нужно сделать клик и что должно произойти?
0
20 / 20 / 6
Регистрация: 18.07.2014
Сообщений: 73
06.11.2014, 15:21
Возможно не совсем понял суть задачи.... посему выдернул код из своего недавнешнего проекта думаю пригодится
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
        /* клик мышкой по координатам */
        public void ClickToCoordinate(IntPtr handle, int x, int y)
        {
            SendMessage(handle, WM_LBUTTONDOWN, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
            SendMessage(handle, WM_LBUTTONUP, IntPtr.Zero, new IntPtr(y * 0x10000 + x));
        }
 
        /* клик левой клавишей мыши по координатам */
        public void ClickMouseLeft(IntPtr handle, int x, int y)
        {
            SendMessage(handle, WM_LBUTTONDBLCLK, 0, (y * 0x10000 + x));
        }
 
        /* эмуляция нажатия кнопки */
        public void PressButton(IntPtr hHandle)
        {
            SendMessage(hHandle, BM_CLICK, (IntPtr)1, (IntPtr)0);
        }
 
        /* эмуляция клика по любому контролу */
        public void ClickToControl(IntPtr hHandle)
        {
            SendMessage(hHandle, WM_LBUTTONDOWN, (IntPtr)1, (IntPtr)0);
            SendMessage(hHandle, WM_LBUTTONUP, (IntPtr)0, (IntPtr)0);
        }
Соответственно всё это можешь сделать и через Post

Добавлено через 7 минут
Забыл вдруг кто не знает или будет мучиться посему допишу

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
  using System.Runtime.InteropServices;      
[DllImport("user32.dll", CharSet = CharSet.Auto)]
        public static extern int SendMessage(IntPtr hwnd, int wMsg, IntPtr wParam, IntPtr lParam);
 
        const int
            WM_LBUTTONDOWN = 513,
            WM_LBUTTONUP = 514,
            WM_RBUTTONDOWN = 0x0204,
            WM_RBUTTONUP = 0x0205,
            WM_KEYDOWN = 256,
            WM_CHAR = 258,
            WM_KEYUP = 257,
            WM_SETFOCUS = 7,
            WM_SYSCOMMAND = 274,
            WM_GETTEXT = 0x000D,
            WM_GETTEXTLENGTH = 0x000E,
            WM_CLEAR = 0x303,
            WM_PAINT = 15,
            WM_SETCURSOR = 32,
            WM_KILLFOCUS = 8,
            WM_NCHITTEST = 132,
            WM_USER = 1024,
            WM_MOUSEACTIVATE = 33,
            WM_MOUSEMOVE = 512,
            WM_LBUTTONDBLCLK = 515,
            WM_COMMAND = 273,
            VK_DOWN = 0x28,
            VK_RETURN = 0x0D,            
            BM_SETSTATE = 243,
            BM_CLICK = 0x00F5,
            SW_HIDE = 0,
            SW_MAXIMIZE = 3,
            SW_MINIMIZE = 6,
            SW_RESTORE = 9,
            SW_SHOW = 5,
            SW_SHOWDEFAULT = 10,
            SW_SHOWMAXIMIZED = 3,
            SW_SHOWMINIMIZED = 2,
            SW_SHOWMINNOACTIVE = 7,
            SW_SHOWNA = 8,
            SW_SHOWNOACTIVATE = 4,
            SW_SHOWNORMAL = 1,
            SC_MINIMIZE = 32,
            EM_SETSEL = 0x00B1,
            CAPACITY = 256,
            CB_SETCURSEL = 0x014E;
3
1 / 1 / 1
Регистрация: 28.10.2014
Сообщений: 14
07.11.2014, 12:51  [ТС]
Лучший ответ Сообщение было отмечено tezaurismosis как решение

Решение

Цитата Сообщение от NekoKira Посмотреть сообщение
Может опишите свою идею и попробуем найти другой выход?
Делаю авторегистратор для Pokerstars. На данній момент по-прежнему так вот кликаю:

C#
1
2
3
4
5
6
7
public static void LeftMouseClick(Point point)
        {
            cursorOldPosition = Cursor.Position;
            Cursor.Position = point;
            mouse_event(MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP, point.X, point.Y, 0, 0);
            Cursor.Position = cursorOldPosition;
        }
Но как писал выше - работать работает, но не удобно, когда всё окно, по которому кликаем, должно находиться в пределах экрана. Как я уже понял, сразу кликать по контролу через сообщение не получится, нужно отправлять сообщение непосредственно контролу.

Сделал через BM_CLICK, нахожу контрол кнопки "регистрация" и отправляю:
C#
1
SendMessage(t, (int)0x00F5, IntPtr.Zero, IntPtr.Zero);
C простой формой, созданной самостоятельно аналогичній код работает, тут нет. Прочитал в инете, опять же, что не все контролы могут воспринимать BM_CLICK. Нашёл совет, что отправлять главному окну сообщение BN_CLICK, но там пока не могу разобраться с lParam и wParam - как их находить и как их составлять. Да и
C#
1
GetDlgCtrlID(hBtn);
всё равно почему-то возвращает ноль.

C#
1
2
SendMessage(hBtn, (int)0x201, (IntPtr)1, IntPtr.Zero);
SendMessage(hBtn, (int)0x202, IntPtr.Zero, IntPtr.Zero);
Тоже работает с простой формой, но не работает с нужной кнопкой на нужном окне. То, что получаю ID именно нужного контрола уверен на 100%:

C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IntPtr mWnd = FindWindow(null, "PokerStars Lobby");
            IntPtr hBtn = IntPtr.Zero;
            do
            {
                hBtn = FindWindowEx(mWnd, t, null, null);
                if ((GetText(hBtn) == "Register")&&IsWindowVisible(t))
                {
                    SetActiveWindow(hBtn);
                    int tid = GetDlgCtrlID(t);
                    //SendMessage(hBtn, (int)0x00F5, IntPtr.Zero, IntPtr.Zero); // BM_CLICK
                    //SendMessage(mWnd, (int)0x0111, (IntPtr)((BN_CLICKED << 16) | ID_OK), hBtn); // BN_CLICK
                    //SendMessage(hBtn, (int)0x201, (IntPtr)1, IntPtr.Zero); // mouse
                    //SendMessage(hBtn, (int)0x202, IntPtr.Zero, IntPtr.Zero);
                }
            } while (t != IntPtr.Zero);
под комментами тут ещё раз оставил свои попытки как-то заставить её работать, и ещё больше просто стёр.

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

Добавлено через 17 минут
Уже написал большущий пост с описанием всех своих попыток, словесно и кодом, но неожиданно нашёлся выход. Нашёл AHK скрипт, который кто-то делал для сходных с моими задач, и там на кнопку отправляют сообщение пробела Почти без надежды написал:

C#
1
2
SendMessage(t, (int)0x100, (IntPtr)0x20, IntPtr.Zero);
SendMessage(t, (int)0x101, (IntPtr)0x20, IntPtr.Zero);
и оно сработало! Ни энтер, ни события мыши, ни системные сообщения типа BM_CLICK кнопочка не воспринимала, хотя созданная рядом форма с одной кнопкой прекрасно всё ловила. В общем вот так с подковыркой оказалось решение, но теперь проблема решена. Спасибо всем!
1
 Аватар для NekoKira
62 / 49 / 37
Регистрация: 08.07.2012
Сообщений: 181
07.11.2014, 12:57
flashyua, рад что у Вас всё получилось!)
Хорошо всё расписали, за это отдельный плюс!))
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
07.11.2014, 12:57
Помогаю со студенческими работами здесь

Отправка сообщения через SendMessage
Здравствуйте,помогите пожалуйста с SendMessage,мне нужно отправить сообщение из моего textbox в textbox другого приложения,подскажите как...

Отправка текста через SendMessage
Как отправить текст не в заголовок а в основную часть блокнота??? Если для отправки в заголовок я использую: Использую импорты и...

Создания события, разделяющего правый и левый клик мышью
при динамическом создании PictureBox я добавлял события ImageBox.Click += frm.MyClick; которое реагирует как на левый, так и на правый клик...

Как нарисовать круг в месте, где произошел клик мышью
тоесть, задание такое: каждый раз, когда я кликаю по форме мышкой, в этом месте рисуется круг. и так пока не наберется 12 кружнов. в каждый...

Перемещение мыши через sendmessage
Нужно эмулировать перемещение курсора с зажатой левой кнопкой мыши внутри окна, при этом курсор на экране двигаться не должен. public...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru