Форум программистов, компьютерный форум, киберфорум
Наши страницы

Visual Basic

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 25, средняя оценка - 4.64
chiribas
12 / 12 / 2
Регистрация: 06.05.2011
Сообщений: 250
#1

Программа управляющая другой программой - VB

28.08.2011, 20:14. Просмотров 3834. Ответов 21
Метки нет (Все метки)

Как можно сделать программу которая сможет например нажимать кнопку в другом окне или вводить текст в поле или считывать его?
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.08.2011, 20:14
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Программа управляющая другой программой (VB):

Подглядывание за другой программой - Visual Basic
Уважаеые Гуру, подскажите пожалуста, как сделать так, чтоб можно быдо брать данные из другой программы, скажем так, есть Label в нем...

Как из программы управлять другой, уже запущенной программой - Visual Basic
Добрый день всем! Просьба не пинать если эта тема уже была.. Пишу Loader на VB 6. функции: 1. Проверка путей, файлов + 1....

Перехват вывода консольного окна, запущенного другой программой - Visual Basic
Привет всем барсикам :) и заглянувшим в тему ! Есть программа, которая создает консольное окно, выполняет в нем команды и сразу...

Ошибка в MSComm: 'Oшибка : данный COM-порт уже используется другой программой.' - Visual Basic
Жизнь заставила возиться с MSComm32.ocx моя прога должна выслать в порт сигнала вызова(запроса), получить от вызываемого устройства ...

Разработать приложение, управляющая форма которого имеет нестандартный вид - Visual Basic
Разработать приложение, управляющая форма которого имеет нестандартной вид. В процессе разработки уникальной, нестандартной формы окна ...

Переходя на другой комп программа требует OCX - Visual Basic
Написал программу для базы данных. Сделал экзешник, но переходя на другой комп программа требует OCX. что делать? Заранее благодарю.

21
gaw
6616 / 1497 / 152
Регистрация: 09.01.2010
Сообщений: 4,269
28.08.2011, 22:00 #2
Цитата Сообщение от chiribas Посмотреть сообщение
Как можно сделать программу
как вариант - руками /шутка/
как то растолкуйте конкретнее задачу
какую кнопку, какое другое окно, какое поле
0
chiribas
12 / 12 / 2
Регистрация: 06.05.2011
Сообщений: 250
28.08.2011, 23:24  [ТС] #3
например у меня открыта программа БЛОКНОТ, так вот, надо сделать программу которая сама вставляет в неё текст, нажимает красный крестик и на запрос "Сохранить?" нажимает "Да".
0
Alex77755
10574 / 3171 / 517
Регистрация: 13.02.2009
Сообщений: 9,299
29.08.2011, 08:53 #4
Для начала.
Брось на форму часы Timer1 и запусти программу. Так можно печатать в блокноте


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Private Declare Function GetWindowsDirectory Lib "kernel32" Alias _
"GetWindowsDirectoryA" (ByVal lpBuffer As String, ByVal _
nSize As Long) As Long
Dim WinDir As String
 
Private Sub Form_Load()
WinDir = Space(20)
WinDir = Trim(Left(WinDir, GetWindowsDirectory(WinDir, 20)))
Timer1.Enabled = True
Timer1.Interval = 200
Call Shell(WinDir & "\system32\notepad.exe", vbNormalFocus)
End Sub
 
Private Sub Timer1_Timer()
Dim a%
Randomize
a% = Rnd * 100 + 1
If a% < 45 Then SendKeys Chr(Rnd * 26 + vbKeyA)
If a% > 45 And a% < 70 Then SendKeys ""
If a% > 70 And a% < 80 Then SendKeys "{enter 2} Sucker?{enter}", True
If a% > 80 And a% < 93 Then SendKeys "{BS}"
If a% > 93 And a% < 99 Then SendKeys "^{BS}"
If a% > 99 Then SendKeys "+{HOME}{BS}"
End Sub
0
Ciberst
503 / 416 / 18
Регистрация: 16.12.2010
Сообщений: 939
29.08.2011, 21:58 #5
Как вариант. Мы узнает handle кнопки, и посылаем нужное сообщение этой кнопке, через WinApi
0
debiloid
0 / 0 / 0
Регистрация: 30.10.2009
Сообщений: 4
30.08.2011, 04:21 #6
Есть хэндл кнопки ("Button","Настройки") Как программно нажать-то в другой проге этут пипку?? Всю ночь уже шарюсь по инету, нигде нету вразумительного примера, каким образом можно из своей программы нажать кнопку или чекбокс в другой открытой программе... Может хоть тут помогут примером/советом?
0
Ципихович Эндрю
1356 / 314 / 16
Регистрация: 10.04.2009
Сообщений: 4,790
30.08.2011, 08:01 #7
Цитата Сообщение от Ciberst Посмотреть сообщение
Как вариант. Мы узнает handle кнопки
подскажите пжл как??
0
Pro_grammer
Модератор
6054 / 2132 / 403
Регистрация: 24.04.2011
Сообщений: 3,638
Записей в блоге: 10
30.08.2011, 09:03 #8
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
debiloid,
Ципихович Эндрю,

Ловите простой код, который нажимает кнопку "Пуск".
Описание:

Ищем главное окно программы и определяем его хендл.У нас главное окно это Shell_TrayWnd
Ищем дочернее окно, а именно кнопку "Пуск", у нас это Button
Посылаем этому окну "клик" мышки.
По образу и подобию так можно нажимать любые кнопки и переключатели, чекбоксы и т.п. дочерние окна.

Вставить этот код в новый проект:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Const BM_CLICK = 245
'Объявляем необходимые API
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As Long, ByVal hWnd2 As Long, ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Dim tWnd As Long, bWnd As Long
 
Private Sub Form_Load()
    'Ищем хендл главного окна - у нас трей
    tWnd = FindWindow("Shell_TrayWnd", vbNullString)
    'Ищем хендл дочернего окна - у нас кнопка Пуск
    bWnd = FindWindowEx(tWnd, ByVal 0&, "BUTTON", vbNullString)
    'Нажимаем на кнопку Пуск - выезжает меню!
    PostMessage bWnd, BM_CLICK, 0&, 0&
 
End Sub
После выполнения вскочит меню кнопки "Пуск"
2
Ципихович Эндрю
1356 / 314 / 16
Регистрация: 10.04.2009
Сообщений: 4,790
30.08.2011, 09:19 #9
спасибо, доходчиво
Цитата Сообщение от Pro_grammer Посмотреть сообщение
главное окно это Shell_TrayWnd
оно у всех так называется?
а у других прог как узнавать?
0
Pro_grammer
Модератор
6054 / 2132 / 403
Регистрация: 24.04.2011
Сообщений: 3,638
Записей в блоге: 10
30.08.2011, 10:25 #10
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
спасибо, доходчиво

оно у всех так называется?
а у других прог как узнавать?
Нет конечно не у всех. Я бы даже сказал наоборот - такой класс имеет только единственное окно - это трей. Класс окна может иметь различное название. Узнать его можно сторонними программами, или написать свою. Но для поиска окна можно использовать его заголовок.
Тогда вызов функции будет таким

Visual Basic
1
2
'Ищем хендл главного окна Блокнота
    tWnd = FindWindow(vbNullString, "Безымянный - Блокнот")
Для кнопки тоже можно использовать её название, а не класс. Особенно необходимо если кнопок на форме много - класс у всех будет совпадать, а вот имена обычно разные.
Имя надо писать точно так, как оно написано на окне - в этом и есть недостаток - Имя блокнота может измениться при загрузке в него файла.
1
Ципихович Эндрю
1356 / 314 / 16
Регистрация: 10.04.2009
Сообщений: 4,790
30.08.2011, 10:30 #11
Цитата Сообщение от Pro_grammer Посмотреть сообщение
tWnd = FindWindow(vbNullString, "Безымянный - Блокнот")
и
Цитата Сообщение от Pro_grammer Посмотреть сообщение
tWnd = FindWindow("Shell_TrayWnd", vbNullString)
на разных местах, ничего страшного??
0
Pro_grammer
Модератор
6054 / 2132 / 403
Регистрация: 24.04.2011
Сообщений: 3,638
Записей в блоге: 10
30.08.2011, 11:44 #12
Цитата Сообщение от Ципихович Эндрю Посмотреть сообщение
на разных местах, ничего страшного??
Именно в этом и смысл, что в разных местах. Посмотрите описание функции FindWindow, там первым параметром идет класс окна, а вторым имя окна. Если нет параметра, то нулевая стока.
1
Ципихович Эндрю
1356 / 314 / 16
Регистрация: 10.04.2009
Сообщений: 4,790
30.08.2011, 14:28 #13
спасибо, выложу тоже самое с пояснениями, в смысле если понядобится самому, знал где искать
Visual Basic
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
Option Explicit
 
'функции поиска формы, а также элемента формы
Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As Long
 
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" ( _
ByVal hWnd1 As Long, _
ByVal hWnd2 As Long, _
ByVal lpsz1 As String, _
ByVal lpsz2 As String) As Long
 
'клик - сообщение посылаемое кнопке, функция SendMessage
Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _
ByVal hwnd As Long, _
ByVal wMsg As Long, _
ByVal wParam As Long, _
lParam As Any) As Long
 
Private WndWind As Long ' Описатель окна
Private WbdButton As Long 'Описатель кнопки
 
'Для того чтобы посылать клик, нужно объявить константу
'Все константы находятся в MSDN
Const BM_CLICK = &HF5
 
Sub Нажимаем_на_кнопку_Пуск()
 
'Ищем системную панель, на которой и находится нужная кнопка
WndWind = FindWindow("Shell_TrayWnd", vbNullString)
'Ищем кнопку на панели
WbdButton = FindWindowEx(WndWind, 0, "Button", vbNullString)
'Здесь нули, так как wMsg и wParam для клика не нужны
Call SendMessage(WbdButton, BM_CLICK, 0, 0)
 
End Sub
'Все константы находятся в MSDN - есть ссылка где??
подскажите открыл пуск как пройтись по всем пунктам меню пуск??

Добавлено через 1 час 40 минут
тут ещё пример нашёл в сети, ищет окно. Пробую на блокноте

Visual Basic
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
'GW_CHILD — Возвращает дескриптор дочернего (подчинённого) окна, находящегося в верхней позиции Z-упорядочивания. В случае, если окно не имеет дочерних окон, возвращается 0.
'GW_HWNDFIRST — Возвращает дескриптор окна, находящегося в верхней позиции Z-упорядочивания того же уровня, что и исходное окно.
'Const GW_HWNDFIRST = 0
'GW_HWNDLAST — Возвращает дескриптор окна, находящегося в нижней позиции Z-упорядочивания того же уровня, что и исходное окно.
'GW_HWNDNEXT — Возвращает дескриптор окна, находящегося в следующей позиции Z-упорядочивания того же уровня, что и исходное окно.
'Const GW_HWNDNEXT = 2
'GW_HWNDPREV — Возвращает дескриптор окна, находящегося в предыдущей позиции Z-упорядочивания того же уровня, что и исходное окно.
'GW_OWNER — Возвращает дескриптор окна владельца исходного окна. Если окно имеет нулевой уровень вложенности, возвращается 0.
 
Option Explicit
 
Private Declare Function GetWindowTextLength Lib "user32" Alias "GetWindowTextLengthA" ( _
ByVal hWnd As Long) As Long
 
Private Declare Function GetWindow Lib "user32" ( _
ByVal hWnd As Long, _
ByVal wCmd As Long) As Long
 
Private Declare Function GetParent Lib "user32" ( _
ByVal hWnd As Long) As Long
 
Private Declare Function GetWindowText Lib "user32" Alias "GetWindowTextA" ( _
ByVal hWnd As Long, _
ByVal lpString As String, _
ByVal cch As Long) As Long
 
Const GW_HWNDFIRST = 0
Const GW_HWNDNEXT = 2
'
 
Public Function FindWindowByString( _
hWnd As Long, _
strCaption As String) As Long
 
Dim CurrWnd As Long
Dim Length As Long
Dim TaskName As String
Dim parent As Long
CurrWnd = GetWindow(hWnd, GW_HWNDFIRST)
 
While CurrWnd <> 0
parent = GetParent(CurrWnd)
Length = GetWindowTextLength(CurrWnd)
TaskName = Space$(Length + 1)
Length = GetWindowText(CurrWnd, TaskName, Length + 1)
TaskName = Left$(TaskName, Len(TaskName) - 1)
If Length > 0 Then
TaskName = LCase(TaskName)
strCaption = LCase(strCaption)
If InStr(1, TaskName, strCaption) > 0 Then
FindWindowByString = CurrWnd
Exit Function
End If
End If
CurrWnd = GetWindow(CurrWnd, GW_HWNDNEXT)
DoEvents
Wend
 
End Function
 
Sub Окно()
 
'***************************************
'*  Находит окно в заголовке которого  *
'*  есть заданная строка               *
'***************************************
 
Dim hWnd As Long
Dim strCaption As String
strCaption = "Блокнот"
FindWindowByString hWnd, strCaption
 
End Sub
Нифина не находит, почему не подскажите??
0
debiloid
0 / 0 / 0
Регистрация: 30.10.2009
Сообщений: 4
31.08.2011, 00:55 #14
Pro_grammer респект тебе дружище! Наконец я надыбал это гребаный код. Все работает на ура! Спасибо.
0
rempaul
1 / 1 / 0
Регистрация: 28.02.2014
Сообщений: 43
09.03.2014, 00:31 #15
Возможно не в тему. Как правильно прописать ожидание открытия дочернего окна с помощью FindWindow ? Идет эмуляция клавиш в сторонней программе и вызов диалогового окна, на его открытие уходит некоторое время, из-за чего дальнейшие команды этому окну не передаются....
0
09.03.2014, 00:31
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.03.2014, 00:31
Привет! Вот еще темы с ответами:

Программа для копирования БД с одного сервера на другой - Visual Basic
Здравствуйте Такая ситуация. Зделан скрипт на SQL для создания структуры БД (таблици, ключи, связи). Текста на 255 кбайт. Подскажите...

Как сделать что бы программа которую я пишу редактировала другой файл - Visual Basic
Здравствуйте,как сделать что бы когда человек пишет в Textbox то то что он написал программа редактировала одну строку в блокноте

Есть программа,нужно ввод осуществить через массив text box , вывод на другой форме - Visual Basic
В данной программе ввода нет,а массив создается в коде,вывод через Print. Нужно на форме создать массив Text Box для ввода,а вывод...

Программа управляющая другой программой.... - C++
Здраствуйте многоуважаемые форумчане, помогите мне пожалуйста одолеть такую программу: Есть программка, называеца Tuner tools, которая...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru