Форум программистов, компьютерный форум, киберфорум
Visual Basic .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.60/35: Рейтинг темы: голосов - 35, средняя оценка - 4.60
2 / 2 / 0
Регистрация: 28.07.2015
Сообщений: 16
.NET 2.x

Клик мышью в фоновом приложении

16.03.2016, 13:02. Показов 8116. Ответов 23
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток товарищи друзья.
Возник вопрос - как нажать на определенное место в другой программе (послать нажатие мышью).. Как разобрать калькулятор и нажать на различные кнопки - это есть в примерах. Но чтобы послать нажатие мышью - я не нашел (Возможно плохо искал). Понимаю что надо с помощью API функций делать. Но скорее всего я немного туповат чтобы сам найти решение, поэтому прошу у Вас помощи в этом.
Если можно - кодом поделитесь И сразу второй вопрос: Как получить координаты клика на на чужой форме? Спасибо за внимание. Если что то не корректно написал - сильно не ругайтесь пожалуйста... Спасибо заранее...
1
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.03.2016, 13:02
Ответы с готовыми решениями:

Как эмулировать клик мышью
Как эмулировать клик мышью?

Клик мышью "сквозь" форму
Всем доброго утра! Вчера скачал прогу AClok - часы, написаны на vb.net и c#. Выбираешь функцию прозрачны для мыши и можно кликать сквозь...

Клик мышью
Собственно написал программу (на форме по паре Label, Edit, Button и RadioButton) которая через определённое время делает клик в то место...

23
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
17.03.2016, 01:31
Студворк — интернет-сервис помощи студентам
Ох, опять все с начала
Для начала открываем блокнот, потом открываем Spy++ (Visual Studio - Сервис - Spy++) и ищем наш блокнот, видим следующее:

Наше окно, с именем "1.txt - Блокнот" и классом "Notepad". В нем два элемента, нам нужен тот, что с классом Edit (то есть, то самое текстовое поле).
Нам надо получить дескриптор окна, используем ф-цию FindWindow, ищем по классу (что-бы не напрягаться с заголовком). Далее используя ф-ю FindWindowEx - ищем дочерние элементы в этом окне, передав ей дескриптор окна и имя класса. Далее ф-й SendMessage вставляем текст, используя дескриптор который нашли и WM_SETTEXT. Вот написал пример:
VB.NET
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
Imports System.Runtime.InteropServices
 
Public Class Form1
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Shared Function FindWindow(
     ByVal lpClassName As String,
     ByVal lpWindowName As String) As IntPtr
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Shared Function FindWindowEx(ByVal parentHandle As IntPtr,
                      ByVal childAfter As IntPtr,
                      ByVal lclassName As String,
                      ByVal windowTitle As String) As IntPtr
    End Function
 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'Ищем дескриптор окна, можем искать по классу (посмотреть в Spy++), по заголовку или по тому и другому сразу.
        Dim WindowHwnd As IntPtr = FindWindow("Notepad", vbNullString)
        'Теперь надо найти наше текставое поле, тут уже используем ф-цию FindWindowEx
        'Передав ей десприптор родительского окна (которое нашли), имя класса или (и) текст (который в нем написан).
        Dim EditHwnd As IntPtr = FindWindowEx(WindowHwnd, IntPtr.Zero, "Edit", vbNullString)
        'Теперь используем ф-цию SendMessage (для улучшения читаемости, создал SendText)
        SendText.Send(EditHwnd, "TEST TEXT")
    End Sub
 
    Private Class SendText
        <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
        Private Shared Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByVal wParam As IntPtr, ByVal lParam As String) As IntPtr
        End Function
 
        Const WM_SETTEXT = &HC
 
        Public Shared Sub Send(ByVal HWND As IntPtr, ByVal Text As String)
            SendMessage(HWND, WM_SETTEXT, 0, Text)
        End Sub
    End Class
End Class
3
2 / 2 / 0
Регистрация: 28.07.2015
Сообщений: 16
17.03.2016, 08:00  [ТС]
Спасибо код работает..... получается что при посылки весь старый текст стирается и пишется новый... а мне нужно что бы текст вставлялся именно туда. куда кликнут мышью.. т.е. у меня есть целая куча текста... где курсор установлен - туда и вставить текст... т.е. получается я кликаю где то в центре мышкой и потом туда должен вставиться текст...

это получается..... мне нужно в буфер обмена скопировать текст и вставить на форму смысл такой ))))

Добавлено через 43 минуты
Вот только использовать буфер обмена не правильно Блин... тогда в самый неподходящий момент буфер обмена будет изменен
0
525 / 487 / 99
Регистрация: 25.12.2011
Сообщений: 1,176
17.03.2016, 09:15
bibika7777777, тут ничего страшного тоже нет, получаем позицию курсора, получаем весь текст, вставляем нужный текст по позиции курсора, ну и собственно записываем текст в Edit. Написал простой пример, как получить позицию курсора (iStart - начальное положение, iCount - длина):
VB.NET
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
Module Module1
 
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Function FindWindow(
     ByVal lpClassName As String,
     ByVal lpWindowName As String) As IntPtr
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Function FindWindowEx(ByVal parentHandle As IntPtr,
                      ByVal childAfter As IntPtr,
                      ByVal lclassName As String,
                      ByVal windowTitle As String) As IntPtr
    End Function
    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Auto)>
    Private Function SendMessage(ByVal hWnd As IntPtr, ByVal Msg As UInteger, ByRef wParam As IntPtr, ByRef lParam As IntPtr) As IntPtr
    End Function
 
    Const EM_GETSEL = &HB0
    Const WM_USER = &H400
    Const EM_EXGETSEL = WM_USER + 52
 
    Sub Main()
        Dim Window As IntPtr = FindWindow("Notepad", vbNullString)
        Dim Edit As IntPtr = FindWindowEx(Window, IntPtr.Zero, "Edit", vbNullString)
        Dim iStart, iCount As IntPtr
        SendMessage(Edit, EM_GETSEL, iStart, iCount)
        Console.WriteLine(iStart)
        Console.ReadLine()
    End Sub
 
End Module
P.S. Способа проще - не знаю.
1
0 / 0 / 0
Регистрация: 19.04.2016
Сообщений: 9
20.04.2016, 21:55
А можно и мне 5 копеек вставить? Не совсем в тему, больше как продолжение. Это касается написания бота для браузерной игры. Если я создам свою форму на которой помещу окно браузера (на примет awesomium) в котором будет запущена эта самая игра (flash player), насколько я понял в результате своих изысканий, при сворачивании формы окно браузера замораживается, а значит передавать туда клики мышью становиться занятием бессмысленным, так? А может есть какой-то способ разморозки или запрещения заморозки для адекватного взаимодействия со свернутым окном?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.04.2016, 21:55

Клик мышью
Привет! Помогите написать программу, которая делает определенное действие если ,я нажму на определённый объект Не могу забраться с...

Клик мышью
Есть примерно такая разметка &lt;div&gt; &lt;img src='......'&gt; &lt;canvas&gt;&lt;/canvas&gt; &lt;/div&gt; img.addEventListener('click',...

Расчет времени в фоновом приложении на Android
Создал на юнити таймер, который сигналит каждый пройденный цикл заданного времени и уведомление выводит, думал сделать его фоновым...

Клик мышью по координатам
Здравствуйте, прочитал статьи по эмуляции клика и такое впечатления, что у все все работает кроме меня) В общем создал на форме 2 кнопки,...

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


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

Или воспользуйтесь поиском по форуму:
24
Ответ Создать тему
Новые блоги и статьи
Саморегулирующийся социальный контракт для сервера cross-section.
Hrethgir 14.08.2026
С кодом конечно таких глубоких размышлений пока не было, впрочем я уже привык к алгоритмизации. Суть предмета записи: снова в диалоге с нейросетью (я взял пока себе ник для учётки админа - Rector). . . .
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru