Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.97/29: Рейтинг темы: голосов - 29, средняя оценка - 4.97
6 / 6 / 2
Регистрация: 06.03.2013
Сообщений: 79
1

Нажать кнопку в активном окне

07.03.2013, 17:47. Показов 5903. Ответов 21
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени суток!
Народ подсобите как в активном окне win нажать на кнопку? Заранее благодарствую!
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.03.2013, 17:47
Ответы с готовыми решениями:

VB 6 Как программно нажать На кнопку В окне другого приложения ?
Есть программа на ней есть Кнопка комманд баттон как на неее нажать программно ? Как я знаю надо...

Как можно нажать программно нажать на кнопку, у которой нет id?
Как можно нажать программно нажать на кнопку, у которой нет id?? В html она прописывается так: <a...

Как нажать кнопку в другой программе?
Никто не знает, как нажать кнопку в другой программе? Я знаю даже что на ней написано! ;-)

Как нажать кнопку по истечению времени?
как можно осуществить что бы после нажатия нажатия Button1 пошло время указаное в Label1 и по...

21
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
07.03.2013, 20:32 2
Лучший ответ Сообщение было отмечено The trick как решение

Решение

Цитата Сообщение от scripVB Посмотреть сообщение
как в активном окне win нажать на кнопку?
Есть как минимум 5 способов как это сделать.
Вот один из них
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, _
     ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetForegroundWindow Lib "user32" () 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
Const BM_CLICK = &HF5
' Кликаем по первой кнопке, она нажимает вторую кнопку программно.
Private Sub Command1_Click()
Ret = GetForegroundWindow()
hwndButt = FindWindowEx(Ret, ByVal 0&, vbNullString, "Command2") 'вместо Command2 написать реальный текст на кнопке!
PostMessage hwndButt, BM_CLICK, 0, 0
End Sub
 
Private Sub Command2_Click()
MsgBox "Кнопка 2 нажата"
End Sub
На форме 2 кнопки. Код моделирует нажатие второй кнопки программно, по нажатию на первую кнопку.
В реальности если ваш код должен нажать кнопку активного приложения, то это надо делать по таймеру, иначе активное приложение потеряет фокус.
2
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
11.03.2013, 14:36 3
А как поступить, если кнопка находится во фрейме. У него свой хендл.
Можно рекурсивно перебрать все элементы управления?

Вот так я правильно написал по стандарту?

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
Private Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, _
     ByVal lpClassName As String, ByVal lpWindowName 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
 
Const BM_CLICK = &HF5
 
Private Sub Command1_Click()
    Dim Hwnd&, hwndBtn&
    Hwnd = FindWindow(vbNullString, "ZTEMT UI")
    hwndBtn = FindChilds(Hwnd, vbNullString, "Отключить")
    PostMessage hwndBtn, BM_CLICK, 0&, 0
End Sub
 
Private Function FindChilds(hWndParent As Long, _
                        Optional ByVal sClass As String = vbNullString, _
                        Optional ByVal sCaption As String = vbNullString)
    Dim Hwnd As Long, HwndEx As Long
    Do
        Hwnd = FindWindowEx(hWndParent, Hwnd, vbNullString, vbNullString)
        If Hwnd <> 0 Then
            HwndEx = FindWindowEx(Hwnd, ByVal 0&, sClass, sCaption)
            If HwndEx <> 0 Then
                FindChilds = HwndEx
                'Debug.Print Hex(BtnHwnd) & ", parent: " & Hex(Hwnd)
                Exit Do
            End If
            FindChilds = FindChilds(Hwnd, sClass, sCaption)
        End If
    Loop Until Hwnd = 0
End Function
3
6 / 6 / 2
Регистрация: 06.03.2013
Сообщений: 79
13.03.2013, 00:02  [ТС] 4
благодарствую вам!
0
0 / 0 / 0
Регистрация: 03.04.2013
Сообщений: 4
04.04.2013, 11:12 5
Добрый день! У меня проблема с нажатием кнопки в диалоговом окне загрузки файла а IE8. Вылазит стандартная форма с тремя кнопками Открыть, Сохранить и Отменить. Программно получается нажать на кнопку Отменить, а на кнопки Сохранить и Открыть не получается. Хотя хендлы этих кнопок я нахожу. В чем может быть проблема? Код программы:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildAfter As Long, 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, ByVal lParam As Long) As Long
 
 
Sub knopka()
 
 
Dim HvndWin, HvndBut As Long
HvndWin = FindWindowEx(0, 0, vbNullString, "Загрузка файла")
HvndBut = FindWindowEx(HvndWin, 0, vbNullString, "Со&хранить")
'два сообщения подряд для фокуса
PostMessage HvndBut, &HF5, 0&, 0&    
PostMessage HvndBut, &HF5, 0&, 0&
 
End Sub
0
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
15.10.2015, 18:09 6
Цитата Сообщение от Dragokas Посмотреть сообщение
Вот так я правильно написал по стандарту?
Подскажите, а возможно ли реализовать поиск по маске, тоесть не частный?

В этом примере
Visual Basic
1
 Hwnd = FindWindow(vbNullString, "ZTEMT UI")
ищется окно с заголовком "ZTEMT UI"

Предположим у нас таких окон 10ток, но все они имееют общй суфикс (префикс) "ZTEMT UI"
Например
"ZTEMT UI :111"
"ZTEMT UI :112"

Причем окна не имеют "родства"
Можно ли применять FindWindow в данном случае?
0
Эксперт WindowsАвтор FAQ
17996 / 7697 / 892
Регистрация: 25.12.2011
Сообщений: 11,470
Записей в блоге: 16
15.10.2015, 18:25 7
Можно. Через EnumWindows.
Ищите. В этом разделе были примеры.
1
39 / 39 / 8
Регистрация: 15.08.2014
Сообщений: 625
15.10.2015, 19:49 8
Цитата Сообщение от Dragokas Посмотреть сообщение
Можно. Через EnumWindows.
ага спасибо...
там все просто..
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
10.05.2016, 11:28 9
Всем добрый день. Подскажите пожалуйста, мне нужно нажать на кнопку в окне. Много где искал, но эти способы почему-то у меня не работают. Например, я пытаюсь нажать на кнопку "да" в окне удаления файла, делаю так:
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
Module Осн
 
 Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
 Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer
 Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWndParent As Long, ByVal hWndChildWindow As Long, ByVal lpClassName As String, ByVal lpsWindowName As String) As Long
Const BM_CLICK = &HF5
Const WM_LBUTTONDOWN = &H201
Const WM_LBUTTONUP = &H202
Const WM_COMMAND = 273
 
 Sub закрыть_окно()
   Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "Удалить файл") 'окно находит (получается его подвинуть и т.д.)
   hwnd = FindWindowEx(hwnd, vbNull, "Button", "Д&а") 'похоже не находит кнопку "Да", текст "Д&а" нашел с помощью InqSoft Window Scanner
 
   SendMessage(hwnd, BM_CLICK, 0, 0)  '1 способ нажать (не работает)
   SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0) '2 способ нажать (не работает)
   SendMessage(hwnd, WM_LBUTTONUP, 0, 0)   
 End Sub
 
 Sub закрыть_окно_2()'пытаюсь понять как это сделать через WM_COMMAND
    Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "Удалить файл") 
   SendMessage(hwnd, WM_COMMAND, ???????, ?????) 'но что здесь писать?
 End Sub
 
End Module
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
10.05.2016, 11:58 10
Цитата Сообщение от Pabloa Посмотреть сообщение
SendMessage(hwnd, BM_CLICK, 0, 0) '1 способ нажать (не работает)
PostMessage?
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
10.05.2016, 12:32 11
Цитата Сообщение от Pro_grammer Посмотреть сообщение
PostMessage?
PostMessage(hwnd, BM_CLICK, 0, 0) тоже не работает
Пытаюсь сделать через WM_COMMAND:
SendMessage(GetParent(hWnd), WM_COMMAND, MAKEWPARAM(wId, BN_CLICKED), ???)
Но я не пойму как объявить MAKEWPARAM, как найти Id кнопки (в InqSoft Window Scanner я нашел GLW_ID, он равен 6, я, как понял, это не то) и что писать в качестве lParam?
0
Модератор
9725 / 3686 / 871
Регистрация: 22.02.2013
Сообщений: 5,531
Записей в блоге: 78
10.05.2016, 13:12 12
Обрати внимание на это:
If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail. To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.
И на это
Minimum supported client
Windows Vista [desktop apps only]
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
10.05.2016, 13:45 13
Обрати внимание на это:
If the button is in a dialog box and the dialog box is not active, the BM_CLICK message might fail. To ensure success in this situation, call the SetActiveWindow function to activate the dialog box before sending the BM_CLICK message to the button.
И на это
Minimum supported client
Windows Vista [desktop apps only]
Спасибо за ответ. Я делаю предварительно SetActiveWindow, все равно не работает:
Visual Basic
1
2
3
4
5
6
7
8
9
 Sub закрыть_окно()
   Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "Удалить файл") 
   SetActiveWindow(hwnd)
   hwnd = FindWindowEx(hwnd, vbNull, "Button", "Д&а")
   SendMessage(hwnd, BM_CLICK, 0, 0) 
   SendMessage(hwnd, WM_LBUTTONDOWN, 0, 0)
   SendMessage(hwnd, WM_LBUTTONUP, 0, 0)   
 End Sub
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
10.05.2016, 17:46 14
В продолжении моего вопроса. Я посылаю сообщение окну "Удалить файл" с помощью программы InqSoft Window Scanner и оно посылается успешно и окно закрывается
Нажать кнопку в активном окне

Но когда я делаю это программно, то не срабатывает, но и ошибки никакой не выдает
Visual Basic
1
2
3
        hwnd = FindWindow(vbNullString, "Удалить файл")
        SetActiveWindow(hwnd)
        SendMessage(hwnd, WM_COMMAND, 1, 0)
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
12.05.2016, 11:00 15
Попробовал даже приостановить программу и за это время вручную мышкой активизировать окно, но все равно не срабатывает
Visual Basic
1
2
3
4
        Sleep(10000)
        hwnd = FindWindow(vbNullString, "Удалить файл")
        SetActiveWindow(hwnd)
        SendMessage(hwnd, WM_COMMAND, 1, 0)
Вроде бы задача простая, но никак не могу понять, что я делаю не так
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.05.2016, 11:49 16
Цитата Сообщение от Pabloa Посмотреть сообщение
hwnd = FindWindowEx(hwnd, vbNull, "Button", "Д&а")
Не знаю, какая у вас система, но у меня на XP кнопка имеет имя &Да
И надо 2 раза повторить команду Клик.
Подрегулируйте мой код к ваше системе, может сработает. Обратите внимание, как правильно вызывать некоторые API
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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
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
 
Const BM_CLICK = 245
 Sub закрыть_окно()
   Dim hwnd As Long
   hwnd = FindWindow(vbNullString, "Подтверждение удаления файла")
   hwnd = FindWindowEx(hwnd, ByVal 0&, "BUTTON", "&Да")
  PostMessage hwnd, BM_CLICK, 0&, 0&
 PostMessage hwnd, BM_CLICK, 0&, 0&
    
 End Sub
Private Sub Command1_Click()
 закрыть_окно
End Sub
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
12.05.2016, 12:38 17
У меня windows 7
Имя кнопки ""Н&ет"
Нажать кнопку в активном окне


Отличие от вашего кода только в том, что так писать я не могу
Нажать кнопку в активном окне


и поэтому я пишу lParam As VariantType или lParam As Long
Получается:
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
    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 VariantType) 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
    Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, ByVal lParam As VariantType) As Long
Const BN_CLICKED = 245
Const BM_CLICK = &HF5
 
Sub закрыть_окно()
        Dim hwnd As Long
        hwnd = FindWindow(vbNullString, "Удалить файл")
       
        SetActiveWindow(hwnd) 'не работает
        SendMessage(hwnd, WM_COMMAND, 1, 0) 'не работает
        SendMessage(hwnd, WM_CLOSE, 0&, 0&) 'тоже не работает
        ' Заставляем мигнуть заголовок один раз.
        FlashWindow(hwnd, 1) ' а вот это как раз работает
 
        'все остальное не работает
        hwnd = FindWindowEx(hwnd, vbNull, "Button", "Н&ет")
 
        PostMessage(hwnd, BM_CLICK, 0&, 0&)
        PostMessage(hwnd, BM_CLICK, 0&, 0&)
        PostMessage(hwnd, BN_CLICKED, 0&, 0&)
        PostMessage(hwnd, BN_CLICKED, 0&, 0&)
 
        SendMessage(hwnd, BM_CLICK, 0&, 0&)
        SendMessage(hwnd, BM_CLICK, 0&, 0&)
 
        SendMessage(hwnd, BN_CLICKED, 0&, 0&)
        SendMessage(hwnd, BN_CLICKED, 0&, 0&)
 
        SendMessage(hwnd, WM_SETFOCUS, 0&, 0&)
        SendMessage(hwnd, WM_LBUTTONDOWN, 0&, 0&)
        SendMessage(hwnd, WM_LBUTTONUP, 0&, 0&)
End Sub
Уже и не знаю как писать, перепробовал все, что нашел в интернете
И это не только с этим окном, со всеми остальными так же.. Окно находит, а кнопку не находит
0
6804 / 2831 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
12.05.2016, 13:27 18
Цитата Сообщение от Pabloa Посмотреть сообщение
Окно находит, а кнопку не находит
Чудес не бывает! Вот прямо специально сходил к соседу, запустил свой код у него на машине с win7x64
Нажать кнопку в активном окне

Кнопка нажалась, как родная, файл улетел в корзину.
Попробуй-ка мой файлик, может он волшебный?
Вложения
Тип файла: zip Project1.zip (2.8 Кб, 28 просмотров)
1
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
12.05.2016, 15:30 19
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Кнопка нажалась, как родная, файл улетел в корзину.
Попробуй-ка мой файлик, может он волшебный?
Спасибо за ответ. Я попробовал этот код на VBA, действительно, кнопка нажалась, а вот когда тот же самый код запускаю на vb, то кнопка уже не нажимается)) мистика какая-то))
Нажать кнопку в активном окне
0
0 / 0 / 0
Регистрация: 05.10.2015
Сообщений: 11
12.05.2016, 16:02 20
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Кнопка нажалась, как родная, файл улетел в корзину.
Попробуй-ка мой файлик, может он волшебный?
И exe-шник ваш тоже работает. Но почему у меня не работает на Vb, не могу понять...
Вот здесь все работает на VBA, а на VB неправильно определяет hwnd, но и с правильным hwnd функция PostMessage не хочет работать
Нажать кнопку в активном окне
0
12.05.2016, 16:02
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.05.2016, 16:02
Помогаю со студенческими работами здесь

Как автоматически нажать кнопку на форме
Добрый день подскажите как на VB можно автоматически нажать кнопку на форме? Часть кнопки: ...

Как нажать одну и ту же кнопку в 2-10 окнах? Подробнее...
Здравствуйте. У меня есть несколько окон, в которые _OДНОВРЕМЕННО_ нужно послать клавишу ENTER....

Нажать кнопку на форме HTML через WebBrowser
Гугл ведет к VB.net Форму заполнил, а как нажать кнопку? Имя нашел, а свойство не знаю как...

Надо нажать кнопку по умолчанию в Dialog Box
Висит у меня невидимый стандартный Dialog Box (Class #32770). Надо нажать кнопку по умолчанию (а...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru